move hardware header functions out of netdevice
Subsystems (16)
cover move hardware header functions out of netdevice
The follow patches series starts the process of moving function pointers out of network device structure. This saves space and separates code from data.
The first step is moving the functions dealing with hardware headers.
Patches are against current net-2.6.24 tree. Basic functional testing on ethernet part, not on all the other protocols affected.
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 1/3 net: wrap netdevice hardware header creation
Add inline for common usage of hardware header creation, and fix bug in IPV6 mcast where the assumption about negative return value was wrong.
Negative return from hard_header means not enough space was available, (ie -N bytes).
include/linux/netdevice.h +9 -0
@@ -778,6 +778,15 @@ extern int dev_restart(struct net_devicextern int netpoll_trap (void );#endif +static inline int dev_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +void *daddr,void *saddr,unsigned len) +{ +if (!dev->hard_header) +return 0 ; +return dev->hard_header (skb, dev, type, daddr, saddr, len); +} +typedef int gifconf_func_t (struct net_device * dev,char __user * bufptr,int len);extern int register_gifconf (unsigned int family,gifconf_func_t * gifconf);static inline int unregister_gifconf (unsigned int family)
net/ipv4/arp.c +1 -2
@@ -590,8 +590,7 @@ struct sk_buff *arp_create(int type, int/* * Fill the device header for the ARP frame */ -if (dev->hard_header && - dev->hard_header (skb,dev,ptype,dest_hw,src_hw,skb->len) <0 ) +if (dev_hard_header (skb, dev, ptype, dest_hw, src_hw, skb->len) <0 ) goto out;/*
net/core/neighbour.c +8 -9
@@ -1123,9 +1123,8 @@ int neigh_compat_output(struct sk_buff *__skb_pull (skb,skb_network_offset (skb)); -if (dev->hard_header && - dev->hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , - skb->len) <0 && +if (dev_hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , + skb->len) <0 && dev->rebuild_header (skb))return 0 ;
@@ -1152,13 +1151,13 @@ int neigh_resolve_output(struct sk_buffwrite_lock_bh (&neigh->lock);if (!dst->hh)neigh_hh_init (neigh, dst, dst->ops->protocol); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);write_unlock_bh (&neigh->lock); }else {read_lock_bh (&neigh->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);read_unlock_bh (&neigh->lock); }if (err >=0 )
@@ -1189,8 +1188,8 @@ int neigh_connected_output(struct sk_buf__skb_pull (skb,skb_network_offset (skb));read_lock_bh (&neigh->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);read_unlock_bh (&neigh->lock);if (err >=0 ) err = neigh->ops->queue_xmit (skb);
net/8021q/vlan_dev.c +6 -8
@@ -419,21 +419,19 @@ int vlan_dev_hard_header(struct sk_buffif (build_vlan_header) {/* Now make the underlying real hard header */ - rc = dev->hard_header (skb, dev,ETH_P_8021Q , daddr, saddr, len +VLAN_HLEN ); - -if (rc >0 ) { + rc =dev_hard_header (skb, dev,ETH_P_8021Q , daddr, saddr, + len +VLAN_HLEN ); +if (rc >0 ) rc +=VLAN_HLEN ; - }else if (rc <0 ) { +else if (rc <0 ) rc -=VLAN_HLEN ; - } - }else { + }else /* If here, then we'll just make a normal looking ethernet frame, * but, the hard_start_xmit method will insert the tag (it has to * be able to do this for bridged and other skbs that don't come * down the protocol stack in an orderly manner. */ - rc = dev->hard_header (skb, dev, type, daddr, saddr, len); - } + rc =dev_hard_header (skb, dev, type, daddr, saddr, len);return rc; }
net/core/netpoll.c +3 -5
@@ -415,11 +415,9 @@ static void arp_reply(struct sk_buff *sk send_skb->protocol =htons (ETH_P_ARP );/* Fill the device header for the ARP frame */ - -if (np->dev->hard_header && - np->dev->hard_header (send_skb, skb->dev, ptype, - sha, np->local_mac, - send_skb->len) <0 ) { +if (dev_hard_header (send_skb, skb->dev, ptype, + sha, np->local_mac, + send_skb->len) <0 ) {kfree_skb (send_skb);return ; }
net/packet/af_packet.c +4 -10
@@ -756,16 +756,10 @@ static int packet_sendmsg(struct kiocb *skb_reserve (skb,LL_RESERVED_SPACE (dev));skb_reset_network_header (skb); -if (dev->hard_header) { -int res; - err = -EINVAL ; - res = dev->hard_header (skb, dev,ntohs (proto), addr,NULL , len); -if (sock->type !=SOCK_DGRAM ) { -skb_reset_tail_pointer (skb); - skb->len =0 ; - }else if (res <0 ) - goto out_free; - } + err = -EINVAL ; +if (sock->type ==SOCK_DGRAM && +dev_hard_header (skb, dev,ntohs (proto), addr,NULL , len) <0 ) + goto out_free;/* Returns -EFAULT on error */ err =memcpy_fromiovec (skb_put (skb,len), msg->msg_iov, len);
net/802/p8023.c +1 -1
@@ -31,7 +31,7 @@ static int p8023_request(struct datalink {struct net_device *dev = skb->dev; - dev->hard_header (skb, dev,ETH_P_802_3 , dest_node,NULL , skb->len); +dev_hard_header (skb, dev,ETH_P_802_3 , dest_node,NULL , skb->len);return dev_queue_xmit (skb); }
net/decnet/dn_neigh.c +2 -1
@@ -210,7 +210,8 @@ static int dn_neigh_output_packet(structchar mac_addr[ETH_ALEN ];dn_dn2eth (mac_addr, rt->rt_local_src); -if (!dev->hard_header || dev->hard_header (skb, dev,ntohs (skb->protocol), neigh->ha, mac_addr, skb->len) >=0 ) +if (dev_hard_header (skb, dev,ntohs (skb->protocol), neigh->ha, + mac_addr, skb->len) >=0 )return neigh->ops->queue_xmit (skb);if (net_ratelimit ())
net/econet/af_econet.c +7 -7
@@ -336,6 +336,7 @@ static int econet_sendmsg(struct kiocb */* Real hardware Econet. We're not worthy etc. */ #ifdef CONFIG_ECONET_NATIVE unsigned short proto =0 ; +int res;dev_hold (dev);
@@ -354,12 +355,12 @@ static int econet_sendmsg(struct kiocb * eb->sec = *saddr; eb->sent = ec_tx_done; -if (dev->hard_header) { -int res; + err = -EINVAL ; + res =dev_hard_header (skb, dev,ntohs (proto), &addr,NULL , len); +if (res <0 ) + goto out_free; +if (res >0 ) {struct ec_framehdr *fh; - err = -EINVAL ; - res = dev->hard_header (skb, dev,ntohs (proto), - &addr,NULL , len);/* Poke in our control byte and port number. Hack, hack. */ fh = (struct ec_framehdr *)(skb->data);
@@ -368,8 +369,7 @@ static int econet_sendmsg(struct kiocb *if (sock->type !=SOCK_DGRAM ) {skb_reset_tail_pointer (skb); skb->len =0 ; - }else if (res <0 ) - goto out_free; + } }/* Copy the data. Returns -EFAULT on error */
net/ethernet/pe2.c +1 -3
@@ -12,9 +12,7 @@ static int pEII_request(struct datalink_struct net_device *dev = skb->dev; skb->protocol =htons (ETH_P_IPX ); -if (dev->hard_header) - dev->hard_header (skb, dev,ETH_P_IPX , - dest_node,NULL , skb->len); +dev_hard_header (skb, dev,ETH_P_IPX , dest_node,NULL , skb->len);return dev_queue_xmit (skb); }
net/ipv4/ipconfig.c +2 -2
@@ -749,8 +749,8 @@ static void __init ic_bootp_send_if(stru/* Chain packet down the line... */ skb->dev = dev; skb->protocol =htons (ETH_P_IP ); -if ((dev->hard_header && - dev->hard_header (skb, dev,ntohs (skb->protocol), dev->broadcast, dev->dev_addr, skb->len) <0 ) || +if (dev_hard_header (skb, dev,ntohs (skb->protocol), + dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0)printk ("E" ); }
net/ipv6/mcast.c +5 -10
@@ -1437,17 +1437,12 @@ static struct sk_buff *mld_newpack(strucstatic inline int mld_dev_queue_xmit2 (struct sk_buff *skb) {struct net_device *dev = skb->dev; +unsigned char ha[MAX_ADDR_LEN ]; -if (dev->hard_header) { -unsigned char ha[MAX_ADDR_LEN ]; -int err; - -ndisc_mc_map (&ipv6_hdr (skb)->daddr, ha, dev,1 ); - err = dev->hard_header (skb, dev,ETH_P_IPV6 , ha,NULL , skb->len); -if (err <0 ) { -kfree_skb (skb); -return err; - } +ndisc_mc_map (&ipv6_hdr (skb)->daddr, ha, dev,1 ); +if (dev_hard_header (skb, dev,ETH_P_IPV6 , ha,NULL , skb->len) <0 ) { +kfree_skb (skb); +return -EINVAL ; }return dev_queue_xmit (skb); }
net/sched/sch_teql.c +4 -1
@@ -232,9 +232,12 @@ __teql_resolve(struct sk_buff *skb, stru }if (neigh_event_send (n, skb_res) ==0 ) {int err; +read_lock (&n->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), n->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + n->ha,NULL , skb->len);read_unlock (&n->lock); +if (err <0 ) {neigh_release (n);return -EINVAL ;
net/tipc/eth_media.c +1 -1
@@ -76,7 +76,7 @@ static int send_msg(struct sk_buff *buf,skb_reset_network_header (clone); dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; clone->dev = dev; - dev->hard_header (clone, dev,ETH_P_TIPC , +dev_hard_header (clone, dev,ETH_P_TIPC , &dest->dev_addr.eth_addr, dev->dev_addr, clone->len);dev_queue_xmit (clone);
drivers/net/hamradio/bpqether.c +1 -1
@@ -283,7 +283,7 @@ static int bpq_xmit(struct sk_buff *skb, skb->protocol =ax25_type_trans (skb, dev);skb_reset_network_header (skb); - dev->hard_header (skb, dev,ETH_P_BPQ , bpq->dest_addr,NULL ,0 ); +dev_hard_header (skb, dev,ETH_P_BPQ , bpq->dest_addr,NULL ,0 ); bpq->stats.tx_packets++; bpq->stats.tx_bytes+=skb->len;
drivers/net/macvlan.c +2 -2
@@ -170,8 +170,8 @@ static int macvlan_hard_header(struct skconst struct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev; -return lowerdev->hard_header (skb, lowerdev, type, daddr, - saddr ? : dev->dev_addr, len); +return dev_hard_header (skb, lowerdev, type, daddr, + saddr ? : dev->dev_addr, len); }static int macvlan_open (struct net_device *dev)
drivers/net/pppoe.c +4 -4
@@ -824,8 +824,8 @@ static int pppoe_sendmsg(struct kiocb *i } error = total_len; - dev->hard_header (skb, dev,ETH_P_PPP_SES , - po->pppoe_pa.remote,NULL , total_len); +dev_hard_header (skb, dev,ETH_P_PPP_SES , + po->pppoe_pa.remote,NULL , total_len);memcpy (ph, &hdr,sizeof (struct pppoe_hdr ));
@@ -896,8 +896,8 @@ static int __pppoe_xmit(struct sock *sk, skb2->dev = dev; - dev->hard_header (skb2, dev,ETH_P_PPP_SES , - po->pppoe_pa.remote,NULL , data_len); +dev_hard_header (skb2, dev,ETH_P_PPP_SES , + po->pppoe_pa.remote,NULL , data_len);/* We're transmitting skb2, and assuming that dev_queue_xmit * will free it. The generic ppp layer however, is expecting
include/net/dn_route.h +1 -2
@@ -100,8 +100,7 @@ static inline void dn_rt_finish_output(sif ((dev->type !=ARPHRD_ETHER ) && (dev->type !=ARPHRD_LOOPBACK )) dst =NULL ; -if (!dev->hard_header || (dev->hard_header (skb, dev,ETH_P_DNA_RT , - dst, src, skb->len) >=0 )) +if (dev_hard_header (skb, dev,ETH_P_DNA_RT , dst, src, skb->len) >=0 )dn_rt_send (skb);else kfree_skb (skb);
drivers/net/wan/lapbether.c +1 -1
@@ -213,7 +213,7 @@ static void lapbeth_data_transmit(struct skb->dev = dev = lapbeth->ethdev; - dev->hard_header (skb, dev,ETH_P_DEC , bcast_addr,NULL ,0 ); +dev_hard_header (skb, dev,ETH_P_DEC , bcast_addr,NULL ,0 );dev_queue_xmit (skb); }
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 2/3 net: wrap hard_header_parse
In reply to Stephen HemmingerWrap the hard_header_parse function to simplify next step of header_ops conversion.
include/linux/netdevice.h +11 -1
@@ -639,7 +639,7 @@ struct net_devicevoid (*vlan_rx_kill_vid)(struct net_device *dev,unsigned short vid); -int (*hard_header_parse)(struct sk_buff *skb, +int (*hard_header_parse)(const struct sk_buff *skb,unsigned char *haddr);int (*neigh_setup)(struct net_device *dev,struct neigh_parms *);#ifdef CONFIG_NETPOLL
@@ -787,6 +787,16 @@ static inline int dev_hard_header(structreturn dev->hard_header (skb, dev, type, daddr, saddr, len); } +static inline int dev_parse_header (const struct sk_buff *skb, +unsigned char *haddr) +{ +const struct net_device *dev = skb->dev; + +if (!dev->hard_header_parse) +return 0 ; +return dev->hard_header_parse (skb, haddr); +} +typedef int gifconf_func_t (struct net_device * dev,char __user * bufptr,int len);extern int register_gifconf (unsigned int family,gifconf_func_t * gifconf);static inline int unregister_gifconf (unsigned int family)
net/netfilter/nfnetlink_log.c +6 -5
@@ -480,12 +480,13 @@ __build_packet_message(struct nfulnl_insNFA_PUT (inst->skb,NFULA_MARK ,sizeof (tmp_uint), &tmp_uint); } -if (indev && skb->dev && skb->dev->hard_header_parse) { +if (indev && skb->dev) {struct nfulnl_msg_packet_hw phw; -int len = skb->dev->hard_header_parse ((struct sk_buff *)skb, - phw.hw_addr); - phw.hw_addrlen =htons (len); -NFA_PUT (inst->skb,NFULA_HWADDR ,sizeof (phw), &phw); +int len =dev_parse_header (skb, phw.hw_addr); +if (len >0 ) { + phw.hw_addrlen =htons (len); +NFA_PUT (inst->skb,NFULA_HWADDR ,sizeof (phw), &phw); + } }if (skb->tstamp.tv64) {
net/netfilter/nfnetlink_queue.c +6 -7
@@ -485,14 +485,13 @@ nfqnl_build_packet_message(struct nfqnl_NFA_PUT (skb,NFQA_MARK ,sizeof (u_int32_t), &tmp_uint); } -if (indev && entskb->dev - && entskb->dev->hard_header_parse) { +if (indev && entskb->dev) {struct nfqnl_msg_packet_hw phw; - -int len = entskb->dev->hard_header_parse (entskb, - phw.hw_addr); - phw.hw_addrlen =htons (len); -NFA_PUT (skb,NFQA_HWADDR ,sizeof (phw), &phw); +int len =dev_parse_header (entskb, phw.hw_addr); +if (len) { + phw.hw_addrlen =htons (len); +NFA_PUT (skb,NFQA_HWADDR ,sizeof (phw), &phw); + } }if (entskb->tstamp.tv64) {
net/packet/af_packet.c +2 -6
@@ -512,10 +512,8 @@ static int packet_rcv(struct sk_buff *sk sll->sll_ifindex = orig_dev->ifindex; else sll->sll_ifindex = dev->ifindex; - sll->sll_halen =0 ; -if (dev->hard_header_parse) - sll->sll_halen = dev->hard_header_parse (skb, sll->sll_addr); + sll->sll_halen =dev_parse_header (skb, sll->sll_addr);PACKET_SKB_CB (skb)->origlen = skb->len;
@@ -649,9 +647,7 @@ static int tpacket_rcv(struct sk_buff *s h->tp_usec = tv.tv_usec; sll = (struct sockaddr_ll *)((u8 *)h +TPACKET_ALIGN (sizeof (*h))); - sll->sll_halen =0 ; -if (dev->hard_header_parse) - sll->sll_halen = dev->hard_header_parse (skb, sll->sll_addr); + sll->sll_halen =dev_parse_header (skb, sll->sll_addr); sll->sll_family =AF_PACKET ; sll->sll_hatype = dev->type; sll->sll_protocol = skb->protocol;
net/ethernet/eth.c +2 -2
@@ -207,9 +207,9 @@ EXPORT_SYMBOL(eth_type_trans);* @skb: packet to extract header from * @haddr: destination buffer */ -static int eth_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) { -struct ethhdr *eth =eth_hdr (skb); +const struct ethhdr *eth =eth_hdr (skb);memcpy (haddr, eth->h_source,ETH_ALEN );return ETH_ALEN ; }
net/mac80211/ieee80211.c +1 -1
@@ -53,7 +53,7 @@ static struct net_device_stats *ieee8021return &(sdata->stats); } -static int header_parse_80211 (struct sk_buff *skb,unsigned char *haddr) +static int header_parse_80211 (const struct sk_buff *skb,unsigned char *haddr) {memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );/* addr2 */ return ETH_ALEN ;
drivers/ieee1394/eth1394.c +5 -5
@@ -162,7 +162,8 @@ static int ether1394_header(struct sk_bu unsigned short type, void *daddr, void *saddr, unsigned len);static int ether1394_rebuild_header (struct sk_buff *skb); -static int ether1394_header_parse (struct sk_buff *skb,unsigned char *haddr); +static int ether1394_header_parse (const struct sk_buff *skb, +unsigned char *haddr);static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh); static void ether1394_header_cache_update(struct hh_cache *hh, struct net_device *dev,
@@ -752,11 +753,10 @@ static int ether1394_rebuild_header(strureturn 0 ; } -static int ether1394_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int ether1394_header_parse (const struct sk_buff *skb, +unsigned char *haddr) { -struct net_device *dev = skb->dev; - -memcpy (haddr, dev->dev_addr,ETH1394_ALEN ); +memcpy (haddr, skb->dev->dev_addr,ETH1394_ALEN );return ETH1394_ALEN ; }
drivers/net/wireless/airo.c +1 -6
@@ -2481,7 +2481,7 @@ void stop_airo_card( struct net_device *EXPORT_SYMBOL (stop_airo_card); -static int wll_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int wll_header_parse (const struct sk_buff *skb,unsigned char *haddr) {memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );return ETH_ALEN ;
@@ -2698,11 +2698,6 @@ static int mpi_map_card(struct airo_infostatic void wifi_setup (struct net_device *dev) { - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update=NULL ; - dev->hard_header_parse = wll_header_parse; dev->hard_start_xmit = &airo_start_xmit11; dev->get_stats = &airo_get_stats;
drivers/s390/net/qeth_main.c +3 -3
@@ -6488,10 +6488,10 @@ static struct ethtool_ops qeth_ethtool_o };static int -qeth_hard_header_parse (struct sk_buff *skb,unsigned char *haddr) +qeth_hard_header_parse (const struct sk_buff *skb,unsigned char *haddr) { -struct qeth_card *card; -struct ethhdr *eth; +const struct qeth_card *card; +const struct ethhdr *eth; card =qeth_get_card_from_dev (skb->dev);if (card->options.layer2)
net/ipv4/netfilter/ip_queue.c +2 -4
@@ -249,10 +249,8 @@ ipq_build_packet_message(struct ipq_queuif (entry->info->indev && entry->skb->dev) { pmsg->hw_type = entry->skb->dev->type; -if (entry->skb->dev->hard_header_parse) - pmsg->hw_addrlen = - entry->skb->dev->hard_header_parse (entry->skb, - pmsg->hw_addr); + pmsg->hw_addrlen =dev_parse_header (entry->skb, + pmsg->hw_addr); }if (data_len)
net/ipv6/netfilter/ip6_queue.c +1 -4
@@ -247,10 +247,7 @@ ipq_build_packet_message(struct ipq_queuif (entry->info->indev && entry->skb->dev) { pmsg->hw_type = entry->skb->dev->type; -if (entry->skb->dev->hard_header_parse) - pmsg->hw_addrlen = - entry->skb->dev->hard_header_parse (entry->skb, - pmsg->hw_addr); + pmsg->hw_addrlen =dev_parse_header (entry->skb, pmsg->hw_addr); }if (data_len)
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 3/3 net: move hardware header operations out of netdevice
In reply to Stephen HemmingerSince hardware header operations are part of the protocol class not the device instance, make them into a separate object and save memory.
drivers/net/loopback.c +4 -5
@@ -208,14 +208,11 @@ struct net_device loopback_dev = { .get_stats = &get_stats, .mtu = (16 * 1024) + 20 + 20 + 12, .hard_start_xmit = loopback_xmit, - .hard_header = eth_header, - .hard_header_cache = eth_header_cache, - .header_cache_update = eth_header_cache_update, - .hard_header_len = ETH_HLEN, /* 14 */ + .addr_len = ETH_ALEN, /* 6 */ .tx_queue_len = 0, .type = ARPHRD_LOOPBACK, /* 0x0001*/ - .rebuild_header = eth_rebuild_header, + .flags = IFF_LOOPBACK, .features = NETIF_F_SG | NETIF_F_FRAGLIST#ifdef LOOPBACK_TSO
@@ -223,7 +220,9 @@ struct net_device loopback_dev = {#endif | NETIF_F_NO_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX, + .ethtool_ops = &loopback_ethtool_ops, + .header_ops = ð_header_ops, };/* Setup and register the loopback device. */
include/linux/etherdevice.h +12 -8
@@ -29,15 +29,19 @@#include <linux/random.h> #ifdef __KERNEL__ -extern int eth_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr, -void *saddr,unsigned len); -extern int eth_rebuild_header (struct sk_buff *skb);extern __be16 eth_type_trans (struct sk_buff *skb,struct net_device *dev); -extern void eth_header_cache_update (struct hh_cache *hh,struct net_device *dev, -unsigned char * haddr); -extern int eth_header_cache (struct neighbour *neigh, -struct hh_cache *hh); +extern const struct header_ops eth_header_ops; + +extern int eth_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len); +extern int eth_rebuild_header (struct sk_buff *skb); +extern int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr); +extern int eth_header_cache (const struct neighbour *neigh,struct hh_cache *hh); +extern void eth_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char *haddr); +extern struct net_device *alloc_etherdev_mq (int sizeof_priv,unsigned int queue_count);#define alloc_etherdev (sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
include/linux/netdevice.h +23 -20
88 lines not on this page · raw message
include/net/pkt_sched.h +2 -3
@@ -97,10 +97,9 @@ extern int tc_classify(struct sk_buff *s/* Calculate maximal size of packet seen by hard_start_xmit routine of this device. */ -static inline unsigned psched_mtu (struct net_device *dev) +static inline unsigned psched_mtu (const struct net_device *dev) { -unsigned mtu = dev->mtu; -return dev->hard_header ? mtu + dev->hard_header_len : mtu; +return dev->mtu + dev->hard_header_len; }#endif
net/core/dev.c +0 -16
@@ -919,14 +919,6 @@ void dev_load(const char *name)request_module ("%s" , name); } -static int default_rebuild_header (struct sk_buff *skb) -{ -printk (KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n" , - skb->dev ? skb->dev->name :"NULL!!!" ); -kfree_skb (skb); -return 1 ; -} -/** * dev_open - prepare an interface for use. * @dev: device to open
@@ -3460,14 +3452,6 @@ int register_netdevice(struct net_device } } -/* -* nil rebuild_header routine, -* that should be never called and used as just bug trap. -*/ - -if (!dev->rebuild_header) - dev->rebuild_header = default_rebuild_header; - ret =netdev_register_sysfs (dev);if (ret) goto err_uninit;
net/core/neighbour.c +6 -5
@@ -895,8 +895,8 @@ out_unlock_bh:static void neigh_update_hhs (struct neighbour *neigh) {struct hh_cache *hh; -void (*update)(struct hh_cache *,struct net_device *,unsigned char *) = - neigh->dev->header_cache_update; +void (*update)(struct hh_cache *,const struct net_device *,const unsigned char *) + = neigh->dev->header_ops->cache_update;if (update) {for (hh = neigh->hh; hh; hh = hh->hh_next) {
@@ -1093,7 +1093,8 @@ static void neigh_hh_init(struct neighbo hh->hh_type = protocol;atomic_set (&hh->hh_refcnt,0 ); hh->hh_next =NULL ; -if (dev->hard_header_cache (n, hh)) { + +if (dev->header_ops->cache (n, hh)) {kfree (hh); hh =NULL ; }else {
@@ -1125,7 +1126,7 @@ int neigh_compat_output(struct sk_buff *if (dev_hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , skb->len) <0 && - dev->rebuild_header (skb)) + dev->header_ops->rebuild (skb))return 0 ;return dev_queue_xmit (skb);
@@ -1147,7 +1148,7 @@ int neigh_resolve_output(struct sk_buffif (!neigh_event_send (neigh, skb)) {int err;struct net_device *dev = neigh->dev; -if (dev->hard_header_cache && !dst->hh) { +if (dev->header_ops->cache && !dst->hh) {write_lock_bh (&neigh->lock);if (!dst->hh)neigh_hh_init (neigh, dst, dst->ops->protocol);
net/ethernet/eth.c +24 -12
@@ -75,8 +75,9 @@ __setup("ether=", netdev_boot_setup);* Set the protocol type. For a packet of type ETH_P_802_3 we put the length * in here instead. It is up to the 802.2 layer to carry protocol information. */ -int eth_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +int eth_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct ethhdr *eth = (struct ethhdr *)skb_push (skb,ETH_HLEN );
@@ -109,6 +110,7 @@ int eth_header(struct sk_buff *skb, strureturn -ETH_HLEN ; } +EXPORT_SYMBOL (eth_header);/** * eth_rebuild_header- rebuild the Ethernet MAC header.
@@ -141,6 +143,7 @@ int eth_rebuild_header(struct sk_buff *sreturn 0 ; } +EXPORT_SYMBOL (eth_rebuild_header);/** * eth_type_trans - determine the packet's protocol ID.
@@ -207,12 +210,13 @@ EXPORT_SYMBOL(eth_type_trans);* @skb: packet to extract header from * @haddr: destination buffer */ -static int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) +int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) {const struct ethhdr *eth =eth_hdr (skb);memcpy (haddr, eth->h_source,ETH_ALEN );return ETH_ALEN ; } +EXPORT_SYMBOL (eth_header_parse);/** * eth_header_cache - fill cache entry from neighbour
@@ -220,11 +224,11 @@ static int eth_header_parse(const struct* @hh: destination cache entry * Create an Ethernet header template from the neighbour. */ -int eth_header_cache (struct neighbour *neigh,struct hh_cache *hh) +int eth_header_cache (const struct neighbour *neigh,struct hh_cache *hh) {__be16 type = hh->hh_type;struct ethhdr *eth; -struct net_device *dev = neigh->dev; +const struct net_device *dev = neigh->dev; eth = (struct ethhdr *) (((u8 *) hh->hh_data) + (HH_DATA_OFF (sizeof (*eth))));
@@ -238,6 +242,7 @@ int eth_header_cache(struct neighbour *n hh->hh_len =ETH_HLEN ;return 0 ; } +EXPORT_SYMBOL (eth_header_cache);/** * eth_header_cache_update - update cache entry
@@ -247,12 +252,14 @@ int eth_header_cache(struct neighbour *n* * Called by Address Resolution module to notify changes in address. */ -void eth_header_cache_update (struct hh_cache *hh,struct net_device *dev, -unsigned char *haddr) +void eth_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char *haddr) {memcpy (((u8 *) hh->hh_data) +HH_DATA_OFF (sizeof (struct ethhdr )), haddr, dev->addr_len); } +EXPORT_SYMBOL (eth_header_cache_update);/** * eth_mac_addr - set new Ethernet hardware address
@@ -291,6 +298,14 @@ static int eth_change_mtu(struct net_devreturn 0 ; } +const struct header_ops eth_header_ops____cacheline_aligned = { + .create = eth_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +/** * ether_setup - setup Ethernet network device * @dev: network device
@@ -298,13 +313,10 @@ static int eth_change_mtu(struct net_dev*/ void ether_setup (struct net_device *dev) { + dev->header_ops = ð_header_ops; + dev->change_mtu = eth_change_mtu; - dev->hard_header = eth_header; - dev->rebuild_header = eth_rebuild_header; dev->set_mac_address = eth_mac_addr; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update= eth_header_cache_update; - dev->hard_header_parse = eth_header_parse; dev->type =ARPHRD_ETHER ; dev->hard_header_len =ETH_HLEN ;
net/ipv4/arp.c +4 -2
@@ -252,7 +252,7 @@ static int arp_constructor(struct neighb neigh->parms =neigh_parms_clone (parms);rcu_read_unlock (); -if (dev->hard_header ==NULL ) { +if (!dev->header_ops) { neigh->nud_state =NUD_NOARP ; neigh->ops = &arp_direct_ops; neigh->output = neigh->ops->queue_xmit;
@@ -309,10 +309,12 @@ static int arp_constructor(struct neighb neigh->nud_state =NUD_NOARP ;memcpy (neigh->ha, dev->broadcast, dev->addr_len); } -if (dev->hard_header_cache) + +if (dev->header_ops->cache) neigh->ops = &arp_hh_ops;else neigh->ops = &arp_generic_ops; +if (neigh->nud_state&NUD_VALID ) neigh->output = neigh->ops->connected_output;else
include/linux/if_ether.h +2 -0
@@ -117,6 +117,8 @@ static inline struct ethhdr *eth_hdr(conreturn (struct ethhdr *)skb_mac_header (skb); } +int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr); +#ifdef CONFIG_SYSCTL extern struct ctl_table ether_table[];#endif
net/802/fc.c +7 -4
@@ -35,7 +35,7 @@static int fc_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct fch_hdr *fch;int hdr_len;
@@ -95,11 +95,14 @@ static int fc_rebuild_header(struct sk_b#endif } +static const struct header_ops fc_header_ops = { + .create = fc_header, + .rebuild = fc_rebuild_header, +}; +static void fc_setup (struct net_device *dev) { - dev->hard_header = fc_header; - dev->rebuild_header = fc_rebuild_header; - + dev->header_ops = &fc_header_ops; dev->type =ARPHRD_IEEE802 ; dev->hard_header_len =FC_HLEN ; dev->mtu =2024 ;
net/802/fddi.c +7 -3
@@ -52,7 +52,7 @@static int fddi_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {int hl =FDDI_K_SNAP_HLEN ;struct fddihdr *fddi;
@@ -175,11 +175,15 @@ static int fddi_change_mtu(struct net_dereturn (0 ); } +static const struct header_ops fddi_header_ops = { + .create = fddi_header, + .rebuild = fddi_rebuild_header, +}; +static void fddi_setup (struct net_device *dev) { dev->change_mtu = fddi_change_mtu; - dev->hard_header = fddi_header; - dev->rebuild_header = fddi_rebuild_header; + dev->header_ops = &fddi_header_ops; dev->type =ARPHRD_FDDI ; dev->hard_header_len =FDDI_K_SNAP_HLEN +3 ;/* Assume 802.2 SNAP hdr len + 3 pad bytes */
net/802/hippi.c +9 -7
@@ -45,8 +45,8 @@*/ static int hippi_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct hippi_hdr *hip = (struct hippi_hdr *)skb_push (skb,HIPPI_HLEN );struct hippi_cb *hcb = (struct hippi_cb *) skb->cb;
@@ -182,16 +182,18 @@ static int hippi_neigh_setup_dev(structreturn 0 ; } +static const struct header_ops hippi_header_ops = { + .create = hippi_header, + .rebuild = hippi_rebuild_header, +}; + +static void hippi_setup (struct net_device *dev) { dev->set_multicast_list =NULL ; dev->change_mtu = hippi_change_mtu; - dev->hard_header = hippi_header; - dev->rebuild_header = hippi_rebuild_header; + dev->header_ops = &hippi_header_ops; dev->set_mac_address = hippi_mac_addr; - dev->hard_header_parse =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; dev->neigh_setup = hippi_neigh_setup_dev;/*
net/802/tr.c +10 -5
@@ -99,7 +99,7 @@ static inline unsigned long rif_hash(constatic int tr_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct trh_hdr *trh;int hdr_len;
@@ -141,7 +141,7 @@ static int tr_header(struct sk_buff *skbif (daddr) {memcpy (trh->daddr,daddr,dev->addr_len); -tr_source_route (skb,trh,dev); +tr_source_route (skb, trh, dev);return (hdr_len); }
@@ -246,7 +246,8 @@ __be16 tr_type_trans(struct sk_buff *skb* We try to do source routing... */ -void tr_source_route (struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev) +void tr_source_route (struct sk_buff *skb,struct trh_hdr *trh, +struct net_device *dev) {int slack;unsigned int hash;
@@ -589,14 +590,18 @@ static const struct file_operations rif_#endif +static const struct header_ops tr_header_ops = { + .create = tr_header, + .rebuild= tr_rebuild_header, +}; +static void tr_setup (struct net_device *dev) {/* * Configure and register */ - dev->hard_header = tr_header; - dev->rebuild_header = tr_rebuild_header; + dev->header_ops = &tr_header_ops; dev->type =ARPHRD_IEEE802_TR ; dev->hard_header_len =TR_HLEN ;
net/8021q/vlan.c +8 -6
@@ -313,6 +313,12 @@ int unregister_vlan_device(struct net_de*/ static struct lock_class_key vlan_netdev_xmit_lock_key; +static const struct header_ops vlan_header_ops = { + .create = vlan_dev_hard_header, + .rebuild = vlan_dev_rebuild_header, + .parse = eth_header_parse, +}; +static int vlan_dev_init (struct net_device *dev) {struct net_device *real_dev =VLAN_DEV_INFO (dev)->real_dev;
@@ -330,18 +336,14 @@ static int vlan_dev_init(struct net_devimemcpy (dev->broadcast, real_dev->broadcast, dev->addr_len);if (real_dev->features &NETIF_F_HW_VLAN_TX ) { - dev->hard_header = real_dev->hard_header; + dev->header_ops = real_dev->header_ops; dev->hard_header_len = real_dev->hard_header_len; dev->hard_start_xmit = vlan_dev_hwaccel_hard_start_xmit; - dev->rebuild_header = real_dev->rebuild_header; }else { - dev->hard_header = vlan_dev_hard_header; + dev->header_ops = &vlan_header_ops; dev->hard_header_len = real_dev->hard_header_len +VLAN_HLEN ; dev->hard_start_xmit = vlan_dev_hard_start_xmit; - dev->rebuild_header = vlan_dev_rebuild_header; } - dev->hard_header_parse = real_dev->hard_header_parse; - dev->hard_header_cache =NULL ;lockdep_set_class (&dev->_xmit_lock, &vlan_netdev_xmit_lock_key);return 0 ;
drivers/net/arcnet/arcnet.c +11 -7
@@ -102,8 +102,8 @@ static int arcnet_close(struct net_devicstatic int arcnet_send_packet (struct sk_buff *skb,struct net_device *dev);static void arcnet_timeout (struct net_device *dev);static int arcnet_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);static int arcnet_rebuild_header (struct sk_buff *skb);static struct net_device_stats *arcnet_get_stats (struct net_device *dev);static int go_tx (struct net_device *dev);
@@ -317,11 +317,17 @@ static int choose_mtu(void)return mtu ==65535 ?XMTU : mtu; } +static const struct header_ops arcnet_header_ops = { + .create = arcnet_header, + .rebuild = arcnet_rebuild_header, +}; +/* Setup a struct device for ARCnet. */ static void arcdev_setup (struct net_device *dev) { dev->type =ARPHRD_ARCNET ; + dev->header_ops = &arcnet_header_ops; dev->hard_header_len =sizeof (struct archdr ); dev->mtu =choose_mtu ();
@@ -342,8 +348,6 @@ static void arcdev_setup(struct net_devi dev->hard_start_xmit = arcnet_send_packet; dev->tx_timeout = arcnet_timeout; dev->get_stats = arcnet_get_stats; - dev->hard_header = arcnet_header; - dev->rebuild_header = arcnet_rebuild_header; }struct net_device *alloc_arcdev (char *name)
@@ -488,10 +492,10 @@ static int arcnet_close(struct net_devicstatic int arcnet_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) { -struct arcnet_local *lp = dev->priv; +const struct arcnet_local *lp =netdev_priv (dev);uint8_t _daddr, proto_num;struct ArcProto *proto;
drivers/net/hamradio/6pack.c +11 -4
@@ -3,7 +3,7 @@* devices like TTY. It interfaces between a raw TTY and the * kernel's AX.25 protocol layers. * -* Authors: Andreas Könsgen <[email protected]> +* Authors: Andreas Könsgen <[email protected]> * Ralf Baechle DL5RB <[email protected]> * * Quite a lot of stuff "stolen" by Joerg Reuter from slip.c, written by
@@ -288,7 +288,8 @@ static int sp_close(struct net_device *d/* Return the frame type ID */ static int sp_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr,unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {#ifdef CONFIG_INET if (type !=htons (ETH_P_AX25 ))
@@ -323,6 +324,11 @@ static int sp_rebuild_header(struct sk_b#endif } +static const struct header_ops sp_header_ops = { + .create = sp_header, + .rebuild = sp_rebuild_header, +}; +static void sp_setup (struct net_device *dev) {/* Finish setting up the DEVICE info. */
@@ -331,14 +337,15 @@ static void sp_setup(struct net_device * dev->open = sp_open_dev; dev->destructor = free_netdev; dev->stop = sp_close; - dev->hard_header = sp_header; + dev->get_stats = sp_get_stats; dev->set_mac_address = sp_set_mac_address; dev->hard_header_len =AX25_MAX_HEADER_LEN ; + dev->header_ops = &sp_header_ops; + dev->addr_len =AX25_ADDR_LEN ; dev->type =ARPHRD_AX25 ; dev->tx_queue_len =10 ; - dev->rebuild_header = sp_rebuild_header; dev->tx_timeout =NULL ;/* Only activated in AX.25 mode */
drivers/net/hamradio/bpqether.c +1 -2
@@ -488,8 +488,7 @@ static void bpq_setup(struct net_device dev->flags =0 ;#if defined(CONFIG_AX25 ) || defined(CONFIG_AX25_MODULE ) - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops;#endif dev->type =ARPHRD_AX25 ;
drivers/net/hamradio/dmascc.c +1 -2
@@ -581,8 +581,7 @@ static int __init setup_adapter(int card dev->do_ioctl = scc_ioctl; dev->hard_start_xmit = scc_send_packet; dev->get_stats = scc_get_stats; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_hard_header_ops dev->set_mac_address = scc_set_mac_address; }if (register_netdev (info->dev[0 ])) {
drivers/net/hamradio/hdlcdrv.c +1 -2
@@ -682,8 +682,7 @@ static void hdlcdrv_setup(struct net_dev s->skb =NULL ; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops; dev->set_mac_address = hdlcdrv_set_mac_address; dev->type =ARPHRD_AX25 ;/* AF_AX25 device */
drivers/net/hamradio/mkiss.c +10 -4
@@ -578,8 +578,9 @@ static int ax_open_dev(struct net_device#if defined(CONFIG_AX25 ) || defined(CONFIG_AX25_MODULE )/* Return the frame type ID */ -static int ax_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int ax_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {#ifdef CONFIG_INET if (type !=htons (ETH_P_AX25 ))
@@ -670,6 +671,11 @@ static struct net_device_stats *ax_get_sreturn &ax->stats; } +static const struct header_ops ax_header_ops = { + .create = ax_header, + .rebuild = ax_rebuild_header, +}; +static void ax_setup (struct net_device *dev) {/* Finish setting up the DEVICE info. */
@@ -683,8 +689,8 @@ static void ax_setup(struct net_device * dev->addr_len =0 ; dev->type =ARPHRD_AX25 ; dev->tx_queue_len =10 ; - dev->hard_header = ax_header; - dev->rebuild_header = ax_rebuild_header; + dev->header_ops = &ax_header_ops; +memcpy (dev->broadcast, &ax25_bcast,AX25_ADDR_LEN );memcpy (dev->dev_addr, &ax25_defaddr,AX25_ADDR_LEN );
drivers/net/hamradio/scc.c +2 -2
@@ -1550,8 +1550,8 @@ static void scc_net_setup(struct net_dev dev->stop = scc_net_close; dev->hard_start_xmit = scc_net_tx; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_hard_header_ops; + dev->set_mac_address = scc_net_set_mac_address; dev->get_stats = scc_net_get_stats; dev->do_ioctl = scc_net_ioctl;
drivers/net/hamradio/yam.c +1 -2
@@ -1096,8 +1096,7 @@ static void yam_setup(struct net_deviceskb_queue_head_init (&yp->send_queue); - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops; dev->set_mac_address = yam_set_mac_address;
drivers/net/skfp/skfddi.c +0 -1
@@ -260,7 +260,6 @@ static int skfp_init_one(struct pci_dev dev->set_multicast_list = &skfp_ctl_set_multicast_list; dev->set_mac_address = &skfp_ctl_set_mac_address; dev->do_ioctl = &skfp_ioctl; - dev->header_cache_update =NULL ;/* not supported */ SET_MODULE_OWNER (dev);SET_NETDEV_DEV (dev, &pdev->dev);
net/appletalk/dev.c +0 -4
@@ -24,11 +24,7 @@ static void ltalk_setup(struct net_devic/* Fill in the fields of the device structure with localtalk-generic values. */ dev->change_mtu = ltalk_change_mtu; - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; dev->set_mac_address = ltalk_mac_addr; - dev->hard_header_cache =NULL ; - dev->header_cache_update=NULL ; dev->type =ARPHRD_LOCALTLK ; dev->hard_header_len =LTALK_HLEN ;
drivers/ieee1394/eth1394.c +23 -17
@@ -159,15 +159,16 @@ MODULE_PARM_DESC(max_partial_datagrams,static int ether1394_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);static int ether1394_rebuild_header (struct sk_buff *skb);static int ether1394_header_parse (const struct sk_buff *skb,unsigned char *haddr); -static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh); +static int ether1394_header_cache (const struct neighbour *neigh, +struct hh_cache *hh);static void ether1394_header_cache_update (struct hh_cache *hh, -struct net_device *dev, -unsigned char *haddr); +const struct net_device *dev, +const unsigned char *haddr);static int ether1394_tx (struct sk_buff *skb,struct net_device *dev);static void ether1394_iso (struct hpsb_iso *iso);
@@ -507,6 +508,14 @@ static void ether1394_reset_priv(structspin_unlock_irqrestore (&priv->lock, flags); } +static const struct header_ops ether1394_header_ops = { + .create = ether1394_header, + .rebuild = ether1394_rebuild_header, + .cache = ether1394_header_cache, + .cache_update = ether1394_header_cache_update, + .parse = ether1394_header_parse, +}; +static void ether1394_init_dev (struct net_device *dev) { dev->open = ether1394_open;
@@ -516,11 +525,7 @@ static void ether1394_init_dev(struct ne dev->tx_timeout = ether1394_tx_timeout; dev->change_mtu = ether1394_change_mtu; - dev->hard_header = ether1394_header; - dev->rebuild_header = ether1394_rebuild_header; - dev->hard_header_cache = ether1394_header_cache; - dev->header_cache_update= ether1394_header_cache_update; - dev->hard_header_parse = ether1394_header_parse; + dev->header_ops = ðer1394_header_ops;SET_ETHTOOL_OPS (dev, ðtool_ops);
@@ -712,8 +717,8 @@ static void ether1394_host_reset(struct* saddr=NULL means use device source address * daddr=NULL means leave destination address (eg unresolved arp). */ static int ether1394_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct eth1394hdr *eth = (struct eth1394hdr *)skb_push (skb,ETH1394_HLEN );
@@ -760,7 +765,8 @@ static int ether1394_header_parse(constreturn ETH1394_ALEN ; } -static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh) +static int ether1394_header_cache (const struct neighbour *neigh, +struct hh_cache *hh) {unsigned short type = hh->hh_type;struct net_device *dev = neigh->dev;
@@ -779,8 +785,8 @@ static int ether1394_header_cache(struct/* Called by Address Resolution module to notify changes in address. */ static void ether1394_header_cache_update (struct hh_cache *hh, -struct net_device *dev, -unsigned char * haddr) +const struct net_device *dev, +const unsigned char * haddr) {memcpy ((u8 *)hh->hh_data +16 -ETH1394_HLEN , haddr, dev->addr_len); }
@@ -900,8 +906,8 @@ static u16 ether1394_parse_encap(struct }/* Now add the ethernet header. */ -if (dev->hard_header (skb, dev,ntohs (ether_type), &dest_hw,NULL , - skb->len) >=0 ) +if (dev_hard_header (skb, dev,ntohs (ether_type), &dest_hw,NULL , + skb->len) >=0 ) ret =ether1394_type_trans (skb, dev);return ret;
net/8021q/vlan.h +2 -2
@@ -53,8 +53,8 @@ int vlan_dev_rebuild_header(struct sk_buint vlan_skb_recv (struct sk_buff *skb,struct net_device *dev,struct packet_type *ptype,struct net_device *orig_dev);int vlan_dev_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);int vlan_dev_hard_start_xmit (struct sk_buff *skb,struct net_device *dev);int vlan_dev_hwaccel_hard_start_xmit (struct sk_buff *skb,struct net_device *dev);int vlan_dev_change_mtu (struct net_device *dev,int new_mtu);
net/8021q/vlan_dev.c +2 -2
@@ -328,8 +328,8 @@ static inline unsigned short vlan_dev_ge* physical devices. */ int vlan_dev_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct vlan_hdr *vhdr;unsigned short veth_TCI =0 ;
drivers/net/macvlan.c +12 -3
@@ -164,8 +164,8 @@ static int macvlan_hard_start_xmit(struc }static int macvlan_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {const struct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev;
@@ -174,6 +174,15 @@ static int macvlan_hard_header(struct sk saddr ? : dev->dev_addr, len); } +static const struct header_ops macvlan_hard_header_ops = { + .create = macvlan_hard_header, + .rebuild = eth_rebuild_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +static int macvlan_open (struct net_device *dev) {struct macvlan_dev *vlan =netdev_priv (dev);
@@ -299,9 +308,9 @@ static void macvlan_setup(struct net_dev dev->change_mtu = macvlan_change_mtu; dev->change_rx_flags = macvlan_change_rx_flags; dev->set_multicast_list = macvlan_set_multicast_list; - dev->hard_header = macvlan_hard_header; dev->hard_start_xmit = macvlan_hard_start_xmit; dev->destructor = free_netdev; + dev->header_ops = &macvlan_hard_header_ops, dev->ethtool_ops = &macvlan_ethtool_ops; dev->tx_queue_len =0 ; }
include/net/ax25.h +4 -1
@@ -363,8 +363,11 @@ extern int ax25_rx_iframe(ax25_cb *, stextern int ax25_kiss_rcv (struct sk_buff *,struct net_device *,struct packet_type *,struct net_device *);/* ax25_ip.c */ -extern int ax25_hard_header (struct sk_buff *,struct net_device *,unsigned short ,void *,void *,unsigned int ); +extern int ax25_hard_header (struct sk_buff *,struct net_device *, +unsigned short ,const void *, +const void *,unsigned int );extern int ax25_rebuild_header (struct sk_buff *); +extern const struct header_ops ax25_header_ops;/* ax25_out.c */ extern ax25_cb *ax25_send_frame (struct sk_buff *,int ,ax25_address *,ax25_address *,ax25_digi *,struct net_device *);
net/ax25/ax25_ip.c +13 -2
@@ -46,7 +46,9 @@#ifdef CONFIG_INET -int ax25_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr,unsigned len) +int ax25_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {unsigned char *buff;
@@ -215,7 +217,9 @@ put:#else /* INET */ -int ax25_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr,unsigned len) +int ax25_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {return -AX25_HEADER_LEN ; }
@@ -227,5 +231,12 @@ int ax25_rebuild_header(struct sk_buff *#endif +const struct header_ops ax25_header_ops = { + .create = ax25_hard_header, + .rebuild = ax25_rebuild_header, +}; +EXPORT_SYMBOL (ax25_hard_header);EXPORT_SYMBOL (ax25_rebuild_header); +EXPORT_SYMBOL (ax25_header_ops); +
drivers/net/shaper.c +11 -50
96 lines not on this page · raw message
include/linux/if_shaper.h +0 -11
@@ -26,17 +26,6 @@ struct shaperspinlock_t lock;struct net_device_stats stats;struct net_device *dev; -int (*hard_start_xmit) (struct sk_buff *skb, -struct net_device *dev); -int (*hard_header) (struct sk_buff *skb, -struct net_device *dev, -unsigned short type, -void *daddr, -void *saddr, -unsigned len); -int (*rebuild_header)(struct sk_buff *skb); -int (*hard_header_cache)(struct neighbour *neigh,struct hh_cache *hh); -void (*header_cache_update)(struct hh_cache *hh,struct net_device *dev,unsigned char * haddr);struct net_device_stats * (*get_stats)(struct net_device *dev);struct timer_list timer; };
net/ipv4/ip_gre.c +10 -4
@@ -684,7 +684,7 @@ static int ipgre_tunnel_xmit(struct sk_b goto tx_error; } -if (dev->hard_header) { +if (dev->header_ops) { gre_hlen =0 ; tiph = (struct iphdr *)skb->data; }else {
@@ -1063,8 +1063,9 @@ static int ipgre_tunnel_change_mtu(struc*/ -static int ipgre_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int ipgre_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct ip_tunnel *t =netdev_priv (dev);struct iphdr *iph = (struct iphdr *)skb_push (skb, t->hlen);
@@ -1130,9 +1131,14 @@ static int ipgre_close(struct net_device#endif +static const struct header_ops ipgre_header_ops = { + .create = ipgre_header, +}; +static void ipgre_tunnel_setup (struct net_device *dev) {SET_MODULE_OWNER (dev); + dev->uninit = ipgre_tunnel_uninit; dev->destructor = free_netdev; dev->hard_start_xmit = ipgre_tunnel_xmit;
@@ -1188,7 +1194,7 @@ static int ipgre_tunnel_init(struct net_if (!iph->saddr)return -EINVAL ; dev->flags =IFF_BROADCAST ; - dev->hard_header = ipgre_header; + dev->header_ops = &ipgre_header_ops; dev->open = ipgre_open; dev->stop = ipgre_close; }
net/ipv4/ip_output.c +1 -1
@@ -169,7 +169,7 @@ static inline int ip_finish_output2(struIP_INC_STATS (IPSTATS_MIB_OUTBCASTPKTS );/* Be paranoid, rather than too clever. */ -if (unlikely (skb_headroom (skb) < hh_len && dev->hard_header)) { +if (unlikely (skb_headroom (skb) < hh_len && dev->header_ops)) {struct sk_buff *skb2; skb2 =skb_realloc_headroom (skb,LL_RESERVED_SPACE (dev));
net/ipv6/ndisc.c +3 -3
@@ -354,7 +354,7 @@ static int ndisc_constructor(struct neigrcu_read_unlock (); neigh->type = is_multicast ?RTN_MULTICAST :RTN_UNICAST ; -if (dev->hard_header ==NULL ) { +if (!dev->header_ops) { neigh->nud_state =NUD_NOARP ; neigh->ops = &ndisc_direct_ops; neigh->output = neigh->ops->queue_xmit;
@@ -371,7 +371,7 @@ static int ndisc_constructor(struct neig neigh->nud_state =NUD_NOARP ;memcpy (neigh->ha, dev->broadcast, dev->addr_len); } -if (dev->hard_header_cache) +if (dev->header_ops->cache) neigh->ops = &ndisc_hh_ops;else neigh->ops = &ndisc_generic_ops;
@@ -808,7 +808,7 @@ static void ndisc_recv_ns(struct sk_buffneigh_update (neigh, lladdr,NUD_STALE ,NEIGH_UPDATE_F_WEAK_OVERRIDE |NEIGH_UPDATE_F_OVERRIDE ); -if (neigh || !dev->hard_header) { +if (neigh || !dev->header_ops) {ndisc_send_na (dev, neigh, saddr, &msg->target, is_router,1 , (ifp !=NULL && inc), inc);
net/mac80211/ieee80211.c +10 -2
@@ -295,16 +295,24 @@ static int ieee80211_change_mtu_apdev(streturn 0 ; } +static const struct header_ops ieee80211_header_ops = { + .create = eth_header, + .parse = header_parse_80211, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +void ieee80211_if_mgmt_setup (struct net_device *dev) {ether_setup (dev); + dev->header_ops = &ieee80211_header_ops; dev->hard_start_xmit = ieee80211_mgmt_start_xmit; dev->change_mtu = ieee80211_change_mtu_apdev; dev->get_stats = ieee80211_get_stats; dev->open = ieee80211_mgmt_open; dev->stop = ieee80211_mgmt_stop; dev->type =ARPHRD_IEEE80211_PRISM ; - dev->hard_header_parse = header_parse_80211; dev->uninit = ieee80211_if_reinit; dev->destructor = ieee80211_if_free; }
@@ -1290,7 +1298,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( mdev->open = ieee80211_master_open; mdev->stop = ieee80211_master_stop; mdev->type =ARPHRD_IEEE80211 ; - mdev->hard_header_parse = header_parse_80211; + mdev->header_ops = &ieee80211_header_ops; sdata->type =IEEE80211_IF_TYPE_AP ; sdata->dev = mdev;
net/netrom/nr_dev.c +10 -4
@@ -95,8 +95,9 @@ static int nr_rebuild_header(struct sk_b#endif -static int nr_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int nr_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {unsigned char *buff =skb_push (skb,NR_NETWORK_LEN +NR_TRANSPORT_LEN );
@@ -193,6 +194,12 @@ static struct net_device_stats *nr_get_sreturn &nr->stats; } +static const struct header_ops nr_header_ops = { + .create = nr_header, + .rebuild= nr_rebuild_header, +}; + +void nr_setup (struct net_device *dev) { dev->mtu =NR_MAX_PACKET_SIZE ;
@@ -200,11 +207,10 @@ void nr_setup(struct net_device *dev) dev->open = nr_open; dev->stop = nr_close; - dev->hard_header = nr_header; + dev->header_ops = &nr_header_ops; dev->hard_header_len =NR_NETWORK_LEN +NR_TRANSPORT_LEN ; dev->addr_len =AX25_ADDR_LEN ; dev->type =ARPHRD_NETROM ; - dev->rebuild_header = nr_rebuild_header; dev->set_mac_address = nr_set_mac_address;/* New-style flags. */
net/packet/af_packet.c +3 -3
@@ -385,7 +385,7 @@ static int packet_sendmsg_spkt(struct kiskb_reset_network_header (skb);/* Try to align data part correctly */ -if (dev->hard_header) { +if (dev->header_ops) { skb->data -= dev->hard_header_len; skb->tail -= dev->hard_header_len;if (len < dev->hard_header_len)
@@ -459,7 +459,7 @@ static int packet_rcv(struct sk_buff *sk skb->dev = dev; -if (dev->hard_header) { +if (dev->header_ops) {/* The device has an explicit notion of ll header, exported to higher levels.
@@ -571,7 +571,7 @@ static int tpacket_rcv(struct sk_buff *s sk = pt->af_packet_priv; po =pkt_sk (sk); -if (dev->hard_header) { +if (dev->header_ops) {if (sk->sk_type !=SOCK_DGRAM )skb_push (skb, skb->data -skb_mac_header (skb));else if (skb->pkt_type ==PACKET_OUTGOING ) {
net/rose/rose_dev.c +9 -4
@@ -35,8 +35,9 @@#include <net/ax25.h> #include <net/rose.h> -static int rose_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int rose_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {unsigned char *buff =skb_push (skb,ROSE_MIN_LEN +2 );
@@ -148,6 +149,11 @@ static struct net_device_stats *rose_getreturn netdev_priv (dev); } +static const struct header_ops rose_header_ops = { + .create = rose_header, + .rebuild= rose_rebuild_header, +}; +void rose_setup (struct net_device *dev) { dev->mtu =ROSE_MAX_PACKET_SIZE -2 ;
@@ -155,11 +161,10 @@ void rose_setup(struct net_device *dev) dev->open = rose_open; dev->stop = rose_close; - dev->hard_header = rose_header; + dev->header_ops = &rose_header_ops; dev->hard_header_len =AX25_BPQ_HEADER_LEN +AX25_MAX_HEADER_LEN +ROSE_MIN_LEN ; dev->addr_len =ROSE_ADDR_LEN ; dev->type =ARPHRD_ROSE ; - dev->rebuild_header = rose_rebuild_header; dev->set_mac_address = rose_set_mac_address;/* New-style flags. */
net/sched/sch_teql.c +3 -3
@@ -249,10 +249,10 @@ __teql_resolve(struct sk_buff *skb, strureturn (skb_res ==NULL ) ? -EAGAIN :1 ; } -static __inline__int -teql_resolve (struct sk_buff *skb,struct sk_buff *skb_res,struct net_device *dev) +static inline int teql_resolve (struct sk_buff *skb, +struct sk_buff *skb_res,struct net_device *dev) { -if (dev->hard_header ==NULL || +if (dev->header_ops ==NULL || skb->dst ==NULL || skb->dst->neighbour ==NULL )return 0 ;
drivers/infiniband/ulp/ipoib/ipoib_main.c +6 -2
@@ -777,7 +777,7 @@ static void ipoib_timeout(struct net_devstatic int ipoib_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct ipoib_header *header;
@@ -937,6 +937,10 @@ void ipoib_dev_cleanup(struct net_device priv->tx_ring =NULL ; } +static const struct header_ops ipoib_header_ops = { + .create = ipoib_hard_header, +}; +static void ipoib_setup (struct net_device *dev) {struct ipoib_dev_priv *priv =netdev_priv (dev);
@@ -947,7 +951,7 @@ static void ipoib_setup(struct net_devic dev->hard_start_xmit = ipoib_start_xmit; dev->get_stats = ipoib_get_stats; dev->tx_timeout = ipoib_timeout; - dev->hard_header = ipoib_hard_header; + dev->header_ops = &ipoib_header_ops; dev->set_multicast_list = ipoib_set_mcast_list; dev->neigh_setup = ipoib_neigh_setup_dev;
drivers/isdn/i4l/isdn_net.c +36 -69
166 lines not on this page · raw message
drivers/media/dvb/dvb-core/dvb_net.c +8 -1
@@ -1224,10 +1224,17 @@ static struct net_device_stats * dvb_netreturn &((struct dvb_net_priv *) dev->priv)->stats; } +static const struct header_ops dvb_header_ops = { + .create = eth_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, +}; +static void dvb_net_setup (struct net_device *dev) {ether_setup (dev); + dev->header_ops = &dvb_header_ops; dev->open = dvb_net_open; dev->stop = dvb_net_stop; dev->hard_start_xmit = dvb_net_tx;
@@ -1236,7 +1243,7 @@ static void dvb_net_setup(struct net_dev dev->set_mac_address = dvb_net_set_mac; dev->mtu =4096 ; dev->mc_count =0 ; - dev->hard_header_cache =NULL ; + dev->flags |=IFF_NOARP ; }
drivers/net/plip.c +22 -28
105 lines not on this page · raw message
drivers/net/wireless/airo.c +5 -1
@@ -2696,9 +2696,13 @@ static int mpi_map_card(struct airo_inforeturn rc; } +static const struct header_ops airo_header_ops = { + .parse = wll_header_parse, +}; +static void wifi_setup (struct net_device *dev) { - dev->hard_header_parse = wll_header_parse; + dev->header_ops = &airo_header_ops; dev->hard_start_xmit = &airo_start_xmit11; dev->get_stats = &airo_get_stats; dev->set_mac_address = &airo_set_mac_address;
drivers/net/wireless/hostap/hostap.h +1 -2
@@ -30,8 +30,7 @@ void hostap_dump_rx_header(const char *n const struct hfa384x_rx_frame *rx);void hostap_dump_tx_header (const char *name,const struct hfa384x_tx_frame *tx); -int hostap_80211_header_parse (struct sk_buff *skb,unsigned char *haddr); -int hostap_80211_prism_header_parse (struct sk_buff *skb,unsigned char *haddr); +extern const struct header_ops hostap_80211_ops;int hostap_80211_get_hdrlen (u16 fc);struct net_device_stats *hostap_get_stats (struct net_device *dev); void hostap_setup_dev(struct net_device *dev, local_info_t *local,
drivers/net/wireless/hostap/hostap_hw.c +1 -2
@@ -3255,11 +3255,10 @@ while (0)INIT_LIST_HEAD (&local->bss_list);hostap_setup_dev (dev, local,1 ); - local->saved_eth_header_parse = dev->hard_header_parse; dev->hard_start_xmit = hostap_master_start_xmit; dev->type =ARPHRD_IEEE80211 ; - dev->hard_header_parse = hostap_80211_header_parse; + dev->header_ops = &hostap_80211_ops;rtnl_lock (); ret =dev_alloc_name (dev,"wifi%d" );
drivers/net/wireless/hostap/hostap_ioctl.c +1 -4
@@ -896,11 +896,8 @@ static void hostap_monitor_set_type(locaif (local->monitor_type ==PRISM2_MONITOR_PRISM || local->monitor_type ==PRISM2_MONITOR_CAPHDR ) { dev->type =ARPHRD_IEEE80211_PRISM ; - dev->hard_header_parse = - hostap_80211_prism_header_parse; }else { dev->type =ARPHRD_IEEE80211 ; - dev->hard_header_parse = hostap_80211_header_parse; } }
@@ -1140,7 +1137,7 @@ static int hostap_monitor_mode_disable(lprintk (KERN_DEBUG "%s: Disabling monitor mode\n" , dev->name); dev->type =ARPHRD_ETHER ; - dev->hard_header_parse = local->saved_eth_header_parse; +if (local->func->cmd (dev,HFA384X_CMDCODE_TEST | (HFA384X_TEST_STOP <<8 ),0 ,NULL ,NULL ))
drivers/net/wireless/hostap/hostap_main.c +28 -17
72 lines not on this page · raw message
drivers/net/wireless/hostap/hostap_wlan.h +0 -2
@@ -735,8 +735,6 @@ struct local_info {PRISM2_MONITOR_80211 =0 ,PRISM2_MONITOR_PRISM =1 , PRISM2_MONITOR_CAPHDR = 2 } monitor_type; -int (*saved_eth_header_parse)(struct sk_buff *skb, -unsigned char *haddr);int monitor_allow_fcserr;int hostapd;/* whether user space daemon, hostapd, is used for AP
include/linux/isdn.h +0 -7
@@ -353,13 +353,6 @@ typedef struct isdn_net_local_s {/* a particular channel (including */ /* the frame_cnt */ -int (*org_hhc)( -struct neighbour *neigh, -struct hh_cache *hh); -/* Ptr to orig. header_cache_update */ -void (*org_hcu)(struct hh_cache *, -struct net_device *, -unsigned char *);int pppbind;/* ippp device for bindings */ int dialtimeout;/* How long shall we try on dialing? (jiffies) */ int dialwait;/* How long shall we wait after failed attempt? (jiffies) */
drivers/s390/net/qeth.h +1 -2
@@ -833,8 +833,7 @@ struct qeth_card {struct qeth_qdio_info qdio;struct qeth_perf_stats perf_stats;int use_hard_stop; -int (*orig_hard_header)(struct sk_buff *,struct net_device *, -unsigned short ,void *,void *,unsigned ); +const struct header_ops *orig_header_ops;struct qeth_osn_info osn_info;atomic_t force_alloc_skb; };
drivers/s390/net/qeth_main.c +26 -18
112 lines not on this page · raw message
drivers/net/appletalk/cops.c +1 -19
@@ -194,10 +194,6 @@ static void cops_timeout(struct net_devistatic void cops_rx (struct net_device *dev);static int cops_send_packet (struct sk_buff *skb,struct net_device *dev);static void set_multicast_list (struct net_device *dev); -static int cops_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); -static int cops_ioctl (struct net_device *dev,struct ifreq *rq,int cmd);static int cops_close (struct net_device *dev);static struct net_device_stats *cops_get_stats (struct net_device *dev);
@@ -333,7 +329,6 @@ static int __init cops_probe1(struct net dev->base_addr = ioaddr; lp =netdev_priv (dev); -memset (lp,0 ,sizeof (struct cops_local ));spin_lock_init (&lp->lock);/* Copy local board variable to lp struct. */
@@ -342,7 +337,7 @@ static int __init cops_probe1(struct net dev->hard_start_xmit = cops_send_packet; dev->tx_timeout = cops_timeout; dev->watchdog_timeo =HZ *2 ; - dev->hard_header = cops_hard_header; + dev->get_stats = cops_get_stats; dev->open = cops_open; dev->stop = cops_close;
@@ -947,19 +942,6 @@ static void set_multicast_list(struct ne }/* -* Another Dummy function to keep the Appletalk layer happy. -*/ - -static int cops_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) -{ -if (cops_debug >=3 ) -printk ("%s: cops_hard_header executed. Wow!\n" , dev->name); -return 0 ; -} - -/* * System ioctls for the COPS LocalTalk card. */
drivers/net/appletalk/ltpc.c +0 -10
@@ -870,15 +870,6 @@ static void set_multicast_list(struct ne/* Actually netatalk needs fixing! */ } -static int ltpc_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr,unsigned len) -{ -if (debug &DEBUG_VERBOSE ) -printk ("ltpc_hard_header called for device %s\n" , - dev->name); -return 0 ; -} -static int ltpc_poll_counter;static void ltpc_poll (unsigned long l)
@@ -1143,7 +1134,6 @@ struct net_device * __init ltpc_probe(vo/* Fill in the fields of the device structure with ethernet-generic values. */ dev->hard_start_xmit = ltpc_xmit; - dev->hard_header = ltpc_hard_header; dev->get_stats = ltpc_get_stats;/* add the ltpc-specific things */
drivers/net/wan/cycx_x25.c +20 -11
@@ -131,14 +131,15 @@ static int cycx_wan_update(struct wan_de cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev);/* Network device interface */ -static int cycx_netdevice_init (struct net_device *dev), -cycx_netdevice_open (struct net_device *dev), -cycx_netdevice_stop (struct net_device *dev), -cycx_netdevice_hard_header (struct sk_buff *skb, -struct net_device *dev,u16 type, -void *daddr,void *saddr,unsigned len), -cycx_netdevice_rebuild_header (struct sk_buff *skb), -cycx_netdevice_hard_start_xmit (struct sk_buff *skb, +static int cycx_netdevice_init (struct net_device *dev); +static int cycx_netdevice_open (struct net_device *dev); +static int cycx_netdevice_stop (struct net_device *dev); +static int cycx_netdevice_hard_header (struct sk_buff *skb, +struct net_device *dev,u16 type, +const void *daddr,const void *saddr, +unsigned len); +static int cycx_netdevice_rebuild_header (struct sk_buff *skb); +static int cycx_netdevice_hard_start_xmit (struct sk_buff *skb,struct net_device *dev); static struct net_device_stats *
@@ -468,7 +469,14 @@ static int cycx_wan_del_if(struct wan_dereturn 0 ; } +/* Network Device Interface */ + +static const struct header_ops cycx_header_ops = { + .create = cycx_netdevice_hard_header, + .rebuild = cycx_netdevice_rebuild_header, +}; +/* Initialize Linux network interface. * * This routine is called only once for each interface, during Linux network
@@ -483,8 +491,8 @@ static int cycx_netdevice_init(struct ne/* Initialize device driver entry points */ dev->open = cycx_netdevice_open; dev->stop = cycx_netdevice_stop; - dev->hard_header = cycx_netdevice_hard_header; - dev->rebuild_header = cycx_netdevice_rebuild_header; + dev->header_ops = &cycx_header_ops; + dev->hard_start_xmit = cycx_netdevice_hard_start_xmit; dev->get_stats = cycx_netdevice_get_stats;
@@ -555,7 +563,8 @@ static int cycx_netdevice_stop(struct ne* Return: media header length. */ static int cycx_netdevice_hard_header (struct sk_buff *skb,struct net_device *dev,u16 type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr, +unsigned len) { skb->protocol = type;
drivers/net/wan/dlci.c +7 -3
@@ -66,8 +66,8 @@ static void dlci_setup(struct net_device*/ static int dlci_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct frhdr hdr;struct dlci_local *dlp;
@@ -485,6 +485,10 @@ static int dlci_ioctl(unsigned int cmd,return (err); } +static const struct header_ops dlci_header_ops = { + .create = dlci_header, +}; +static void dlci_setup (struct net_device *dev) {struct dlci_local *dlp = dev->priv;
@@ -494,7 +498,7 @@ static void dlci_setup(struct net_device dev->stop = dlci_close; dev->do_ioctl = dlci_dev_ioctl; dev->hard_start_xmit = dlci_transmit; - dev->hard_header = dlci_header; + dev->header_ops = &dlci_header_ops; dev->get_stats = dlci_get_stats; dev->change_mtu = dlci_change_mtu; dev->destructor = free_netdev;
drivers/net/wan/hdlc.c +4 -6
@@ -222,6 +222,8 @@ int hdlc_ioctl(struct net_device *dev, sreturn -EINVAL ; } +static const struct header_ops hdlc_null_ops; +static void hdlc_setup_dev (struct net_device *dev) {/* Re-init all variables changed by HDLC protocol drivers,
@@ -233,13 +235,9 @@ static void hdlc_setup_dev(struct net_de dev->type =ARPHRD_RAWHDLC ; dev->hard_header_len =16 ; dev->addr_len =0 ; - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; - dev->set_mac_address =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; + dev->header_ops = &hdlc_null_ops; + dev->change_mtu = hdlc_change_mtu; - dev->hard_header_parse =NULL ; }static void hdlc_setup (struct net_device *dev)
drivers/net/wan/hdlc_cisco.c +6 -4
@@ -74,7 +74,7 @@ static inline struct cisco_state * statestatic int cisco_hard_header (struct sk_buff *skb,struct net_device *dev, -u16 type,void *daddr,void *saddr, +u16 type,const void *daddr,const void *saddr,unsigned int len) {struct hdlc_header *data;
@@ -309,7 +309,6 @@ static void cisco_stop(struct net_device } -static struct hdlc_proto proto = { .start = cisco_start, .stop = cisco_stop,
@@ -317,7 +316,10 @@ static struct hdlc_proto proto = { .ioctl = cisco_ioctl, .module = THIS_MODULE, }; - + +static const struct header_ops cisco_header_ops = { + .create = cisco_hard_header, +};static int cisco_ioctl (struct net_device *dev,struct ifreq *ifr) {
@@ -365,7 +367,7 @@ static int cisco_ioctl(struct net_devicememcpy (&state (hdlc)->settings, &new_settings, size); dev->hard_start_xmit = hdlc->xmit; - dev->hard_header = cisco_hard_header; + dev->header_ops = &cisco_header_ops; dev->type =ARPHRD_CISCO ;netif_dormant_on (dev);return 0 ;
drivers/net/wan/hdlc_ppp.c +1 -1
@@ -73,7 +73,7 @@ static void ppp_close(struct net_devicesppp_close (dev);sppp_detach (dev); - dev->rebuild_header =NULL ; + dev->change_mtu =state (hdlc)->old_change_mtu; dev->mtu =HDLC_MAX_MTU ; dev->hard_header_len =16 ;
drivers/net/wan/lmc/lmc_proto.c +1 -1
@@ -111,7 +111,7 @@ void lmc_proto_attach(lmc_softc_t *sc) /* They set a few basics because they don't use sync_ppp */ dev->flags |=IFF_POINTOPOINT ; - dev->hard_header =NULL ; + dev->hard_header_len =0 ; dev->addr_len =0 ; }
drivers/net/wan/syncppp.c +9 -10
@@ -358,8 +358,10 @@ done:* Handle transmit packets. */ -static int sppp_hard_header (struct sk_buff *skb,struct net_device *dev,__u16 type, -void *daddr,void *saddr,unsigned int len) +static int sppp_hard_header (struct sk_buff *skb, +struct net_device *dev,__u16 type, +const void *daddr,const void *saddr, +unsigned int len) {struct sppp *sp = (struct sppp *)sppp_of (dev);struct ppp_header *h;
@@ -391,10 +393,9 @@ static int sppp_hard_header(struct sk_bureturn sizeof (struct ppp_header ); } -static int sppp_rebuild_header (struct sk_buff *skb) -{ -return 0 ; -} +static const struct header_ops sppp_header_ops = { + .create = sppp_hard_header, +};/* * Send keepalive packets, every 10 seconds.
@@ -1097,8 +1098,8 @@ void sppp_attach(struct ppp_device *pd)* hard_start_xmit. */ - dev->hard_header = sppp_hard_header; - dev->rebuild_header = sppp_rebuild_header; + dev->header_ops = &sppp_header_ops; + dev->tx_queue_len =10 ; dev->type =ARPHRD_HDLC ; dev->addr_len =0 ;
@@ -1114,8 +1115,6 @@ void sppp_attach(struct ppp_device *pd) dev->stop = sppp_close;#endif dev->change_mtu = sppp_change_mtu; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; dev->flags =IFF_MULTICAST |IFF_POINTOPOINT |IFF_NOARP ; }
drivers/net/wireless/strip.c +9 -4
@@ -1630,8 +1630,8 @@ static void strip_IdleTask(unsigned long*/ static int strip_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct strip *strip_info =netdev_priv (dev);STRIP_Header *header = (STRIP_Header *)skb_push (skb,sizeof (STRIP_Header));
@@ -2496,6 +2496,11 @@ static int strip_close_low(struct net_dereturn 0 ; } +static const struct header_ops strip_header_ops = { + .create = strip_header, + .rebuild = strip_rebuild_header, +}; +/* * This routine is called by DDI when the * (dynamically assigned) device is registered
@@ -2532,8 +2537,8 @@ static void strip_dev_setup(struct net_d dev->open = strip_open_low; dev->stop = strip_close_low; dev->hard_start_xmit = strip_xmit; - dev->hard_header = strip_header; - dev->rebuild_header = strip_rebuild_header; + dev->header_ops = &strip_header_ops; + dev->set_mac_address = strip_set_mac_address; dev->get_stats = strip_get_stats; dev->change_mtu = strip_change_mtu;
drivers/net/myri_sbus.c +18 -10
@@ -682,8 +682,9 @@ static int myri_start_xmit(struct sk_buf* saddr=NULL means use device source address * daddr=NULL means leave destination address (eg unresolved arp) */ -static int myri_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int myri_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct ethhdr *eth = (struct ethhdr *)skb_push (skb,ETH_HLEN );unsigned char *pad = (unsigned char *)skb_push (skb,MYRI_PAD_LEN );
@@ -765,18 +766,18 @@ static int myri_rebuild_header(struct skreturn 0 ; } -int myri_header_cache (struct neighbour *neigh,struct hh_cache *hh) +static int myri_header_cache (const struct neighbour *neigh,struct hh_cache *hh) {unsigned short type = hh->hh_type;unsigned char *pad;struct ethhdr *eth; -struct net_device *dev = neigh->dev; +const struct net_device *dev = neigh->dev; pad = ((unsigned char *) hh->hh_data) +HH_DATA_OFF (sizeof (*eth) +MYRI_PAD_LEN ); eth = (struct ethhdr *) (pad +MYRI_PAD_LEN ); -if (type ==__constant_htons (ETH_P_802_3 )) +if (type ==htons (ETH_P_802_3 ))return -1 ;/* Refill MyriNet padding identifiers, this is just being anal. */
@@ -792,7 +793,9 @@ int myri_header_cache(struct neighbour */* Called by Address Resolution module to notify changes in address. */ -void myri_header_cache_update (struct hh_cache *hh,struct net_device *dev,unsigned char * haddr) +void myri_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char * haddr) {memcpy (((u8 *)hh->hh_data) +HH_DATA_OFF (sizeof (struct ethhdr )), haddr, dev->addr_len);
@@ -890,6 +893,13 @@ static void dump_eeprom(struct myri_eth }#endif +static const struct header_ops myri_header_ops = { + .create = myri_header, + .rebuild = myri_rebuild_header, + .cache = myri_header_cache, + .cache_update = myri_header_cache_update, +}; +static int __devinit myri_ether_init (struct sbus_dev *sdev) {static int num;
@@ -1075,11 +1085,9 @@ static int __devinit myri_ether_init(str dev->mtu =MYRINET_MTU ; dev->change_mtu = myri_change_mtu; - dev->hard_header = myri_header; - dev->rebuild_header = myri_rebuild_header; + dev->header_ops = &myri_header_ops; + dev->hard_header_len = (ETH_HLEN +MYRI_PAD_LEN ); - dev->hard_header_cache = myri_header_cache; - dev->header_cache_update= myri_header_cache_update;/* Load code onto the LANai. */ DET (("Loading LANAI firmware\n" ));
Signature · 1 line
Stephen Hemminger <[email protected]>
David Miller
maintainerFrom: Stephen Hemminger <[email protected]>
Date: Fri, 24 Aug 2007 13:43:10 -0700
Quoted 9 lines
The follow patches series starts the process of moving function pointers out of network device structure. This saves space and separates code from data.
The first step is moving the functions dealing with hardware headers.
Patches are against current net-2.6.24 tree. Basic functional testing on ethernet part, not on all the other protocols affected.
Stephen, can you respin these against net-2.6.24 and resubmit?
Thanks!
PATCH 1/3 net-2.6.24: wrap netdevice hardware header creation
Add inline for common usage of hardware header creation, and fix bug in IPV6 mcast where the assumption about negative return is an errno. Negative return from hard_header means not enough space was available,(ie -N bytes).
include/linux/netdevice.h +9 -0
@@ -801,6 +801,15 @@ extern int dev_restart(struct net_devicextern int netpoll_trap (void );#endif +static inline int dev_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +void *daddr,void *saddr,unsigned len) +{ +if (!dev->hard_header) +return 0 ; +return dev->hard_header (skb, dev, type, daddr, saddr, len); +} +typedef int gifconf_func_t (struct net_device * dev,char __user * bufptr,int len);extern int register_gifconf (unsigned int family,gifconf_func_t * gifconf);static inline int unregister_gifconf (unsigned int family)
net/ipv4/arp.c +1 -2
@@ -591,8 +591,7 @@ struct sk_buff *arp_create(int type, int/* * Fill the device header for the ARP frame */ -if (dev->hard_header && - dev->hard_header (skb,dev,ptype,dest_hw,src_hw,skb->len) <0 ) +if (dev_hard_header (skb, dev, ptype, dest_hw, src_hw, skb->len) <0 ) goto out;/*
net/core/neighbour.c +8 -9
@@ -1125,9 +1125,8 @@ int neigh_compat_output(struct sk_buff *__skb_pull (skb,skb_network_offset (skb)); -if (dev->hard_header && - dev->hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , - skb->len) <0 && +if (dev_hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , + skb->len) <0 && dev->rebuild_header (skb))return 0 ;
@@ -1154,13 +1153,13 @@ int neigh_resolve_output(struct sk_buffwrite_lock_bh (&neigh->lock);if (!dst->hh)neigh_hh_init (neigh, dst, dst->ops->protocol); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);write_unlock_bh (&neigh->lock); }else {read_lock_bh (&neigh->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);read_unlock_bh (&neigh->lock); }if (err >=0 )
@@ -1191,8 +1190,8 @@ int neigh_connected_output(struct sk_buf__skb_pull (skb,skb_network_offset (skb));read_lock_bh (&neigh->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), - neigh->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + neigh->ha,NULL , skb->len);read_unlock_bh (&neigh->lock);if (err >=0 ) err = neigh->ops->queue_xmit (skb);
net/8021q/vlan_dev.c +6 -8
@@ -434,21 +434,19 @@ int vlan_dev_hard_header(struct sk_buffif (build_vlan_header) {/* Now make the underlying real hard header */ - rc = dev->hard_header (skb, dev,ETH_P_8021Q , daddr, saddr, len +VLAN_HLEN ); - -if (rc >0 ) { + rc =dev_hard_header (skb, dev,ETH_P_8021Q , daddr, saddr, + len +VLAN_HLEN ); +if (rc >0 ) rc +=VLAN_HLEN ; - }else if (rc <0 ) { +else if (rc <0 ) rc -=VLAN_HLEN ; - } - }else { + }else /* If here, then we'll just make a normal looking ethernet frame, * but, the hard_start_xmit method will insert the tag (it has to * be able to do this for bridged and other skbs that don't come * down the protocol stack in an orderly manner. */ - rc = dev->hard_header (skb, dev, type, daddr, saddr, len); - } + rc =dev_hard_header (skb, dev, type, daddr, saddr, len);return rc; }
net/core/netpoll.c +3 -5
@@ -415,11 +415,9 @@ static void arp_reply(struct sk_buff *sk send_skb->protocol =htons (ETH_P_ARP );/* Fill the device header for the ARP frame */ - -if (np->dev->hard_header && - np->dev->hard_header (send_skb, skb->dev, ptype, - sha, np->local_mac, - send_skb->len) <0 ) { +if (dev_hard_header (send_skb, skb->dev, ptype, + sha, np->local_mac, + send_skb->len) <0 ) {kfree_skb (send_skb);return ; }
net/packet/af_packet.c +4 -10
@@ -765,16 +765,10 @@ static int packet_sendmsg(struct kiocb *skb_reserve (skb,LL_RESERVED_SPACE (dev));skb_reset_network_header (skb); -if (dev->hard_header) { -int res; - err = -EINVAL ; - res = dev->hard_header (skb, dev,ntohs (proto), addr,NULL , len); -if (sock->type !=SOCK_DGRAM ) { -skb_reset_tail_pointer (skb); - skb->len =0 ; - }else if (res <0 ) - goto out_free; - } + err = -EINVAL ; +if (sock->type ==SOCK_DGRAM && +dev_hard_header (skb, dev,ntohs (proto), addr,NULL , len) <0 ) + goto out_free;/* Returns -EFAULT on error */ err =memcpy_fromiovec (skb_put (skb,len), msg->msg_iov, len);
net/802/p8023.c +1 -1
@@ -31,7 +31,7 @@ static int p8023_request(struct datalink {struct net_device *dev = skb->dev; - dev->hard_header (skb, dev,ETH_P_802_3 , dest_node,NULL , skb->len); +dev_hard_header (skb, dev,ETH_P_802_3 , dest_node,NULL , skb->len);return dev_queue_xmit (skb); }
net/decnet/dn_neigh.c +2 -1
@@ -211,7 +211,8 @@ static int dn_neigh_output_packet(structchar mac_addr[ETH_ALEN ];dn_dn2eth (mac_addr, rt->rt_local_src); -if (!dev->hard_header || dev->hard_header (skb, dev,ntohs (skb->protocol), neigh->ha, mac_addr, skb->len) >=0 ) +if (dev_hard_header (skb, dev,ntohs (skb->protocol), neigh->ha, + mac_addr, skb->len) >=0 )return neigh->ops->queue_xmit (skb);if (net_ratelimit ())
net/econet/af_econet.c +7 -7
@@ -336,6 +336,7 @@ static int econet_sendmsg(struct kiocb */* Real hardware Econet. We're not worthy etc. */ #ifdef CONFIG_ECONET_NATIVE unsigned short proto =0 ; +int res;dev_hold (dev);
@@ -354,12 +355,12 @@ static int econet_sendmsg(struct kiocb * eb->sec = *saddr; eb->sent = ec_tx_done; -if (dev->hard_header) { -int res; + err = -EINVAL ; + res =dev_hard_header (skb, dev,ntohs (proto), &addr,NULL , len); +if (res <0 ) + goto out_free; +if (res >0 ) {struct ec_framehdr *fh; - err = -EINVAL ; - res = dev->hard_header (skb, dev,ntohs (proto), - &addr,NULL , len);/* Poke in our control byte and port number. Hack, hack. */ fh = (struct ec_framehdr *)(skb->data);
@@ -368,8 +369,7 @@ static int econet_sendmsg(struct kiocb *if (sock->type !=SOCK_DGRAM ) {skb_reset_tail_pointer (skb); skb->len =0 ; - }else if (res <0 ) - goto out_free; + } }/* Copy the data. Returns -EFAULT on error */
net/ethernet/pe2.c +1 -3
@@ -12,9 +12,7 @@ static int pEII_request(struct datalink_struct net_device *dev = skb->dev; skb->protocol =htons (ETH_P_IPX ); -if (dev->hard_header) - dev->hard_header (skb, dev,ETH_P_IPX , - dest_node,NULL , skb->len); +dev_hard_header (skb, dev,ETH_P_IPX , dest_node,NULL , skb->len);return dev_queue_xmit (skb); }
net/ipv4/ipconfig.c +2 -2
@@ -753,8 +753,8 @@ static void __init ic_bootp_send_if(stru/* Chain packet down the line... */ skb->dev = dev; skb->protocol =htons (ETH_P_IP ); -if ((dev->hard_header && - dev->hard_header (skb, dev,ntohs (skb->protocol), dev->broadcast, dev->dev_addr, skb->len) <0 ) || +if (dev_hard_header (skb, dev,ntohs (skb->protocol), + dev->broadcast, dev->dev_addr, skb->len) < 0) || dev_queue_xmit(skb) < 0)printk ("E" ); }
net/ipv6/mcast.c +5 -10
@@ -1438,17 +1438,12 @@ static struct sk_buff *mld_newpack(strucstatic inline int mld_dev_queue_xmit2 (struct sk_buff *skb) {struct net_device *dev = skb->dev; +unsigned char ha[MAX_ADDR_LEN ]; -if (dev->hard_header) { -unsigned char ha[MAX_ADDR_LEN ]; -int err; - -ndisc_mc_map (&ipv6_hdr (skb)->daddr, ha, dev,1 ); - err = dev->hard_header (skb, dev,ETH_P_IPV6 , ha,NULL , skb->len); -if (err <0 ) { -kfree_skb (skb); -return err; - } +ndisc_mc_map (&ipv6_hdr (skb)->daddr, ha, dev,1 ); +if (dev_hard_header (skb, dev,ETH_P_IPV6 , ha,NULL , skb->len) <0 ) { +kfree_skb (skb); +return -EINVAL ; }return dev_queue_xmit (skb); }
net/sched/sch_teql.c +4 -1
@@ -232,9 +232,12 @@ __teql_resolve(struct sk_buff *skb, stru }if (neigh_event_send (n, skb_res) ==0 ) {int err; +read_lock (&n->lock); - err = dev->hard_header (skb, dev,ntohs (skb->protocol), n->ha,NULL , skb->len); + err =dev_hard_header (skb, dev,ntohs (skb->protocol), + n->ha,NULL , skb->len);read_unlock (&n->lock); +if (err <0 ) {neigh_release (n);return -EINVAL ;
net/tipc/eth_media.c +1 -1
@@ -77,7 +77,7 @@ static int send_msg(struct sk_buff *buf,skb_reset_network_header (clone); dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; clone->dev = dev; - dev->hard_header (clone, dev,ETH_P_TIPC , +dev_hard_header (clone, dev,ETH_P_TIPC , &dest->dev_addr.eth_addr, dev->dev_addr, clone->len);dev_queue_xmit (clone);
drivers/net/hamradio/bpqether.c +1 -1
@@ -286,7 +286,7 @@ static int bpq_xmit(struct sk_buff *skb, skb->protocol =ax25_type_trans (skb, dev);skb_reset_network_header (skb); - dev->hard_header (skb, dev,ETH_P_BPQ , bpq->dest_addr,NULL ,0 ); +dev_hard_header (skb, dev,ETH_P_BPQ , bpq->dest_addr,NULL ,0 ); bpq->stats.tx_packets++; bpq->stats.tx_bytes+=skb->len;
drivers/net/macvlan.c +2 -2
@@ -170,8 +170,8 @@ static int macvlan_hard_header(struct skconst struct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev; -return lowerdev->hard_header (skb, lowerdev, type, daddr, - saddr ? : dev->dev_addr, len); +return dev_hard_header (skb, lowerdev, type, daddr, + saddr ? : dev->dev_addr, len); }static int macvlan_open (struct net_device *dev)
drivers/net/pppoe.c +4 -4
@@ -834,8 +834,8 @@ static int pppoe_sendmsg(struct kiocb *i } error = total_len; - dev->hard_header (skb, dev,ETH_P_PPP_SES , - po->pppoe_pa.remote,NULL , total_len); +dev_hard_header (skb, dev,ETH_P_PPP_SES , + po->pppoe_pa.remote,NULL , total_len);memcpy (ph, &hdr,sizeof (struct pppoe_hdr ));
@@ -886,8 +886,8 @@ static int __pppoe_xmit(struct sock *sk, skb->protocol =__constant_htons (ETH_P_PPP_SES ); skb->dev = dev; - dev->hard_header (skb, dev,ETH_P_PPP_SES , - po->pppoe_pa.remote,NULL , data_len); +dev_hard_header (skb, dev,ETH_P_PPP_SES , + po->pppoe_pa.remote,NULL , data_len);dev_queue_xmit (skb);
include/net/dn_route.h +1 -2
@@ -100,8 +100,7 @@ static inline void dn_rt_finish_output(sif ((dev->type !=ARPHRD_ETHER ) && (dev->type !=ARPHRD_LOOPBACK )) dst =NULL ; -if (!dev->hard_header || (dev->hard_header (skb, dev,ETH_P_DNA_RT , - dst, src, skb->len) >=0 )) +if (dev_hard_header (skb, dev,ETH_P_DNA_RT , dst, src, skb->len) >=0 )dn_rt_send (skb);else kfree_skb (skb);
drivers/net/wan/lapbether.c +1 -1
@@ -216,7 +216,7 @@ static void lapbeth_data_transmit(struct skb->dev = dev = lapbeth->ethdev; - dev->hard_header (skb, dev,ETH_P_DEC , bcast_addr,NULL ,0 ); +dev_hard_header (skb, dev,ETH_P_DEC , bcast_addr,NULL ,0 );dev_queue_xmit (skb); }
PATCH 3/3 net-2.6.24: move hardware header operations out of netdevice
Since hardware header operations are part of the protocol class not the device instance, make them into a separate object and save memory.
drivers/net/loopback.c +2 -6
@@ -199,22 +199,17 @@ static const struct ethtool_ops loopback };/* -* The loopback device is special. There is only one instance and -* it is statically allocated. Don't do this for other devices. +* The loopback device is special. There is only one instance. */ static void loopback_setup (struct net_device *dev) { dev->get_stats = &get_stats; dev->mtu = (16 *1024 ) +20 +20 +12 ; dev->hard_start_xmit = loopback_xmit; - dev->hard_header = eth_header; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update = eth_header_cache_update; dev->hard_header_len =ETH_HLEN ;/* 14 */ dev->addr_len =ETH_ALEN ;/* 6 */ dev->tx_queue_len =0 ; dev->type =ARPHRD_LOOPBACK ;/* 0x0001*/ - dev->rebuild_header = eth_rebuild_header; dev->flags =IFF_LOOPBACK ; dev->features = NETIF_F_SG | NETIF_F_FRAGLIST#ifdef LOOPBACK_TSO
@@ -225,6 +220,7 @@ static void loopback_setup(struct net_de | NETIF_F_LLTX |NETIF_F_NETNS_LOCAL , dev->ethtool_ops = &loopback_ethtool_ops; + dev->header_ops = ð_header_ops; }/* Setup and register the loopback device. */
include/linux/etherdevice.h +12 -8
@@ -29,15 +29,19 @@#include <linux/random.h> #ifdef __KERNEL__ -extern int eth_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr, -void *saddr,unsigned len); -extern int eth_rebuild_header (struct sk_buff *skb);extern __be16 eth_type_trans (struct sk_buff *skb,struct net_device *dev); -extern void eth_header_cache_update (struct hh_cache *hh,struct net_device *dev, -unsigned char * haddr); -extern int eth_header_cache (struct neighbour *neigh, -struct hh_cache *hh); +extern const struct header_ops eth_header_ops; + +extern int eth_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len); +extern int eth_rebuild_header (struct sk_buff *skb); +extern int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr); +extern int eth_header_cache (const struct neighbour *neigh,struct hh_cache *hh); +extern void eth_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char *haddr); +extern struct net_device *alloc_etherdev_mq (int sizeof_priv,unsigned int queue_count);#define alloc_etherdev (sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
include/linux/netdevice.h +23 -20
88 lines not on this page · raw message
include/net/pkt_sched.h +2 -3
@@ -97,10 +97,9 @@ extern int tc_classify(struct sk_buff *s/* Calculate maximal size of packet seen by hard_start_xmit routine of this device. */ -static inline unsigned psched_mtu (struct net_device *dev) +static inline unsigned psched_mtu (const struct net_device *dev) { -unsigned mtu = dev->mtu; -return dev->hard_header ? mtu + dev->hard_header_len : mtu; +return dev->mtu + dev->hard_header_len; }#endif
net/core/dev.c +0 -16
@@ -973,14 +973,6 @@ void dev_load(struct net *net, const charequest_module ("%s" , name); } -static int default_rebuild_header (struct sk_buff *skb) -{ -printk (KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n" , - skb->dev ? skb->dev->name :"NULL!!!" ); -kfree_skb (skb); -return 1 ; -} -/** * dev_open - prepare an interface for use. * @dev: device to open
@@ -3565,14 +3557,6 @@ int register_netdevice(struct net_device } } -/* -* nil rebuild_header routine, -* that should be never called and used as just bug trap. -*/ - -if (!dev->rebuild_header) - dev->rebuild_header = default_rebuild_header; - ret =netdev_register_sysfs (dev);if (ret) goto err_uninit;
net/core/neighbour.c +6 -5
@@ -897,8 +897,8 @@ out_unlock_bh:static void neigh_update_hhs (struct neighbour *neigh) {struct hh_cache *hh; -void (*update)(struct hh_cache *,struct net_device *,unsigned char *) = - neigh->dev->header_cache_update; +void (*update)(struct hh_cache *,const struct net_device *,const unsigned char *) + = neigh->dev->header_ops->cache_update;if (update) {for (hh = neigh->hh; hh; hh = hh->hh_next) {
@@ -1095,7 +1095,8 @@ static void neigh_hh_init(struct neighbo hh->hh_type = protocol;atomic_set (&hh->hh_refcnt,0 ); hh->hh_next =NULL ; -if (dev->hard_header_cache (n, hh)) { + +if (dev->header_ops->cache (n, hh)) {kfree (hh); hh =NULL ; }else {
@@ -1127,7 +1128,7 @@ int neigh_compat_output(struct sk_buff *if (dev_hard_header (skb, dev,ntohs (skb->protocol),NULL ,NULL , skb->len) <0 && - dev->rebuild_header (skb)) + dev->header_ops->rebuild (skb))return 0 ;return dev_queue_xmit (skb);
@@ -1149,7 +1150,7 @@ int neigh_resolve_output(struct sk_buffif (!neigh_event_send (neigh, skb)) {int err;struct net_device *dev = neigh->dev; -if (dev->hard_header_cache && !dst->hh) { +if (dev->header_ops->cache && !dst->hh) {write_lock_bh (&neigh->lock);if (!dst->hh)neigh_hh_init (neigh, dst, dst->ops->protocol);
net/ethernet/eth.c +24 -12
@@ -75,8 +75,9 @@ __setup("ether=", netdev_boot_setup);* Set the protocol type. For a packet of type ETH_P_802_3 we put the length * in here instead. It is up to the 802.2 layer to carry protocol information. */ -int eth_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +int eth_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct ethhdr *eth = (struct ethhdr *)skb_push (skb,ETH_HLEN );
@@ -109,6 +110,7 @@ int eth_header(struct sk_buff *skb, strureturn -ETH_HLEN ; } +EXPORT_SYMBOL (eth_header);/** * eth_rebuild_header- rebuild the Ethernet MAC header.
@@ -141,6 +143,7 @@ int eth_rebuild_header(struct sk_buff *sreturn 0 ; } +EXPORT_SYMBOL (eth_rebuild_header);/** * eth_type_trans - determine the packet's protocol ID.
@@ -207,12 +210,13 @@ EXPORT_SYMBOL(eth_type_trans);* @skb: packet to extract header from * @haddr: destination buffer */ -static int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) +int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) {const struct ethhdr *eth =eth_hdr (skb);memcpy (haddr, eth->h_source,ETH_ALEN );return ETH_ALEN ; } +EXPORT_SYMBOL (eth_header_parse);/** * eth_header_cache - fill cache entry from neighbour
@@ -220,11 +224,11 @@ static int eth_header_parse(const struct* @hh: destination cache entry * Create an Ethernet header template from the neighbour. */ -int eth_header_cache (struct neighbour *neigh,struct hh_cache *hh) +int eth_header_cache (const struct neighbour *neigh,struct hh_cache *hh) {__be16 type = hh->hh_type;struct ethhdr *eth; -struct net_device *dev = neigh->dev; +const struct net_device *dev = neigh->dev; eth = (struct ethhdr *) (((u8 *) hh->hh_data) + (HH_DATA_OFF (sizeof (*eth))));
@@ -238,6 +242,7 @@ int eth_header_cache(struct neighbour *n hh->hh_len =ETH_HLEN ;return 0 ; } +EXPORT_SYMBOL (eth_header_cache);/** * eth_header_cache_update - update cache entry
@@ -247,12 +252,14 @@ int eth_header_cache(struct neighbour *n* * Called by Address Resolution module to notify changes in address. */ -void eth_header_cache_update (struct hh_cache *hh,struct net_device *dev, -unsigned char *haddr) +void eth_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char *haddr) {memcpy (((u8 *) hh->hh_data) +HH_DATA_OFF (sizeof (struct ethhdr )), haddr,ETH_ALEN ); } +EXPORT_SYMBOL (eth_header_cache_update);/** * eth_mac_addr - set new Ethernet hardware address
@@ -291,6 +298,14 @@ static int eth_change_mtu(struct net_devreturn 0 ; } +const struct header_ops eth_header_ops____cacheline_aligned = { + .create = eth_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +/** * ether_setup - setup Ethernet network device * @dev: network device
@@ -298,13 +313,10 @@ static int eth_change_mtu(struct net_dev*/ void ether_setup (struct net_device *dev) { + dev->header_ops = ð_header_ops; + dev->change_mtu = eth_change_mtu; - dev->hard_header = eth_header; - dev->rebuild_header = eth_rebuild_header; dev->set_mac_address = eth_mac_addr; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update= eth_header_cache_update; - dev->hard_header_parse = eth_header_parse; dev->type =ARPHRD_ETHER ; dev->hard_header_len =ETH_HLEN ;
net/ipv4/arp.c +4 -2
@@ -253,7 +253,7 @@ static int arp_constructor(struct neighb neigh->parms =neigh_parms_clone (parms);rcu_read_unlock (); -if (dev->hard_header ==NULL ) { +if (!dev->header_ops) { neigh->nud_state =NUD_NOARP ; neigh->ops = &arp_direct_ops; neigh->output = neigh->ops->queue_xmit;
@@ -310,10 +310,12 @@ static int arp_constructor(struct neighb neigh->nud_state =NUD_NOARP ;memcpy (neigh->ha, dev->broadcast, dev->addr_len); } -if (dev->hard_header_cache) + +if (dev->header_ops->cache) neigh->ops = &arp_hh_ops;else neigh->ops = &arp_generic_ops; +if (neigh->nud_state&NUD_VALID ) neigh->output = neigh->ops->connected_output;else
include/linux/if_ether.h +2 -0
@@ -117,6 +117,8 @@ static inline struct ethhdr *eth_hdr(conreturn (struct ethhdr *)skb_mac_header (skb); } +int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr); +#ifdef CONFIG_SYSCTL extern struct ctl_table ether_table[];#endif
net/802/fc.c +7 -4
@@ -35,7 +35,7 @@static int fc_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct fch_hdr *fch;int hdr_len;
@@ -95,11 +95,14 @@ static int fc_rebuild_header(struct sk_b#endif } +static const struct header_ops fc_header_ops = { + .create = fc_header, + .rebuild = fc_rebuild_header, +}; +static void fc_setup (struct net_device *dev) { - dev->hard_header = fc_header; - dev->rebuild_header = fc_rebuild_header; - + dev->header_ops = &fc_header_ops; dev->type =ARPHRD_IEEE802 ; dev->hard_header_len =FC_HLEN ; dev->mtu =2024 ;
net/802/fddi.c +7 -3
@@ -52,7 +52,7 @@static int fddi_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {int hl =FDDI_K_SNAP_HLEN ;struct fddihdr *fddi;
@@ -175,11 +175,15 @@ static int fddi_change_mtu(struct net_dereturn (0 ); } +static const struct header_ops fddi_header_ops = { + .create = fddi_header, + .rebuild = fddi_rebuild_header, +}; +static void fddi_setup (struct net_device *dev) { dev->change_mtu = fddi_change_mtu; - dev->hard_header = fddi_header; - dev->rebuild_header = fddi_rebuild_header; + dev->header_ops = &fddi_header_ops; dev->type =ARPHRD_FDDI ; dev->hard_header_len =FDDI_K_SNAP_HLEN +3 ;/* Assume 802.2 SNAP hdr len + 3 pad bytes */
net/802/hippi.c +9 -7
@@ -45,8 +45,8 @@*/ static int hippi_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct hippi_hdr *hip = (struct hippi_hdr *)skb_push (skb,HIPPI_HLEN );struct hippi_cb *hcb = (struct hippi_cb *) skb->cb;
@@ -182,16 +182,18 @@ static int hippi_neigh_setup_dev(structreturn 0 ; } +static const struct header_ops hippi_header_ops = { + .create = hippi_header, + .rebuild = hippi_rebuild_header, +}; + +static void hippi_setup (struct net_device *dev) { dev->set_multicast_list =NULL ; dev->change_mtu = hippi_change_mtu; - dev->hard_header = hippi_header; - dev->rebuild_header = hippi_rebuild_header; + dev->header_ops = &hippi_header_ops; dev->set_mac_address = hippi_mac_addr; - dev->hard_header_parse =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; dev->neigh_setup = hippi_neigh_setup_dev;/*
net/802/tr.c +10 -5
@@ -100,7 +100,7 @@ static inline unsigned long rif_hash(constatic int tr_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct trh_hdr *trh;int hdr_len;
@@ -142,7 +142,7 @@ static int tr_header(struct sk_buff *skbif (daddr) {memcpy (trh->daddr,daddr,dev->addr_len); -tr_source_route (skb,trh,dev); +tr_source_route (skb, trh, dev);return (hdr_len); }
@@ -247,7 +247,8 @@ __be16 tr_type_trans(struct sk_buff *skb* We try to do source routing... */ -void tr_source_route (struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev) +void tr_source_route (struct sk_buff *skb,struct trh_hdr *trh, +struct net_device *dev) {int slack;unsigned int hash;
@@ -592,14 +593,18 @@ static const struct file_operations rif_#endif +static const struct header_ops tr_header_ops = { + .create = tr_header, + .rebuild= tr_rebuild_header, +}; +static void tr_setup (struct net_device *dev) {/* * Configure and register */ - dev->hard_header = tr_header; - dev->rebuild_header = tr_rebuild_header; + dev->header_ops = &tr_header_ops; dev->type =ARPHRD_IEEE802_TR ; dev->hard_header_len =TR_HLEN ;
net/8021q/vlan.c +8 -6
@@ -314,6 +314,12 @@ int unregister_vlan_device(struct net_de*/ static struct lock_class_key vlan_netdev_xmit_lock_key; +static const struct header_ops vlan_header_ops = { + .create = vlan_dev_hard_header, + .rebuild = vlan_dev_rebuild_header, + .parse = eth_header_parse, +}; +static int vlan_dev_init (struct net_device *dev) {struct net_device *real_dev =VLAN_DEV_INFO (dev)->real_dev;
@@ -331,18 +337,14 @@ static int vlan_dev_init(struct net_devimemcpy (dev->broadcast, real_dev->broadcast, dev->addr_len);if (real_dev->features &NETIF_F_HW_VLAN_TX ) { - dev->hard_header = real_dev->hard_header; + dev->header_ops = real_dev->header_ops; dev->hard_header_len = real_dev->hard_header_len; dev->hard_start_xmit = vlan_dev_hwaccel_hard_start_xmit; - dev->rebuild_header = real_dev->rebuild_header; }else { - dev->hard_header = vlan_dev_hard_header; + dev->header_ops = &vlan_header_ops; dev->hard_header_len = real_dev->hard_header_len +VLAN_HLEN ; dev->hard_start_xmit = vlan_dev_hard_start_xmit; - dev->rebuild_header = vlan_dev_rebuild_header; } - dev->hard_header_parse = real_dev->hard_header_parse; - dev->hard_header_cache =NULL ;lockdep_set_class (&dev->_xmit_lock, &vlan_netdev_xmit_lock_key);return 0 ;
drivers/net/arcnet/arcnet.c +11 -7
@@ -102,8 +102,8 @@ static int arcnet_close(struct net_devicstatic int arcnet_send_packet (struct sk_buff *skb,struct net_device *dev);static void arcnet_timeout (struct net_device *dev);static int arcnet_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);static int arcnet_rebuild_header (struct sk_buff *skb);static struct net_device_stats *arcnet_get_stats (struct net_device *dev);static int go_tx (struct net_device *dev);
@@ -317,11 +317,17 @@ static int choose_mtu(void)return mtu ==65535 ?XMTU : mtu; } +static const struct header_ops arcnet_header_ops = { + .create = arcnet_header, + .rebuild = arcnet_rebuild_header, +}; +/* Setup a struct device for ARCnet. */ static void arcdev_setup (struct net_device *dev) { dev->type =ARPHRD_ARCNET ; + dev->header_ops = &arcnet_header_ops; dev->hard_header_len =sizeof (struct archdr ); dev->mtu =choose_mtu ();
@@ -342,8 +348,6 @@ static void arcdev_setup(struct net_devi dev->hard_start_xmit = arcnet_send_packet; dev->tx_timeout = arcnet_timeout; dev->get_stats = arcnet_get_stats; - dev->hard_header = arcnet_header; - dev->rebuild_header = arcnet_rebuild_header; }struct net_device *alloc_arcdev (char *name)
@@ -488,10 +492,10 @@ static int arcnet_close(struct net_devicstatic int arcnet_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) { -struct arcnet_local *lp = dev->priv; +const struct arcnet_local *lp =netdev_priv (dev);uint8_t _daddr, proto_num;struct ArcProto *proto;
drivers/net/hamradio/6pack.c +11 -4
@@ -3,7 +3,7 @@* devices like TTY. It interfaces between a raw TTY and the * kernel's AX.25 protocol layers. * -* Authors: Andreas Könsgen <[email protected]> +* Authors: Andreas Könsgen <[email protected]> * Ralf Baechle DL5RB <[email protected]> * * Quite a lot of stuff "stolen" by Joerg Reuter from slip.c, written by
@@ -288,7 +288,8 @@ static int sp_close(struct net_device *d/* Return the frame type ID */ static int sp_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr,unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {#ifdef CONFIG_INET if (type !=htons (ETH_P_AX25 ))
@@ -323,6 +324,11 @@ static int sp_rebuild_header(struct sk_b#endif } +static const struct header_ops sp_header_ops = { + .create = sp_header, + .rebuild = sp_rebuild_header, +}; +static void sp_setup (struct net_device *dev) {/* Finish setting up the DEVICE info. */
@@ -331,14 +337,15 @@ static void sp_setup(struct net_device * dev->open = sp_open_dev; dev->destructor = free_netdev; dev->stop = sp_close; - dev->hard_header = sp_header; + dev->get_stats = sp_get_stats; dev->set_mac_address = sp_set_mac_address; dev->hard_header_len =AX25_MAX_HEADER_LEN ; + dev->header_ops = &sp_header_ops; + dev->addr_len =AX25_ADDR_LEN ; dev->type =ARPHRD_AX25 ; dev->tx_queue_len =10 ; - dev->rebuild_header = sp_rebuild_header; dev->tx_timeout =NULL ;/* Only activated in AX.25 mode */
drivers/net/hamradio/bpqether.c +1 -2
@@ -483,8 +483,7 @@ static void bpq_setup(struct net_device dev->flags =0 ;#if defined(CONFIG_AX25 ) || defined(CONFIG_AX25_MODULE ) - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops;#endif dev->type =ARPHRD_AX25 ;
drivers/net/hamradio/dmascc.c +1 -2
@@ -581,8 +581,7 @@ static int __init setup_adapter(int card dev->do_ioctl = scc_ioctl; dev->hard_start_xmit = scc_send_packet; dev->get_stats = scc_get_stats; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_hard_header_ops dev->set_mac_address = scc_set_mac_address; }if (register_netdev (info->dev[0 ])) {
drivers/net/hamradio/hdlcdrv.c +1 -2
@@ -682,8 +682,7 @@ static void hdlcdrv_setup(struct net_dev s->skb =NULL ; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops; dev->set_mac_address = hdlcdrv_set_mac_address; dev->type =ARPHRD_AX25 ;/* AF_AX25 device */
drivers/net/hamradio/mkiss.c +10 -4
@@ -578,8 +578,9 @@ static int ax_open_dev(struct net_device#if defined(CONFIG_AX25 ) || defined(CONFIG_AX25_MODULE )/* Return the frame type ID */ -static int ax_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int ax_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {#ifdef CONFIG_INET if (type !=htons (ETH_P_AX25 ))
@@ -670,6 +671,11 @@ static struct net_device_stats *ax_get_sreturn &ax->stats; } +static const struct header_ops ax_header_ops = { + .create = ax_header, + .rebuild = ax_rebuild_header, +}; +static void ax_setup (struct net_device *dev) {/* Finish setting up the DEVICE info. */
@@ -683,8 +689,8 @@ static void ax_setup(struct net_device * dev->addr_len =0 ; dev->type =ARPHRD_AX25 ; dev->tx_queue_len =10 ; - dev->hard_header = ax_header; - dev->rebuild_header = ax_rebuild_header; + dev->header_ops = &ax_header_ops; +memcpy (dev->broadcast, &ax25_bcast,AX25_ADDR_LEN );memcpy (dev->dev_addr, &ax25_defaddr,AX25_ADDR_LEN );
drivers/net/hamradio/scc.c +2 -2
@@ -1551,8 +1551,8 @@ static void scc_net_setup(struct net_dev dev->stop = scc_net_close; dev->hard_start_xmit = scc_net_tx; - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_hard_header_ops; + dev->set_mac_address = scc_net_set_mac_address; dev->get_stats = scc_net_get_stats; dev->do_ioctl = scc_net_ioctl;
drivers/net/hamradio/yam.c +1 -2
@@ -1097,8 +1097,7 @@ static void yam_setup(struct net_deviceskb_queue_head_init (&yp->send_queue); - dev->hard_header = ax25_hard_header; - dev->rebuild_header = ax25_rebuild_header; + dev->header_ops = &ax25_header_ops; dev->set_mac_address = yam_set_mac_address;
drivers/net/skfp/skfddi.c +0 -1
@@ -260,7 +260,6 @@ static int skfp_init_one(struct pci_dev dev->set_multicast_list = &skfp_ctl_set_multicast_list; dev->set_mac_address = &skfp_ctl_set_mac_address; dev->do_ioctl = &skfp_ioctl; - dev->header_cache_update =NULL ;/* not supported */ SET_NETDEV_DEV (dev, &pdev->dev);
net/appletalk/dev.c +0 -4
@@ -24,11 +24,7 @@ static void ltalk_setup(struct net_devic/* Fill in the fields of the device structure with localtalk-generic values. */ dev->change_mtu = ltalk_change_mtu; - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; dev->set_mac_address = ltalk_mac_addr; - dev->hard_header_cache =NULL ; - dev->header_cache_update=NULL ; dev->type =ARPHRD_LOCALTLK ; dev->hard_header_len =LTALK_HLEN ;
drivers/ieee1394/eth1394.c +23 -17
@@ -159,15 +159,16 @@ MODULE_PARM_DESC(max_partial_datagrams,static int ether1394_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);static int ether1394_rebuild_header (struct sk_buff *skb);static int ether1394_header_parse (const struct sk_buff *skb,unsigned char *haddr); -static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh); +static int ether1394_header_cache (const struct neighbour *neigh, +struct hh_cache *hh);static void ether1394_header_cache_update (struct hh_cache *hh, -struct net_device *dev, -unsigned char *haddr); +const struct net_device *dev, +const unsigned char *haddr);static int ether1394_tx (struct sk_buff *skb,struct net_device *dev);static void ether1394_iso (struct hpsb_iso *iso);
@@ -507,6 +508,14 @@ static void ether1394_reset_priv(structspin_unlock_irqrestore (&priv->lock, flags); } +static const struct header_ops ether1394_header_ops = { + .create = ether1394_header, + .rebuild = ether1394_rebuild_header, + .cache = ether1394_header_cache, + .cache_update = ether1394_header_cache_update, + .parse = ether1394_header_parse, +}; +static void ether1394_init_dev (struct net_device *dev) { dev->open = ether1394_open;
@@ -516,11 +525,7 @@ static void ether1394_init_dev(struct ne dev->tx_timeout = ether1394_tx_timeout; dev->change_mtu = ether1394_change_mtu; - dev->hard_header = ether1394_header; - dev->rebuild_header = ether1394_rebuild_header; - dev->hard_header_cache = ether1394_header_cache; - dev->header_cache_update= ether1394_header_cache_update; - dev->hard_header_parse = ether1394_header_parse; + dev->header_ops = ðer1394_header_ops;SET_ETHTOOL_OPS (dev, ðtool_ops);
@@ -711,8 +716,8 @@ static void ether1394_host_reset(struct* saddr=NULL means use device source address * daddr=NULL means leave destination address (eg unresolved arp). */ static int ether1394_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct eth1394hdr *eth = (struct eth1394hdr *)skb_push (skb,ETH1394_HLEN );
@@ -759,7 +764,8 @@ static int ether1394_header_parse(constreturn ETH1394_ALEN ; } -static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh) +static int ether1394_header_cache (const struct neighbour *neigh, +struct hh_cache *hh) {unsigned short type = hh->hh_type;struct net_device *dev = neigh->dev;
@@ -778,8 +784,8 @@ static int ether1394_header_cache(struct/* Called by Address Resolution module to notify changes in address. */ static void ether1394_header_cache_update (struct hh_cache *hh, -struct net_device *dev, -unsigned char * haddr) +const struct net_device *dev, +const unsigned char * haddr) {memcpy ((u8 *)hh->hh_data +16 -ETH1394_HLEN , haddr, dev->addr_len); }
@@ -899,8 +905,8 @@ static u16 ether1394_parse_encap(struct }/* Now add the ethernet header. */ -if (dev->hard_header (skb, dev,ntohs (ether_type), &dest_hw,NULL , - skb->len) >=0 ) +if (dev_hard_header (skb, dev,ntohs (ether_type), &dest_hw,NULL , + skb->len) >=0 ) ret =ether1394_type_trans (skb, dev);return ret;
net/8021q/vlan.h +2 -2
@@ -53,8 +53,8 @@ int vlan_dev_rebuild_header(struct sk_buint vlan_skb_recv (struct sk_buff *skb,struct net_device *dev,struct packet_type *ptype,struct net_device *orig_dev);int vlan_dev_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); +unsigned short type,const void *daddr, +const void *saddr,unsigned len);int vlan_dev_hard_start_xmit (struct sk_buff *skb,struct net_device *dev);int vlan_dev_hwaccel_hard_start_xmit (struct sk_buff *skb,struct net_device *dev);int vlan_dev_change_mtu (struct net_device *dev,int new_mtu);
net/8021q/vlan_dev.c +2 -2
@@ -343,8 +343,8 @@ static inline unsigned short vlan_dev_ge* physical devices. */ int vlan_dev_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct vlan_hdr *vhdr;unsigned short veth_TCI =0 ;
drivers/net/macvlan.c +12 -3
@@ -164,8 +164,8 @@ static int macvlan_hard_start_xmit(struc }static int macvlan_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {const struct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev;
@@ -174,6 +174,15 @@ static int macvlan_hard_header(struct sk saddr ? : dev->dev_addr, len); } +static const struct header_ops macvlan_hard_header_ops = { + .create = macvlan_hard_header, + .rebuild = eth_rebuild_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +static int macvlan_open (struct net_device *dev) {struct macvlan_dev *vlan =netdev_priv (dev);
@@ -295,9 +304,9 @@ static void macvlan_setup(struct net_dev dev->change_mtu = macvlan_change_mtu; dev->change_rx_flags = macvlan_change_rx_flags; dev->set_multicast_list = macvlan_set_multicast_list; - dev->hard_header = macvlan_hard_header; dev->hard_start_xmit = macvlan_hard_start_xmit; dev->destructor = free_netdev; + dev->header_ops = &macvlan_hard_header_ops, dev->ethtool_ops = &macvlan_ethtool_ops; dev->tx_queue_len =0 ; }
include/net/ax25.h +4 -1
@@ -363,8 +363,11 @@ extern int ax25_rx_iframe(ax25_cb *, stextern int ax25_kiss_rcv (struct sk_buff *,struct net_device *,struct packet_type *,struct net_device *);/* ax25_ip.c */ -extern int ax25_hard_header (struct sk_buff *,struct net_device *,unsigned short ,void *,void *,unsigned int ); +extern int ax25_hard_header (struct sk_buff *,struct net_device *, +unsigned short ,const void *, +const void *,unsigned int );extern int ax25_rebuild_header (struct sk_buff *); +extern const struct header_ops ax25_header_ops;/* ax25_out.c */ extern ax25_cb *ax25_send_frame (struct sk_buff *,int ,ax25_address *,ax25_address *,ax25_digi *,struct net_device *);
net/ax25/ax25_ip.c +13 -2
@@ -46,7 +46,9 @@#ifdef CONFIG_INET -int ax25_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr,unsigned len) +int ax25_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {unsigned char *buff;
@@ -215,7 +217,9 @@ put:#else /* INET */ -int ax25_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr,unsigned len) +int ax25_hard_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {return -AX25_HEADER_LEN ; }
@@ -227,5 +231,12 @@ int ax25_rebuild_header(struct sk_buff *#endif +const struct header_ops ax25_header_ops = { + .create = ax25_hard_header, + .rebuild = ax25_rebuild_header, +}; +EXPORT_SYMBOL (ax25_hard_header);EXPORT_SYMBOL (ax25_rebuild_header); +EXPORT_SYMBOL (ax25_header_ops); +
drivers/net/shaper.c +11 -50
96 lines not on this page · raw message
include/linux/if_shaper.h +0 -11
@@ -25,17 +25,6 @@ struct shaperan empty queue */ spinlock_t lock;struct net_device *dev; -int (*hard_start_xmit) (struct sk_buff *skb, -struct net_device *dev); -int (*hard_header) (struct sk_buff *skb, -struct net_device *dev, -unsigned short type, -void *daddr, -void *saddr, -unsigned len); -int (*rebuild_header)(struct sk_buff *skb); -int (*hard_header_cache)(struct neighbour *neigh,struct hh_cache *hh); -void (*header_cache_update)(struct hh_cache *hh,struct net_device *dev,unsigned char * haddr);struct net_device_stats * (*get_stats)(struct net_device *dev);struct timer_list timer; };
net/ipv4/ip_gre.c +9 -4
@@ -684,7 +684,7 @@ static int ipgre_tunnel_xmit(struct sk_b goto tx_error; } -if (dev->hard_header) { +if (dev->header_ops) { gre_hlen =0 ; tiph = (struct iphdr *)skb->data; }else {
@@ -1063,8 +1063,9 @@ static int ipgre_tunnel_change_mtu(struc*/ -static int ipgre_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int ipgre_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {struct ip_tunnel *t =netdev_priv (dev);struct iphdr *iph = (struct iphdr *)skb_push (skb, t->hlen);
@@ -1130,6 +1131,10 @@ static int ipgre_close(struct net_device#endif +static const struct header_ops ipgre_header_ops = { + .create = ipgre_header, +}; +static void ipgre_tunnel_setup (struct net_device *dev) { dev->uninit = ipgre_tunnel_uninit;
@@ -1187,7 +1192,7 @@ static int ipgre_tunnel_init(struct net_if (!iph->saddr)return -EINVAL ; dev->flags =IFF_BROADCAST ; - dev->hard_header = ipgre_header; + dev->header_ops = &ipgre_header_ops; dev->open = ipgre_open; dev->stop = ipgre_close; }
net/ipv4/ip_output.c +1 -1
@@ -169,7 +169,7 @@ static inline int ip_finish_output2(struIP_INC_STATS (IPSTATS_MIB_OUTBCASTPKTS );/* Be paranoid, rather than too clever. */ -if (unlikely (skb_headroom (skb) < hh_len && dev->hard_header)) { +if (unlikely (skb_headroom (skb) < hh_len && dev->header_ops)) {struct sk_buff *skb2; skb2 =skb_realloc_headroom (skb,LL_RESERVED_SPACE (dev));
net/ipv6/ndisc.c +3 -3
@@ -354,7 +354,7 @@ static int ndisc_constructor(struct neigrcu_read_unlock (); neigh->type = is_multicast ?RTN_MULTICAST :RTN_UNICAST ; -if (dev->hard_header ==NULL ) { +if (!dev->header_ops) { neigh->nud_state =NUD_NOARP ; neigh->ops = &ndisc_direct_ops; neigh->output = neigh->ops->queue_xmit;
@@ -371,7 +371,7 @@ static int ndisc_constructor(struct neig neigh->nud_state =NUD_NOARP ;memcpy (neigh->ha, dev->broadcast, dev->addr_len); } -if (dev->hard_header_cache) +if (dev->header_ops->cache) neigh->ops = &ndisc_hh_ops;else neigh->ops = &ndisc_generic_ops;
@@ -807,7 +807,7 @@ static void ndisc_recv_ns(struct sk_buffneigh_update (neigh, lladdr,NUD_STALE ,NEIGH_UPDATE_F_WEAK_OVERRIDE |NEIGH_UPDATE_F_OVERRIDE ); -if (neigh || !dev->hard_header) { +if (neigh || !dev->header_ops) {ndisc_send_na (dev, neigh, saddr, &msg->target, is_router,1 , (ifp !=NULL && inc), inc);
net/mac80211/ieee80211.c +10 -2
@@ -228,7 +228,6 @@ void ieee80211_if_mgmt_setup(struct net_ dev->open = ieee80211_mgmt_open; dev->stop = ieee80211_mgmt_stop; dev->type =ARPHRD_IEEE80211_PRISM ; - dev->hard_header_parse = header_parse_80211; dev->uninit = ieee80211_if_reinit; dev->destructor = ieee80211_if_free; }
@@ -546,10 +545,19 @@ static void ieee80211_set_multicast_listnetif_tx_unlock (local->mdev); } +static const struct header_ops ieee80211_header_ops = { + .create = eth_header, + .parse = header_parse_80211, + .rebuild = eth_rebuild_header, + .cache = eth_header_cache, + .cache_update = eth_header_cache_update, +}; +/* Must not be called for mdev and apdev */ void ieee80211_if_setup (struct net_device *dev) {ether_setup (dev); + dev->header_ops = &ieee80211_header_ops; dev->hard_start_xmit = ieee80211_subif_start_xmit; dev->wireless_handlers = &ieee80211_iw_handler_def; dev->set_multicast_list = ieee80211_set_multicast_list;
@@ -1197,7 +1205,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( mdev->open = ieee80211_master_open; mdev->stop = ieee80211_master_stop; mdev->type =ARPHRD_IEEE80211 ; - mdev->hard_header_parse = header_parse_80211; + mdev->header_ops = &ieee80211_header_ops; sdata->type =IEEE80211_IF_TYPE_AP ; sdata->dev = mdev;
net/netrom/nr_dev.c +10 -4
@@ -95,8 +95,9 @@ static int nr_rebuild_header(struct sk_b#endif -static int nr_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int nr_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {unsigned char *buff =skb_push (skb,NR_NETWORK_LEN +NR_TRANSPORT_LEN );
@@ -193,6 +194,12 @@ static struct net_device_stats *nr_get_sreturn &nr->stats; } +static const struct header_ops nr_header_ops = { + .create = nr_header, + .rebuild= nr_rebuild_header, +}; + +void nr_setup (struct net_device *dev) { dev->mtu =NR_MAX_PACKET_SIZE ;
@@ -200,11 +207,10 @@ void nr_setup(struct net_device *dev) dev->open = nr_open; dev->stop = nr_close; - dev->hard_header = nr_header; + dev->header_ops = &nr_header_ops; dev->hard_header_len =NR_NETWORK_LEN +NR_TRANSPORT_LEN ; dev->addr_len =AX25_ADDR_LEN ; dev->type =ARPHRD_NETROM ; - dev->rebuild_header = nr_rebuild_header; dev->set_mac_address = nr_set_mac_address;/* New-style flags. */
net/packet/af_packet.c +3 -3
@@ -389,7 +389,7 @@ static int packet_sendmsg_spkt(struct kiskb_reset_network_header (skb);/* Try to align data part correctly */ -if (dev->hard_header) { +if (dev->header_ops) { skb->data -= dev->hard_header_len; skb->tail -= dev->hard_header_len;if (len < dev->hard_header_len)
@@ -466,7 +466,7 @@ static int packet_rcv(struct sk_buff *sk skb->dev = dev; -if (dev->hard_header) { +if (dev->header_ops) {/* The device has an explicit notion of ll header, exported to higher levels.
@@ -581,7 +581,7 @@ static int tpacket_rcv(struct sk_buff *s sk = pt->af_packet_priv; po =pkt_sk (sk); -if (dev->hard_header) { +if (dev->header_ops) {if (sk->sk_type !=SOCK_DGRAM )skb_push (skb, skb->data -skb_mac_header (skb));else if (skb->pkt_type ==PACKET_OUTGOING ) {
net/rose/rose_dev.c +9 -4
@@ -35,8 +35,9 @@#include <net/ax25.h> #include <net/rose.h> -static int rose_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int rose_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type, +const void *daddr,const void *saddr,unsigned len) {unsigned char *buff =skb_push (skb,ROSE_MIN_LEN +2 );
@@ -148,6 +149,11 @@ static struct net_device_stats *rose_getreturn netdev_priv (dev); } +static const struct header_ops rose_header_ops = { + .create = rose_header, + .rebuild= rose_rebuild_header, +}; +void rose_setup (struct net_device *dev) { dev->mtu =ROSE_MAX_PACKET_SIZE -2 ;
@@ -155,11 +161,10 @@ void rose_setup(struct net_device *dev) dev->open = rose_open; dev->stop = rose_close; - dev->hard_header = rose_header; + dev->header_ops = &rose_header_ops; dev->hard_header_len =AX25_BPQ_HEADER_LEN +AX25_MAX_HEADER_LEN +ROSE_MIN_LEN ; dev->addr_len =ROSE_ADDR_LEN ; dev->type =ARPHRD_ROSE ; - dev->rebuild_header = rose_rebuild_header; dev->set_mac_address = rose_set_mac_address;/* New-style flags. */
net/sched/sch_teql.c +3 -3
@@ -249,10 +249,10 @@ __teql_resolve(struct sk_buff *skb, strureturn (skb_res ==NULL ) ? -EAGAIN :1 ; } -static __inline__int -teql_resolve (struct sk_buff *skb,struct sk_buff *skb_res,struct net_device *dev) +static inline int teql_resolve (struct sk_buff *skb, +struct sk_buff *skb_res,struct net_device *dev) { -if (dev->hard_header ==NULL || +if (dev->header_ops ==NULL || skb->dst ==NULL || skb->dst->neighbour ==NULL )return 0 ;
drivers/infiniband/ulp/ipoib/ipoib_main.c +6 -2
@@ -780,7 +780,7 @@ static void ipoib_timeout(struct net_devstatic int ipoib_hard_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr,unsigned len) {struct ipoib_header *header;
@@ -940,6 +940,10 @@ void ipoib_dev_cleanup(struct net_device priv->tx_ring =NULL ; } +static const struct header_ops ipoib_header_ops = { + .create = ipoib_hard_header, +}; +static void ipoib_setup (struct net_device *dev) {struct ipoib_dev_priv *priv =netdev_priv (dev);
@@ -950,7 +954,7 @@ static void ipoib_setup(struct net_devic dev->hard_start_xmit = ipoib_start_xmit; dev->get_stats = ipoib_get_stats; dev->tx_timeout = ipoib_timeout; - dev->hard_header = ipoib_hard_header; + dev->header_ops = &ipoib_header_ops; dev->set_multicast_list = ipoib_set_mcast_list; dev->neigh_setup = ipoib_neigh_setup_dev;
drivers/isdn/i4l/isdn_net.c +36 -69
166 lines not on this page · raw message
drivers/media/dvb/dvb-core/dvb_net.c +8 -1
@@ -1225,10 +1225,17 @@ static struct net_device_stats * dvb_netreturn &((struct dvb_net_priv *) dev->priv)->stats; } +static const struct header_ops dvb_header_ops = { + .create = eth_header, + .parse = eth_header_parse, + .rebuild = eth_rebuild_header, +}; +static void dvb_net_setup (struct net_device *dev) {ether_setup (dev); + dev->header_ops = &dvb_header_ops; dev->open = dvb_net_open; dev->stop = dvb_net_stop; dev->hard_start_xmit = dvb_net_tx;
@@ -1237,7 +1244,7 @@ static void dvb_net_setup(struct net_dev dev->set_mac_address = dvb_net_set_mac; dev->mtu =4096 ; dev->mc_count =0 ; - dev->hard_header_cache =NULL ; + dev->flags |=IFF_NOARP ; }
drivers/net/plip.c +22 -28
105 lines not on this page · raw message
drivers/net/wireless/airo.c +5 -1
@@ -2696,9 +2696,13 @@ static int mpi_map_card(struct airo_inforeturn rc; } +static const struct header_ops airo_header_ops = { + .parse = wll_header_parse, +}; +static void wifi_setup (struct net_device *dev) { - dev->hard_header_parse = wll_header_parse; + dev->header_ops = &airo_header_ops; dev->hard_start_xmit = &airo_start_xmit11; dev->get_stats = &airo_get_stats; dev->set_mac_address = &airo_set_mac_address;
drivers/net/wireless/hostap/hostap.h +1 -2
@@ -30,8 +30,7 @@ void hostap_dump_rx_header(const char *n const struct hfa384x_rx_frame *rx);void hostap_dump_tx_header (const char *name,const struct hfa384x_tx_frame *tx); -int hostap_80211_header_parse (struct sk_buff *skb,unsigned char *haddr); -int hostap_80211_prism_header_parse (struct sk_buff *skb,unsigned char *haddr); +extern const struct header_ops hostap_80211_ops;int hostap_80211_get_hdrlen (u16 fc);struct net_device_stats *hostap_get_stats (struct net_device *dev); void hostap_setup_dev(struct net_device *dev, local_info_t *local,
drivers/net/wireless/hostap/hostap_hw.c +1 -2
@@ -3258,11 +3258,10 @@ while (0)INIT_LIST_HEAD (&local->bss_list);hostap_setup_dev (dev, local,1 ); - local->saved_eth_header_parse = dev->hard_header_parse; dev->hard_start_xmit = hostap_master_start_xmit; dev->type =ARPHRD_IEEE80211 ; - dev->hard_header_parse = hostap_80211_header_parse; + dev->header_ops = &hostap_80211_ops;rtnl_lock (); ret =dev_alloc_name (dev,"wifi%d" );
drivers/net/wireless/hostap/hostap_ioctl.c +1 -4
@@ -897,11 +897,8 @@ static void hostap_monitor_set_type(locaif (local->monitor_type ==PRISM2_MONITOR_PRISM || local->monitor_type ==PRISM2_MONITOR_CAPHDR ) { dev->type =ARPHRD_IEEE80211_PRISM ; - dev->hard_header_parse = - hostap_80211_prism_header_parse; }else { dev->type =ARPHRD_IEEE80211 ; - dev->hard_header_parse = hostap_80211_header_parse; } }
@@ -1141,7 +1138,7 @@ static int hostap_monitor_mode_disable(lprintk (KERN_DEBUG "%s: Disabling monitor mode\n" , dev->name); dev->type =ARPHRD_ETHER ; - dev->hard_header_parse = local->saved_eth_header_parse; +if (local->func->cmd (dev,HFA384X_CMDCODE_TEST | (HFA384X_TEST_STOP <<8 ),0 ,NULL ,NULL ))
drivers/net/wireless/hostap/hostap_main.c +28 -17
72 lines not on this page · raw message
drivers/net/wireless/hostap/hostap_wlan.h +0 -2
@@ -736,8 +736,6 @@ struct local_info {PRISM2_MONITOR_80211 =0 ,PRISM2_MONITOR_PRISM =1 , PRISM2_MONITOR_CAPHDR = 2 } monitor_type; -int (*saved_eth_header_parse)(struct sk_buff *skb, -unsigned char *haddr);int monitor_allow_fcserr;int hostapd;/* whether user space daemon, hostapd, is used for AP
include/linux/isdn.h +0 -7
@@ -353,13 +353,6 @@ typedef struct isdn_net_local_s {/* a particular channel (including */ /* the frame_cnt */ -int (*org_hhc)( -struct neighbour *neigh, -struct hh_cache *hh); -/* Ptr to orig. header_cache_update */ -void (*org_hcu)(struct hh_cache *, -struct net_device *, -unsigned char *);int pppbind;/* ippp device for bindings */ int dialtimeout;/* How long shall we try on dialing? (jiffies) */ int dialwait;/* How long shall we wait after failed attempt? (jiffies) */
drivers/s390/net/qeth.h +1 -2
@@ -833,8 +833,7 @@ struct qeth_card {struct qeth_qdio_info qdio;struct qeth_perf_stats perf_stats;int use_hard_stop; -int (*orig_hard_header)(struct sk_buff *,struct net_device *, -unsigned short ,void *,void *,unsigned ); +const struct header_ops *orig_header_ops;struct qeth_osn_info osn_info;atomic_t force_alloc_skb; };
drivers/s390/net/qeth_main.c +26 -18
112 lines not on this page · raw message
drivers/net/appletalk/cops.c +1 -19
@@ -194,10 +194,6 @@ static void cops_timeout(struct net_devistatic void cops_rx (struct net_device *dev);static int cops_send_packet (struct sk_buff *skb,struct net_device *dev);static void set_multicast_list (struct net_device *dev); -static int cops_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len); -static int cops_ioctl (struct net_device *dev,struct ifreq *rq,int cmd);static int cops_close (struct net_device *dev);static struct net_device_stats *cops_get_stats (struct net_device *dev);
@@ -331,7 +327,6 @@ static int __init cops_probe1(struct net dev->base_addr = ioaddr; lp =netdev_priv (dev); -memset (lp,0 ,sizeof (struct cops_local ));spin_lock_init (&lp->lock);/* Copy local board variable to lp struct. */
@@ -340,7 +335,7 @@ static int __init cops_probe1(struct net dev->hard_start_xmit = cops_send_packet; dev->tx_timeout = cops_timeout; dev->watchdog_timeo =HZ *2 ; - dev->hard_header = cops_hard_header; + dev->get_stats = cops_get_stats; dev->open = cops_open; dev->stop = cops_close;
@@ -945,19 +940,6 @@ static void set_multicast_list(struct ne }/* -* Another Dummy function to keep the Appletalk layer happy. -*/ - -static int cops_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) -{ -if (cops_debug >=3 ) -printk ("%s: cops_hard_header executed. Wow!\n" , dev->name); -return 0 ; -} - -/* * System ioctls for the COPS LocalTalk card. */
drivers/net/appletalk/ltpc.c +0 -10
@@ -870,15 +870,6 @@ static void set_multicast_list(struct ne/* Actually netatalk needs fixing! */ } -static int ltpc_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr,unsigned len) -{ -if (debug &DEBUG_VERBOSE ) -printk ("ltpc_hard_header called for device %s\n" , - dev->name); -return 0 ; -} -static int ltpc_poll_counter;static void ltpc_poll (unsigned long l)
@@ -1141,7 +1132,6 @@ struct net_device * __init ltpc_probe(vo/* Fill in the fields of the device structure with ethernet-generic values. */ dev->hard_start_xmit = ltpc_xmit; - dev->hard_header = ltpc_hard_header; dev->get_stats = ltpc_get_stats;/* add the ltpc-specific things */
drivers/net/wan/cycx_x25.c +20 -11
@@ -131,14 +131,15 @@ static int cycx_wan_update(struct wan_de cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev);/* Network device interface */ -static int cycx_netdevice_init (struct net_device *dev), -cycx_netdevice_open (struct net_device *dev), -cycx_netdevice_stop (struct net_device *dev), -cycx_netdevice_hard_header (struct sk_buff *skb, -struct net_device *dev,u16 type, -void *daddr,void *saddr,unsigned len), -cycx_netdevice_rebuild_header (struct sk_buff *skb), -cycx_netdevice_hard_start_xmit (struct sk_buff *skb, +static int cycx_netdevice_init (struct net_device *dev); +static int cycx_netdevice_open (struct net_device *dev); +static int cycx_netdevice_stop (struct net_device *dev); +static int cycx_netdevice_hard_header (struct sk_buff *skb, +struct net_device *dev,u16 type, +const void *daddr,const void *saddr, +unsigned len); +static int cycx_netdevice_rebuild_header (struct sk_buff *skb); +static int cycx_netdevice_hard_start_xmit (struct sk_buff *skb,struct net_device *dev); static struct net_device_stats *
@@ -468,7 +469,14 @@ static int cycx_wan_del_if(struct wan_dereturn 0 ; } +/* Network Device Interface */ + +static const struct header_ops cycx_header_ops = { + .create = cycx_netdevice_hard_header, + .rebuild = cycx_netdevice_rebuild_header, +}; +/* Initialize Linux network interface. * * This routine is called only once for each interface, during Linux network
@@ -483,8 +491,8 @@ static int cycx_netdevice_init(struct ne/* Initialize device driver entry points */ dev->open = cycx_netdevice_open; dev->stop = cycx_netdevice_stop; - dev->hard_header = cycx_netdevice_hard_header; - dev->rebuild_header = cycx_netdevice_rebuild_header; + dev->header_ops = &cycx_header_ops; + dev->hard_start_xmit = cycx_netdevice_hard_start_xmit; dev->get_stats = cycx_netdevice_get_stats;
@@ -554,7 +562,8 @@ static int cycx_netdevice_stop(struct ne* Return: media header length. */ static int cycx_netdevice_hard_header (struct sk_buff *skb,struct net_device *dev,u16 type, -void *daddr,void *saddr,unsigned len) +const void *daddr,const void *saddr, +unsigned len) { skb->protocol = type;
drivers/net/wan/dlci.c +7 -3
@@ -66,8 +66,8 @@ static void dlci_setup(struct net_device*/ static int dlci_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct frhdr hdr;struct dlci_local *dlp;
@@ -485,6 +485,10 @@ static int dlci_ioctl(unsigned int cmd,return (err); } +static const struct header_ops dlci_header_ops = { + .create = dlci_header, +}; +static void dlci_setup (struct net_device *dev) {struct dlci_local *dlp = dev->priv;
@@ -494,7 +498,7 @@ static void dlci_setup(struct net_device dev->stop = dlci_close; dev->do_ioctl = dlci_dev_ioctl; dev->hard_start_xmit = dlci_transmit; - dev->hard_header = dlci_header; + dev->header_ops = &dlci_header_ops; dev->get_stats = dlci_get_stats; dev->change_mtu = dlci_change_mtu; dev->destructor = free_netdev;
drivers/net/wan/hdlc.c +4 -6
@@ -232,6 +232,8 @@ int hdlc_ioctl(struct net_device *dev, sreturn -EINVAL ; } +static const struct header_ops hdlc_null_ops; +static void hdlc_setup_dev (struct net_device *dev) {/* Re-init all variables changed by HDLC protocol drivers,
@@ -243,13 +245,9 @@ static void hdlc_setup_dev(struct net_de dev->type =ARPHRD_RAWHDLC ; dev->hard_header_len =16 ; dev->addr_len =0 ; - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; - dev->set_mac_address =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; + dev->header_ops = &hdlc_null_ops; + dev->change_mtu = hdlc_change_mtu; - dev->hard_header_parse =NULL ; }static void hdlc_setup (struct net_device *dev)
drivers/net/wan/hdlc_cisco.c +6 -4
@@ -74,7 +74,7 @@ static inline struct cisco_state * statestatic int cisco_hard_header (struct sk_buff *skb,struct net_device *dev, -u16 type,void *daddr,void *saddr, +u16 type,const void *daddr,const void *saddr,unsigned int len) {struct hdlc_header *data;
@@ -309,7 +309,6 @@ static void cisco_stop(struct net_device } -static struct hdlc_proto proto = { .start = cisco_start, .stop = cisco_stop,
@@ -317,7 +316,10 @@ static struct hdlc_proto proto = { .ioctl = cisco_ioctl, .module = THIS_MODULE, }; - + +static const struct header_ops cisco_header_ops = { + .create = cisco_hard_header, +};static int cisco_ioctl (struct net_device *dev,struct ifreq *ifr) {
@@ -365,7 +367,7 @@ static int cisco_ioctl(struct net_devicememcpy (&state (hdlc)->settings, &new_settings, size); dev->hard_start_xmit = hdlc->xmit; - dev->hard_header = cisco_hard_header; + dev->header_ops = &cisco_header_ops; dev->type =ARPHRD_CISCO ;netif_dormant_on (dev);return 0 ;
drivers/net/wan/hdlc_ppp.c +1 -1
@@ -73,7 +73,7 @@ static void ppp_close(struct net_devicesppp_close (dev);sppp_detach (dev); - dev->rebuild_header =NULL ; + dev->change_mtu =state (hdlc)->old_change_mtu; dev->mtu =HDLC_MAX_MTU ; dev->hard_header_len =16 ;
drivers/net/wan/lmc/lmc_proto.c +1 -1
@@ -111,7 +111,7 @@ void lmc_proto_attach(lmc_softc_t *sc) /* They set a few basics because they don't use sync_ppp */ dev->flags |=IFF_POINTOPOINT ; - dev->hard_header =NULL ; + dev->hard_header_len =0 ; dev->addr_len =0 ; }
drivers/net/wan/syncppp.c +9 -10
@@ -359,8 +359,10 @@ done:* Handle transmit packets. */ -static int sppp_hard_header (struct sk_buff *skb,struct net_device *dev,__u16 type, -void *daddr,void *saddr,unsigned int len) +static int sppp_hard_header (struct sk_buff *skb, +struct net_device *dev,__u16 type, +const void *daddr,const void *saddr, +unsigned int len) {struct sppp *sp = (struct sppp *)sppp_of (dev);struct ppp_header *h;
@@ -392,10 +394,9 @@ static int sppp_hard_header(struct sk_bureturn sizeof (struct ppp_header ); } -static int sppp_rebuild_header (struct sk_buff *skb) -{ -return 0 ; -} +static const struct header_ops sppp_header_ops = { + .create = sppp_hard_header, +};/* * Send keepalive packets, every 10 seconds.
@@ -1098,8 +1099,8 @@ void sppp_attach(struct ppp_device *pd)* hard_start_xmit. */ - dev->hard_header = sppp_hard_header; - dev->rebuild_header = sppp_rebuild_header; + dev->header_ops = &sppp_header_ops; + dev->tx_queue_len =10 ; dev->type =ARPHRD_HDLC ; dev->addr_len =0 ;
@@ -1115,8 +1116,6 @@ void sppp_attach(struct ppp_device *pd) dev->stop = sppp_close;#endif dev->change_mtu = sppp_change_mtu; - dev->hard_header_cache =NULL ; - dev->header_cache_update =NULL ; dev->flags =IFF_MULTICAST |IFF_POINTOPOINT |IFF_NOARP ; }
drivers/net/wireless/strip.c +9 -4
@@ -1631,8 +1631,8 @@ static void strip_IdleTask(unsigned long*/ static int strip_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type,void *daddr,void *saddr, -unsigned len) +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct strip *strip_info =netdev_priv (dev);STRIP_Header *header = (STRIP_Header *)skb_push (skb,sizeof (STRIP_Header));
@@ -2497,6 +2497,11 @@ static int strip_close_low(struct net_dereturn 0 ; } +static const struct header_ops strip_header_ops = { + .create = strip_header, + .rebuild = strip_rebuild_header, +}; +/* * This routine is called by DDI when the * (dynamically assigned) device is registered
@@ -2531,8 +2536,8 @@ static void strip_dev_setup(struct net_d dev->open = strip_open_low; dev->stop = strip_close_low; dev->hard_start_xmit = strip_xmit; - dev->hard_header = strip_header; - dev->rebuild_header = strip_rebuild_header; + dev->header_ops = &strip_header_ops; + dev->set_mac_address = strip_set_mac_address; dev->get_stats = strip_get_stats; dev->change_mtu = strip_change_mtu;
drivers/net/myri_sbus.c +18 -10
@@ -676,8 +676,9 @@ static int myri_start_xmit(struct sk_buf* saddr=NULL means use device source address * daddr=NULL means leave destination address (eg unresolved arp) */ -static int myri_header (struct sk_buff *skb,struct net_device *dev,unsigned short type, -void *daddr,void *saddr,unsigned len) +static int myri_header (struct sk_buff *skb,struct net_device *dev, +unsigned short type,const void *daddr, +const void *saddr,unsigned len) {struct ethhdr *eth = (struct ethhdr *)skb_push (skb,ETH_HLEN );unsigned char *pad = (unsigned char *)skb_push (skb,MYRI_PAD_LEN );
@@ -759,18 +760,18 @@ static int myri_rebuild_header(struct skreturn 0 ; } -int myri_header_cache (struct neighbour *neigh,struct hh_cache *hh) +static int myri_header_cache (const struct neighbour *neigh,struct hh_cache *hh) {unsigned short type = hh->hh_type;unsigned char *pad;struct ethhdr *eth; -struct net_device *dev = neigh->dev; +const struct net_device *dev = neigh->dev; pad = ((unsigned char *) hh->hh_data) +HH_DATA_OFF (sizeof (*eth) +MYRI_PAD_LEN ); eth = (struct ethhdr *) (pad +MYRI_PAD_LEN ); -if (type ==__constant_htons (ETH_P_802_3 )) +if (type ==htons (ETH_P_802_3 ))return -1 ;/* Refill MyriNet padding identifiers, this is just being anal. */
@@ -786,7 +787,9 @@ int myri_header_cache(struct neighbour */* Called by Address Resolution module to notify changes in address. */ -void myri_header_cache_update (struct hh_cache *hh,struct net_device *dev,unsigned char * haddr) +void myri_header_cache_update (struct hh_cache *hh, +const struct net_device *dev, +const unsigned char * haddr) {memcpy (((u8 *)hh->hh_data) +HH_DATA_OFF (sizeof (struct ethhdr )), haddr, dev->addr_len);
@@ -881,6 +884,13 @@ static void dump_eeprom(struct myri_eth }#endif +static const struct header_ops myri_header_ops = { + .create = myri_header, + .rebuild = myri_rebuild_header, + .cache = myri_header_cache, + .cache_update = myri_header_cache_update, +}; +static int __devinit myri_ether_init (struct sbus_dev *sdev) {static int num;
@@ -1065,11 +1075,9 @@ static int __devinit myri_ether_init(str dev->mtu =MYRINET_MTU ; dev->change_mtu = myri_change_mtu; - dev->hard_header = myri_header; - dev->rebuild_header = myri_rebuild_header; + dev->header_ops = &myri_header_ops; + dev->hard_header_len = (ETH_HLEN +MYRI_PAD_LEN ); - dev->hard_header_cache = myri_header_cache; - dev->header_cache_update= myri_header_cache_update;/* Load code onto the LANai. */ DET (("Loading LANAI firmware\n" ));
David Miller
maintainerRe: [PATCH 3/3] net-2.6.24: move hardware header operations out of netdevice
From: Stephen Hemminger <[email protected]>
Date: Wed, 26 Sep 2007 17:22:46 -0700
Quoted 5 lines
Since hardware header operations are part of the protocol class not the device instance, make them into a separate object and save memory.
Signed-off-by Stephen Hemminger <[email protected]>
I applied this by hand since there were conflicts with Eric B.'s round of network namespace patches from today which I applied first.
Also:
drivers/net/hamradio/6pack.c line 9
Quoted 11 lines
drivers/net/hamradio/6pack.c +1
-1@@ -3,7 +3,7 @@* devices like TTY. It interfaces between a raw TTY and the * kernel's AX.25 protocol layers. * -* Authors: Andreas Könsgen <[email protected]> +* Authors: Andreas Könsgen <[email protected]> * Ralf Baechle DL5RB <[email protected]> * * Quite a lot of stuff "stolen" by Joerg Reuter from slip.c, written by
This hunk rejected and I therefore left it out.
Whatever editor you used aparently tried to change the character set encoding or something silly like that.
Re: [PATCH 1/3] net-2.6.24: wrap netdevice hardware header creation
In reply to Stephen HemmingerFrom: Stephen Hemminger <[email protected]>
Date: Wed, 26 Sep 2007 17:21:29 -0700
Quoted 7 lines
Add inline for common usage of hardware header creation, and fix bug in IPV6 mcast where the assumption about negative return is an errno. Negative return from
hard_headermeans not enough space was available,(ie -N bytes).Signed-off-by Stephen Hemminger <[email protected]>
Applied.
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 2/3 net-2.6.24: wrap hard_header_parse
Wrap the hard_header_parse function to simplify next step of header_ops conversion.
include/linux/netdevice.h +11 -1
@@ -657,7 +657,7 @@ struct net_devicevoid (*vlan_rx_kill_vid)(struct net_device *dev,unsigned short vid); -int (*hard_header_parse)(struct sk_buff *skb, +int (*hard_header_parse)(const struct sk_buff *skb,unsigned char *haddr);int (*neigh_setup)(struct net_device *dev,struct neigh_parms *);#ifdef CONFIG_NETPOLL
@@ -810,6 +810,16 @@ static inline int dev_hard_header(structreturn dev->hard_header (skb, dev, type, daddr, saddr, len); } +static inline int dev_parse_header (const struct sk_buff *skb, +unsigned char *haddr) +{ +const struct net_device *dev = skb->dev; + +if (!dev->hard_header_parse) +return 0 ; +return dev->hard_header_parse (skb, haddr); +} +typedef int gifconf_func_t (struct net_device * dev,char __user * bufptr,int len);extern int register_gifconf (unsigned int family,gifconf_func_t * gifconf);static inline int unregister_gifconf (unsigned int family)
net/netfilter/nfnetlink_log.c +6 -5
@@ -481,12 +481,13 @@ __build_packet_message(struct nfulnl_insNFA_PUT (inst->skb,NFULA_MARK ,sizeof (tmp_uint), &tmp_uint); } -if (indev && skb->dev && skb->dev->hard_header_parse) { +if (indev && skb->dev) {struct nfulnl_msg_packet_hw phw; -int len = skb->dev->hard_header_parse ((struct sk_buff *)skb, - phw.hw_addr); - phw.hw_addrlen =htons (len); -NFA_PUT (inst->skb,NFULA_HWADDR ,sizeof (phw), &phw); +int len =dev_parse_header (skb, phw.hw_addr); +if (len >0 ) { + phw.hw_addrlen =htons (len); +NFA_PUT (inst->skb,NFULA_HWADDR ,sizeof (phw), &phw); + } }if (skb->tstamp.tv64) {
net/netfilter/nfnetlink_queue.c +6 -7
@@ -485,14 +485,13 @@ nfqnl_build_packet_message(struct nfqnl_NFA_PUT (skb,NFQA_MARK ,sizeof (u_int32_t), &tmp_uint); } -if (indev && entskb->dev - && entskb->dev->hard_header_parse) { +if (indev && entskb->dev) {struct nfqnl_msg_packet_hw phw; - -int len = entskb->dev->hard_header_parse (entskb, - phw.hw_addr); - phw.hw_addrlen =htons (len); -NFA_PUT (skb,NFQA_HWADDR ,sizeof (phw), &phw); +int len =dev_parse_header (entskb, phw.hw_addr); +if (len) { + phw.hw_addrlen =htons (len); +NFA_PUT (skb,NFQA_HWADDR ,sizeof (phw), &phw); + } }if (entskb->tstamp.tv64) {
net/packet/af_packet.c +2 -6
@@ -519,10 +519,8 @@ static int packet_rcv(struct sk_buff *sk sll->sll_ifindex = orig_dev->ifindex; else sll->sll_ifindex = dev->ifindex; - sll->sll_halen =0 ; -if (dev->hard_header_parse) - sll->sll_halen = dev->hard_header_parse (skb, sll->sll_addr); + sll->sll_halen =dev_parse_header (skb, sll->sll_addr);PACKET_SKB_CB (skb)->origlen = skb->len;
@@ -658,9 +656,7 @@ static int tpacket_rcv(struct sk_buff *s h->tp_usec = tv.tv_usec; sll = (struct sockaddr_ll *)((u8 *)h +TPACKET_ALIGN (sizeof (*h))); - sll->sll_halen =0 ; -if (dev->hard_header_parse) - sll->sll_halen = dev->hard_header_parse (skb, sll->sll_addr); + sll->sll_halen =dev_parse_header (skb, sll->sll_addr); sll->sll_family =AF_PACKET ; sll->sll_hatype = dev->type; sll->sll_protocol = skb->protocol;
net/ethernet/eth.c +2 -2
@@ -207,9 +207,9 @@ EXPORT_SYMBOL(eth_type_trans);* @skb: packet to extract header from * @haddr: destination buffer */ -static int eth_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int eth_header_parse (const struct sk_buff *skb,unsigned char *haddr) { -struct ethhdr *eth =eth_hdr (skb); +const struct ethhdr *eth =eth_hdr (skb);memcpy (haddr, eth->h_source,ETH_ALEN );return ETH_ALEN ; }
net/mac80211/ieee80211.c +1 -1
@@ -47,7 +47,7 @@ struct ieee80211_tx_status_rtap_hdr {/* common interface routines */ -static int header_parse_80211 (struct sk_buff *skb,unsigned char *haddr) +static int header_parse_80211 (const struct sk_buff *skb,unsigned char *haddr) {memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );/* addr2 */ return ETH_ALEN ;
drivers/ieee1394/eth1394.c +5 -5
@@ -162,7 +162,8 @@ static int ether1394_header(struct sk_bu unsigned short type, void *daddr, void *saddr, unsigned len);static int ether1394_rebuild_header (struct sk_buff *skb); -static int ether1394_header_parse (struct sk_buff *skb,unsigned char *haddr); +static int ether1394_header_parse (const struct sk_buff *skb, +unsigned char *haddr);static int ether1394_header_cache (struct neighbour *neigh,struct hh_cache *hh); static void ether1394_header_cache_update(struct hh_cache *hh, struct net_device *dev,
@@ -751,11 +752,10 @@ static int ether1394_rebuild_header(strureturn 0 ; } -static int ether1394_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int ether1394_header_parse (const struct sk_buff *skb, +unsigned char *haddr) { -struct net_device *dev = skb->dev; - -memcpy (haddr, dev->dev_addr,ETH1394_ALEN ); +memcpy (haddr, skb->dev->dev_addr,ETH1394_ALEN );return ETH1394_ALEN ; }
drivers/net/wireless/airo.c +1 -6
@@ -2481,7 +2481,7 @@ void stop_airo_card( struct net_device *EXPORT_SYMBOL (stop_airo_card); -static int wll_header_parse (struct sk_buff *skb,unsigned char *haddr) +static int wll_header_parse (const struct sk_buff *skb,unsigned char *haddr) {memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );return ETH_ALEN ;
@@ -2698,11 +2698,6 @@ static int mpi_map_card(struct airo_infostatic void wifi_setup (struct net_device *dev) { - dev->hard_header =NULL ; - dev->rebuild_header =NULL ; - dev->hard_header_cache =NULL ; - dev->header_cache_update=NULL ; - dev->hard_header_parse = wll_header_parse; dev->hard_start_xmit = &airo_start_xmit11; dev->get_stats = &airo_get_stats;
drivers/s390/net/qeth_main.c +3 -3
@@ -6561,10 +6561,10 @@ static struct ethtool_ops qeth_ethtool_o };static int -qeth_hard_header_parse (struct sk_buff *skb,unsigned char *haddr) +qeth_hard_header_parse (const struct sk_buff *skb,unsigned char *haddr) { -struct qeth_card *card; -struct ethhdr *eth; +const struct qeth_card *card; +const struct ethhdr *eth; card =qeth_get_card_from_dev (skb->dev);if (card->options.layer2)
net/ipv4/netfilter/ip_queue.c +2 -4
@@ -250,10 +250,8 @@ ipq_build_packet_message(struct ipq_queuif (entry->info->indev && entry->skb->dev) { pmsg->hw_type = entry->skb->dev->type; -if (entry->skb->dev->hard_header_parse) - pmsg->hw_addrlen = - entry->skb->dev->hard_header_parse (entry->skb, - pmsg->hw_addr); + pmsg->hw_addrlen =dev_parse_header (entry->skb, + pmsg->hw_addr); }if (data_len)
net/ipv6/netfilter/ip6_queue.c +1 -4
@@ -248,10 +248,7 @@ ipq_build_packet_message(struct ipq_queuif (entry->info->indev && entry->skb->dev) { pmsg->hw_type = entry->skb->dev->type; -if (entry->skb->dev->hard_header_parse) - pmsg->hw_addrlen = - entry->skb->dev->hard_header_parse (entry->skb, - pmsg->hw_addr); + pmsg->hw_addrlen =dev_parse_header (entry->skb, pmsg->hw_addr); }if (data_len)
Re: [PATCH 2/3] net-2.6.24: wrap hard_header_parse
From: Stephen Hemminger <[email protected]>
Date: Wed, 26 Sep 2007 17:21:37 -0700
Quoted 4 lines
Wrap the
hard_header_parsefunction to simplify next step ofheader_opsconversion.Signed-off-by Stephen Hemminger <[email protected]>
Applied.