2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* INET An implementation of the TCP / IP protocol suite for the LINUX
* operating system . INET is implemented using the BSD Socket
* interface as the means of communication with the user level .
*
* HIPPI - type device handling .
*
* Version : @ ( # ) hippi . c 1.0 .0 05 / 29 / 97
*
2005-05-06 03:16:16 +04:00
* Authors : Ross Biro
2005-04-17 02:20:36 +04:00
* Fred N . van Kempen , < waltje @ uWalt . NL . Mugnet . ORG >
* Mark Evans , < evansmp @ uhura . aston . ac . uk >
* Florian La Roche , < rzsfl @ rz . uni - sb . de >
* Alan Cox , < gw4pts @ gw4pts . ampr . org >
* Jes Sorensen , < Jes . Sorensen @ cern . ch >
*/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/string.h>
# include <linux/mm.h>
# include <linux/socket.h>
# include <linux/in.h>
# include <linux/inet.h>
# include <linux/netdevice.h>
# include <linux/hippidevice.h>
# include <linux/skbuff.h>
# include <linux/errno.h>
# include <net/arp.h>
# include <net/sock.h>
2016-12-24 22:46:01 +03:00
# include <linux/uaccess.h>
2005-04-17 02:20:36 +04:00
/*
2007-02-09 17:24:24 +03:00
* Create the HIPPI MAC header for an arbitrary protocol layer
2005-04-17 02:20:36 +04:00
*
* saddr = NULL means use device source address
* daddr = NULL means leave destination address ( eg unresolved arp )
*/
static int hippi_header ( struct sk_buff * skb , struct net_device * dev ,
2007-10-09 12:40:57 +04:00
unsigned short type ,
2012-04-15 09:58:06 +04:00
const void * daddr , const void * saddr , unsigned int len )
2005-04-17 02:20:36 +04:00
{
networking: make skb_push & __skb_push return void pointers
It seems like a historic accident that these return unsigned char *,
and in many places that means casts are required, more often than not.
Make these functions return void * and remove all the casts across
the tree, adding a (u8 *) cast only where the unsigned char pointer
was used directly, all done with the following spatch:
@@
expression SKB, LEN;
typedef u8;
identifier fn = { skb_push, __skb_push, skb_push_rcsum };
@@
- *(fn(SKB, LEN))
+ *(u8 *)fn(SKB, LEN)
@@
expression E, SKB, LEN;
identifier fn = { skb_push, __skb_push, skb_push_rcsum };
type T;
@@
- E = ((T *)(fn(SKB, LEN)))
+ E = fn(SKB, LEN)
@@
expression SKB, LEN;
identifier fn = { skb_push, __skb_push, skb_push_rcsum };
@@
- fn(SKB, LEN)[0]
+ *(u8 *)fn(SKB, LEN)
Note that the last part there converts from push(...)[0] to the
more idiomatic *(u8 *)push(...).
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-06-16 15:29:23 +03:00
struct hippi_hdr * hip = skb_push ( skb , HIPPI_HLEN ) ;
2005-08-10 06:31:17 +04:00
struct hippi_cb * hcb = ( struct hippi_cb * ) skb - > cb ;
2005-04-17 02:20:36 +04:00
if ( ! len ) {
len = skb - > len - HIPPI_HLEN ;
printk ( " hippi_header(): length not supplied \n " ) ;
}
/*
* Due to the stupidity of the little endian byte - order we
* have to set the fp field this way .
*/
2007-03-26 07:11:55 +04:00
hip - > fp . fixed = htonl ( 0x04800018 ) ;
2005-04-17 02:20:36 +04:00
hip - > fp . d2_size = htonl ( len + 8 ) ;
hip - > le . fc = 0 ;
hip - > le . double_wide = 0 ; /* only HIPPI 800 for the time being */
hip - > le . message_type = 0 ; /* Data PDU */
hip - > le . dest_addr_type = 2 ; /* 12 bit SC address */
hip - > le . src_addr_type = 2 ; /* 12 bit SC address */
memcpy ( hip - > le . src_switch_addr , dev - > dev_addr + 3 , 3 ) ;
2021-11-18 23:30:45 +03:00
memset_startat ( & hip - > le , 0 , reserved ) ;
2005-04-17 02:20:36 +04:00
hip - > snap . dsap = HIPPI_EXTENDED_SAP ;
hip - > snap . ssap = HIPPI_EXTENDED_SAP ;
hip - > snap . ctrl = HIPPI_UI_CMD ;
hip - > snap . oui [ 0 ] = 0x00 ;
hip - > snap . oui [ 1 ] = 0x00 ;
hip - > snap . oui [ 2 ] = 0x00 ;
hip - > snap . ethertype = htons ( type ) ;
if ( daddr )
{
memcpy ( hip - > le . dest_switch_addr , daddr + 3 , 3 ) ;
2005-08-10 06:31:17 +04:00
memcpy ( & hcb - > ifield , daddr + 2 , 4 ) ;
2005-04-17 02:20:36 +04:00
return HIPPI_HLEN ;
}
2005-08-10 06:31:17 +04:00
hcb - > ifield = 0 ;
2005-04-17 02:20:36 +04:00
return - ( ( int ) HIPPI_HLEN ) ;
}
/*
* Determine the packet ' s protocol ID .
*/
2007-02-09 17:24:24 +03:00
2005-08-26 03:06:19 +04:00
__be16 hippi_type_trans ( struct sk_buff * skb , struct net_device * dev )
2005-04-17 02:20:36 +04:00
{
struct hippi_hdr * hip ;
2007-02-09 17:24:24 +03:00
2005-04-17 02:20:36 +04:00
/*
* This is actually wrong . . . question is if we really should
* set the raw address here .
*/
2007-03-10 16:57:13 +03:00
skb - > dev = dev ;
2007-03-20 01:30:44 +03:00
skb_reset_mac_header ( skb ) ;
2007-03-20 01:33:04 +03:00
hip = ( struct hippi_hdr * ) skb_mac_header ( skb ) ;
2007-03-10 16:57:13 +03:00
skb_pull ( skb , HIPPI_HLEN ) ;
2005-04-17 02:20:36 +04:00
/*
* No fancy promisc stuff here now .
*/
return hip - > snap . ethertype ;
}
EXPORT_SYMBOL ( hippi_type_trans ) ;
/*
* For HIPPI we will actually use the lower 4 bytes of the hardware
* address as the I - FIELD rather than the actual hardware address .
*/
2008-11-21 07:32:15 +03:00
int hippi_mac_addr ( struct net_device * dev , void * p )
2005-04-17 02:20:36 +04:00
{
struct sockaddr * addr = p ;
if ( netif_running ( dev ) )
return - EBUSY ;
2021-10-08 20:53:39 +03:00
dev_addr_set ( dev , addr - > sa_data ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2008-11-21 07:32:15 +03:00
EXPORT_SYMBOL ( hippi_mac_addr ) ;
2005-04-17 02:20:36 +04:00
2008-11-21 07:32:15 +03:00
int hippi_neigh_setup_dev ( struct net_device * dev , struct neigh_parms * p )
2005-04-17 02:20:36 +04:00
{
/* Never send broadcast/multicast ARP messages */
2014-01-09 17:13:47 +04:00
NEIGH_VAR_INIT ( p , MCAST_PROBES , 0 ) ;
2007-02-09 17:24:24 +03:00
2005-04-17 02:20:36 +04:00
/* In IPv6 unicast probes are valid even on NBMA,
* because they are encapsulated in normal IPv6 protocol .
2007-02-09 17:24:24 +03:00
* Should be a generic flag .
2005-04-17 02:20:36 +04:00
*/
if ( p - > tbl - > family ! = AF_INET6 )
2014-01-09 17:13:47 +04:00
NEIGH_VAR_INIT ( p , UCAST_PROBES , 0 ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2008-11-21 07:32:15 +03:00
EXPORT_SYMBOL ( hippi_neigh_setup_dev ) ;
2005-04-17 02:20:36 +04:00
2007-10-09 12:40:57 +04:00
static const struct header_ops hippi_header_ops = {
. create = hippi_header ,
} ;
2005-04-17 02:20:36 +04:00
static void hippi_setup ( struct net_device * dev )
{
2008-11-21 07:32:15 +03:00
dev - > header_ops = & hippi_header_ops ;
2005-04-17 02:20:36 +04:00
/*
* We don ' t support HIPPI ` ARP ' for the time being , and probably
* never will unless someone else implements it . However we
* still need a fake ARPHRD to make ifconfig and friends play ball .
*/
dev - > type = ARPHRD_HIPPI ;
dev - > hard_header_len = HIPPI_HLEN ;
dev - > mtu = 65280 ;
net: use core MTU range checking in misc drivers
firewire-net:
- set min/max_mtu
- remove fwnet_change_mtu
nes:
- set max_mtu
- clean up nes_netdev_change_mtu
xpnet:
- set min/max_mtu
- remove xpnet_dev_change_mtu
hippi:
- set min/max_mtu
- remove hippi_change_mtu
batman-adv:
- set max_mtu
- remove batadv_interface_change_mtu
- initialization is a little async, not 100% certain that max_mtu is set
in the optimal place, don't have hardware to test with
rionet:
- set min/max_mtu
- remove rionet_change_mtu
slip:
- set min/max_mtu
- streamline sl_change_mtu
um/net_kern:
- remove pointless ndo_change_mtu
hsi/clients/ssi_protocol:
- use core MTU range checking
- remove now redundant ssip_pn_set_mtu
ipoib:
- set a default max MTU value
- Note: ipoib's actual max MTU can vary, depending on if the device is in
connected mode or not, so we'll just set the max_mtu value to the max
possible, and let the ndo_change_mtu function continue to validate any new
MTU change requests with checks for CM or not. Note that ipoib has no
min_mtu set, and thus, the network core's mtu > 0 check is the only lower
bounds here.
mptlan:
- use net core MTU range checking
- remove now redundant mpt_lan_change_mtu
fddi:
- min_mtu = 21, max_mtu = 4470
- remove now redundant fddi_change_mtu (including export)
fjes:
- min_mtu = 8192, max_mtu = 65536
- The max_mtu value is actually one over IP_MAX_MTU here, but the idea is to
get past the core net MTU range checks so fjes_change_mtu can validate a
new MTU against what it supports (see fjes_support_mtu in fjes_hw.c)
hsr:
- min_mtu = 0 (calls ether_setup, max_mtu is 1500)
f_phonet:
- min_mtu = 6, max_mtu = 65541
u_ether:
- min_mtu = 14, max_mtu = 15412
phonet/pep-gprs:
- min_mtu = 576, max_mtu = 65530
- remove redundant gprs_set_mtu
CC: netdev@vger.kernel.org
CC: linux-rdma@vger.kernel.org
CC: Stefan Richter <stefanr@s5r6.in-berlin.de>
CC: Faisal Latif <faisal.latif@intel.com>
CC: linux-rdma@vger.kernel.org
CC: Cliff Whickman <cpw@sgi.com>
CC: Robin Holt <robinmholt@gmail.com>
CC: Jes Sorensen <jes@trained-monkey.org>
CC: Marek Lindner <mareklindner@neomailbox.ch>
CC: Simon Wunderlich <sw@simonwunderlich.de>
CC: Antonio Quartulli <a@unstable.cc>
CC: Sathya Prakash <sathya.prakash@broadcom.com>
CC: Chaitra P B <chaitra.basappa@broadcom.com>
CC: Suganath Prabu Subramani <suganath-prabu.subramani@broadcom.com>
CC: MPT-FusionLinux.pdl@broadcom.com
CC: Sebastian Reichel <sre@kernel.org>
CC: Felipe Balbi <balbi@kernel.org>
CC: Arvid Brodin <arvid.brodin@alten.se>
CC: Remi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-10-20 20:55:22 +03:00
dev - > min_mtu = 68 ;
dev - > max_mtu = 65280 ;
2005-04-17 02:20:36 +04:00
dev - > addr_len = HIPPI_ALEN ;
dev - > tx_queue_len = 25 /* 5 */ ;
memset ( dev - > broadcast , 0xFF , HIPPI_ALEN ) ;
/*
* HIPPI doesn ' t support broadcast + multicast and we only use
2007-02-09 17:24:24 +03:00
* static ARP tables . ARP is disabled by hippi_neigh_setup_dev .
2005-04-17 02:20:36 +04:00
*/
2007-02-09 17:24:24 +03:00
dev - > flags = 0 ;
2005-04-17 02:20:36 +04:00
}
/**
* alloc_hippi_dev - Register HIPPI device
* @ sizeof_priv : Size of additional driver - private structure to be allocated
* for this HIPPI device
*
* Fill in the fields of the device structure with HIPPI - generic values .
*
* Constructs a new net device , complete with a private data area of
* size @ sizeof_priv . A 32 - byte ( not bit ) alignment is enforced for
* this private data area .
*/
struct net_device * alloc_hippi_dev ( int sizeof_priv )
{
net: set name_assign_type in alloc_netdev()
Extend alloc_netdev{,_mq{,s}}() to take name_assign_type as argument, and convert
all users to pass NET_NAME_UNKNOWN.
Coccinelle patch:
@@
expression sizeof_priv, name, setup, txqs, rxqs, count;
@@
(
-alloc_netdev_mqs(sizeof_priv, name, setup, txqs, rxqs)
+alloc_netdev_mqs(sizeof_priv, name, NET_NAME_UNKNOWN, setup, txqs, rxqs)
|
-alloc_netdev_mq(sizeof_priv, name, setup, count)
+alloc_netdev_mq(sizeof_priv, name, NET_NAME_UNKNOWN, setup, count)
|
-alloc_netdev(sizeof_priv, name, setup)
+alloc_netdev(sizeof_priv, name, NET_NAME_UNKNOWN, setup)
)
v9: move comments here from the wrong commit
Signed-off-by: Tom Gundersen <teg@jklm.no>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-07-14 18:37:24 +04:00
return alloc_netdev ( sizeof_priv , " hip%d " , NET_NAME_UNKNOWN ,
hippi_setup ) ;
2005-04-17 02:20:36 +04:00
}
EXPORT_SYMBOL ( alloc_hippi_dev ) ;