Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[NET]: 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.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Stephen Hemminger and committed by
David S. Miller
3b04ddde b95cce35

+479 -473
+23 -17
drivers/ieee1394/eth1394.c
··· 159 159 160 160 161 161 static int ether1394_header(struct sk_buff *skb, struct net_device *dev, 162 - unsigned short type, void *daddr, void *saddr, 163 - unsigned len); 162 + unsigned short type, const void *daddr, 163 + const void *saddr, unsigned len); 164 164 static int ether1394_rebuild_header(struct sk_buff *skb); 165 165 static int ether1394_header_parse(const struct sk_buff *skb, 166 166 unsigned char *haddr); 167 - static int ether1394_header_cache(struct neighbour *neigh, struct hh_cache *hh); 167 + static int ether1394_header_cache(const struct neighbour *neigh, 168 + struct hh_cache *hh); 168 169 static void ether1394_header_cache_update(struct hh_cache *hh, 169 - struct net_device *dev, 170 - unsigned char *haddr); 170 + const struct net_device *dev, 171 + const unsigned char *haddr); 171 172 static int ether1394_tx(struct sk_buff *skb, struct net_device *dev); 172 173 static void ether1394_iso(struct hpsb_iso *iso); 173 174 ··· 508 507 spin_unlock_irqrestore(&priv->lock, flags); 509 508 } 510 509 510 + static const struct header_ops ether1394_header_ops = { 511 + .create = ether1394_header, 512 + .rebuild = ether1394_rebuild_header, 513 + .cache = ether1394_header_cache, 514 + .cache_update = ether1394_header_cache_update, 515 + .parse = ether1394_header_parse, 516 + }; 517 + 511 518 static void ether1394_init_dev(struct net_device *dev) 512 519 { 513 520 dev->open = ether1394_open; ··· 525 516 dev->tx_timeout = ether1394_tx_timeout; 526 517 dev->change_mtu = ether1394_change_mtu; 527 518 528 - dev->hard_header = ether1394_header; 529 - dev->rebuild_header = ether1394_rebuild_header; 530 - dev->hard_header_cache = ether1394_header_cache; 531 - dev->header_cache_update= ether1394_header_cache_update; 532 - dev->hard_header_parse = ether1394_header_parse; 519 + dev->header_ops = &ether1394_header_ops; 533 520 534 521 SET_ETHTOOL_OPS(dev, &ethtool_ops); 535 522 ··· 716 711 * saddr=NULL means use device source address 717 712 * daddr=NULL means leave destination address (eg unresolved arp). */ 718 713 static int ether1394_header(struct sk_buff *skb, struct net_device *dev, 719 - unsigned short type, void *daddr, void *saddr, 720 - unsigned len) 714 + unsigned short type, const void *daddr, 715 + const void *saddr, unsigned len) 721 716 { 722 717 struct eth1394hdr *eth = 723 718 (struct eth1394hdr *)skb_push(skb, ETH1394_HLEN); ··· 764 759 return ETH1394_ALEN; 765 760 } 766 761 767 - static int ether1394_header_cache(struct neighbour *neigh, struct hh_cache *hh) 762 + static int ether1394_header_cache(const struct neighbour *neigh, 763 + struct hh_cache *hh) 768 764 { 769 765 unsigned short type = hh->hh_type; 770 766 struct net_device *dev = neigh->dev; ··· 784 778 785 779 /* Called by Address Resolution module to notify changes in address. */ 786 780 static void ether1394_header_cache_update(struct hh_cache *hh, 787 - struct net_device *dev, 788 - unsigned char * haddr) 781 + const struct net_device *dev, 782 + const unsigned char * haddr) 789 783 { 790 784 memcpy((u8 *)hh->hh_data + 16 - ETH1394_HLEN, haddr, dev->addr_len); 791 785 } ··· 905 899 } 906 900 907 901 /* Now add the ethernet header. */ 908 - if (dev->hard_header(skb, dev, ntohs(ether_type), &dest_hw, NULL, 909 - skb->len) >= 0) 902 + if (dev_hard_header(skb, dev, ntohs(ether_type), &dest_hw, NULL, 903 + skb->len) >= 0) 910 904 ret = ether1394_type_trans(skb, dev); 911 905 912 906 return ret;
+6 -2
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 780 780 static int ipoib_hard_header(struct sk_buff *skb, 781 781 struct net_device *dev, 782 782 unsigned short type, 783 - void *daddr, void *saddr, unsigned len) 783 + const void *daddr, const void *saddr, unsigned len) 784 784 { 785 785 struct ipoib_header *header; 786 786 ··· 940 940 priv->tx_ring = NULL; 941 941 } 942 942 943 + static const struct header_ops ipoib_header_ops = { 944 + .create = ipoib_hard_header, 945 + }; 946 + 943 947 static void ipoib_setup(struct net_device *dev) 944 948 { 945 949 struct ipoib_dev_priv *priv = netdev_priv(dev); ··· 954 950 dev->hard_start_xmit = ipoib_start_xmit; 955 951 dev->get_stats = ipoib_get_stats; 956 952 dev->tx_timeout = ipoib_timeout; 957 - dev->hard_header = ipoib_hard_header; 953 + dev->header_ops = &ipoib_header_ops; 958 954 dev->set_multicast_list = ipoib_set_mcast_list; 959 955 dev->neigh_setup = ipoib_neigh_setup_dev; 960 956
+36 -69
drivers/isdn/i4l/isdn_net.c
··· 1873 1873 return 0; 1874 1874 } 1875 1875 1876 - static int 1877 - my_eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 1878 - void *daddr, void *saddr, unsigned len) 1879 - { 1880 - struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 1881 - 1882 - /* 1883 - * Set the protocol type. For a packet of type ETH_P_802_3 we 1884 - * put the length here instead. It is up to the 802.2 layer to 1885 - * carry protocol information. 1886 - */ 1887 - 1888 - if (type != ETH_P_802_3) 1889 - eth->h_proto = htons(type); 1890 - else 1891 - eth->h_proto = htons(len); 1892 - 1893 - /* 1894 - * Set the source hardware address. 1895 - */ 1896 - if (saddr) 1897 - memcpy(eth->h_source, saddr, dev->addr_len); 1898 - else 1899 - memcpy(eth->h_source, dev->dev_addr, dev->addr_len); 1900 - 1901 - /* 1902 - * Anyway, the loopback-device should never use this function... 1903 - */ 1904 - 1905 - if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) { 1906 - memset(eth->h_dest, 0, dev->addr_len); 1907 - return ETH_HLEN /*(dev->hard_header_len)*/; 1908 - } 1909 - if (daddr) { 1910 - memcpy(eth->h_dest, daddr, dev->addr_len); 1911 - return ETH_HLEN /*dev->hard_header_len*/; 1912 - } 1913 - return -ETH_HLEN /*dev->hard_header_len*/; 1914 - } 1915 - 1916 1876 /* 1917 1877 * build an header 1918 1878 * depends on encaps that is being used. 1919 1879 */ 1920 1880 1921 - static int 1922 - isdn_net_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 1923 - void *daddr, void *saddr, unsigned plen) 1881 + static int isdn_net_header(struct sk_buff *skb, struct net_device *dev, 1882 + unsigned short type, 1883 + const void *daddr, const void *saddr, unsigned plen) 1924 1884 { 1925 1885 isdn_net_local *lp = dev->priv; 1926 1886 unsigned char *p; ··· 1888 1928 1889 1929 switch (lp->p_encap) { 1890 1930 case ISDN_NET_ENCAP_ETHER: 1891 - len = my_eth_header(skb, dev, type, daddr, saddr, plen); 1931 + len = eth_header(skb, dev, type, daddr, saddr, plen); 1892 1932 break; 1893 1933 #ifdef CONFIG_ISDN_PPP 1894 1934 case ISDN_NET_ENCAP_SYNCPPP: ··· 1965 2005 return ret; 1966 2006 } 1967 2007 2008 + static int isdn_header_cache(const struct neighbour *neigh, struct hh_cache *hh) 2009 + { 2010 + const struct net_device *dev = neigh->dev; 2011 + isdn_net_local *lp = dev->priv; 2012 + 2013 + if (lp->p_encap == ISDN_NET_ENCAP_ETHER) 2014 + return eth_header_cache(neigh, hh); 2015 + return -1; 2016 + } 2017 + 2018 + static void isdn_header_cache_update(struct hh_cache *hh, 2019 + const struct net_device *dev, 2020 + const unsigned char *haddr) 2021 + { 2022 + isdn_net_local *lp = dev->priv; 2023 + if (lp->p_encap == ISDN_NET_ENCAP_ETHER) 2024 + return eth_header_cache_update(hh, dev, haddr); 2025 + } 2026 + 2027 + static const struct header_ops isdn_header_ops = { 2028 + .create = isdn_net_header, 2029 + .rebuild = isdn_net_rebuild_header, 2030 + .cache = isdn_header_cache, 2031 + .cache_update = isdn_header_cache_update, 2032 + }; 2033 + 1968 2034 /* 1969 2035 * Interface-setup. (just after registering a new interface) 1970 2036 */ ··· 1998 2012 isdn_net_init(struct net_device *ndev) 1999 2013 { 2000 2014 ushort max_hlhdr_len = 0; 2001 - isdn_net_local *lp = (isdn_net_local *) ndev->priv; 2002 - int drvidx, i; 2015 + int drvidx; 2003 2016 2004 2017 ether_setup(ndev); 2005 - lp->org_hhc = ndev->hard_header_cache; 2006 - lp->org_hcu = ndev->header_cache_update; 2018 + ndev->header_ops = NULL; 2007 2019 2008 2020 /* Setup the generic properties */ 2009 - 2010 - ndev->hard_header = NULL; 2011 - ndev->hard_header_cache = NULL; 2012 - ndev->header_cache_update = NULL; 2013 2021 ndev->mtu = 1500; 2014 2022 ndev->flags = IFF_NOARP|IFF_POINTOPOINT; 2015 2023 ndev->type = ARPHRD_ETHER; ··· 2011 2031 2012 2032 /* for clients with MPPP maybe higher values better */ 2013 2033 ndev->tx_queue_len = 30; 2014 - 2015 - for (i = 0; i < ETH_ALEN; i++) 2016 - ndev->broadcast[i] = 0xff; 2017 2034 2018 2035 /* The ISDN-specific entries in the device structure. */ 2019 2036 ndev->open = &isdn_net_open; ··· 2029 2052 ndev->hard_header_len = ETH_HLEN + max_hlhdr_len; 2030 2053 ndev->stop = &isdn_net_close; 2031 2054 ndev->get_stats = &isdn_net_get_stats; 2032 - ndev->rebuild_header = &isdn_net_rebuild_header; 2033 2055 ndev->do_ioctl = NULL; 2034 2056 return 0; 2035 2057 } ··· 2837 2861 } 2838 2862 if (cfg->p_encap != lp->p_encap) { 2839 2863 if (cfg->p_encap == ISDN_NET_ENCAP_RAWIP) { 2840 - p->dev.hard_header = NULL; 2841 - p->dev.hard_header_cache = NULL; 2842 - p->dev.header_cache_update = NULL; 2864 + p->dev.header_ops = NULL; 2843 2865 p->dev.flags = IFF_NOARP|IFF_POINTOPOINT; 2844 2866 } else { 2845 - p->dev.hard_header = isdn_net_header; 2846 - if (cfg->p_encap == ISDN_NET_ENCAP_ETHER) { 2847 - p->dev.hard_header_cache = lp->org_hhc; 2848 - p->dev.header_cache_update = lp->org_hcu; 2867 + p->dev.header_ops = &isdn_header_ops; 2868 + if (cfg->p_encap == ISDN_NET_ENCAP_ETHER) 2849 2869 p->dev.flags = IFF_BROADCAST | IFF_MULTICAST; 2850 - } else { 2851 - p->dev.hard_header_cache = NULL; 2852 - p->dev.header_cache_update = NULL; 2870 + else 2853 2871 p->dev.flags = IFF_NOARP|IFF_POINTOPOINT; 2854 - } 2855 2872 } 2856 2873 } 2857 2874 lp->p_encap = cfg->p_encap; ··· 3096 3127 ((isdn_net_local *) (p->local->master->priv))->slave = p->local->slave; 3097 3128 } else { 3098 3129 /* Unregister only if it's a master-device */ 3099 - p->dev.hard_header_cache = p->local->org_hhc; 3100 - p->dev.header_cache_update = p->local->org_hcu; 3101 3130 unregister_netdev(&p->dev); 3102 3131 } 3103 3132 /* Unlink device from chain */
+8 -1
drivers/media/dvb/dvb-core/dvb_net.c
··· 1225 1225 return &((struct dvb_net_priv*) dev->priv)->stats; 1226 1226 } 1227 1227 1228 + static const struct header_ops dvb_header_ops = { 1229 + .create = eth_header, 1230 + .parse = eth_header_parse, 1231 + .rebuild = eth_rebuild_header, 1232 + }; 1233 + 1228 1234 static void dvb_net_setup(struct net_device *dev) 1229 1235 { 1230 1236 ether_setup(dev); 1231 1237 1238 + dev->header_ops = &dvb_header_ops; 1232 1239 dev->open = dvb_net_open; 1233 1240 dev->stop = dvb_net_stop; 1234 1241 dev->hard_start_xmit = dvb_net_tx; ··· 1244 1237 dev->set_mac_address = dvb_net_set_mac; 1245 1238 dev->mtu = 4096; 1246 1239 dev->mc_count = 0; 1247 - dev->hard_header_cache = NULL; 1240 + 1248 1241 dev->flags |= IFF_NOARP; 1249 1242 } 1250 1243
+1 -19
drivers/net/appletalk/cops.c
··· 194 194 static void cops_rx (struct net_device *dev); 195 195 static int cops_send_packet (struct sk_buff *skb, struct net_device *dev); 196 196 static void set_multicast_list (struct net_device *dev); 197 - static int cops_hard_header (struct sk_buff *skb, struct net_device *dev, 198 - unsigned short type, void *daddr, void *saddr, 199 - unsigned len); 200 - 201 197 static int cops_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); 202 198 static int cops_close (struct net_device *dev); 203 199 static struct net_device_stats *cops_get_stats (struct net_device *dev); ··· 327 331 dev->base_addr = ioaddr; 328 332 329 333 lp = netdev_priv(dev); 330 - memset(lp, 0, sizeof(struct cops_local)); 331 334 spin_lock_init(&lp->lock); 332 335 333 336 /* Copy local board variable to lp struct. */ ··· 335 340 dev->hard_start_xmit = cops_send_packet; 336 341 dev->tx_timeout = cops_timeout; 337 342 dev->watchdog_timeo = HZ * 2; 338 - dev->hard_header = cops_hard_header; 343 + 339 344 dev->get_stats = cops_get_stats; 340 345 dev->open = cops_open; 341 346 dev->stop = cops_close; ··· 937 942 { 938 943 if(cops_debug >= 3) 939 944 printk("%s: set_multicast_list executed\n", dev->name); 940 - } 941 - 942 - /* 943 - * Another Dummy function to keep the Appletalk layer happy. 944 - */ 945 - 946 - static int cops_hard_header(struct sk_buff *skb, struct net_device *dev, 947 - unsigned short type, void *daddr, void *saddr, 948 - unsigned len) 949 - { 950 - if(cops_debug >= 3) 951 - printk("%s: cops_hard_header executed. Wow!\n", dev->name); 952 - return 0; 953 945 } 954 946 955 947 /*
-10
drivers/net/appletalk/ltpc.c
··· 870 870 /* Actually netatalk needs fixing! */ 871 871 } 872 872 873 - static int ltpc_hard_header (struct sk_buff *skb, struct net_device *dev, 874 - unsigned short type, void *daddr, void *saddr, unsigned len) 875 - { 876 - if(debug & DEBUG_VERBOSE) 877 - printk("ltpc_hard_header called for device %s\n", 878 - dev->name); 879 - return 0; 880 - } 881 - 882 873 static int ltpc_poll_counter; 883 874 884 875 static void ltpc_poll(unsigned long l) ··· 1132 1141 1133 1142 /* Fill in the fields of the device structure with ethernet-generic values. */ 1134 1143 dev->hard_start_xmit = ltpc_xmit; 1135 - dev->hard_header = ltpc_hard_header; 1136 1144 dev->get_stats = ltpc_get_stats; 1137 1145 1138 1146 /* add the ltpc-specific things */
+11 -7
drivers/net/arcnet/arcnet.c
··· 102 102 static int arcnet_send_packet(struct sk_buff *skb, struct net_device *dev); 103 103 static void arcnet_timeout(struct net_device *dev); 104 104 static int arcnet_header(struct sk_buff *skb, struct net_device *dev, 105 - unsigned short type, void *daddr, void *saddr, 106 - unsigned len); 105 + unsigned short type, const void *daddr, 106 + const void *saddr, unsigned len); 107 107 static int arcnet_rebuild_header(struct sk_buff *skb); 108 108 static struct net_device_stats *arcnet_get_stats(struct net_device *dev); 109 109 static int go_tx(struct net_device *dev); ··· 317 317 return mtu == 65535 ? XMTU : mtu; 318 318 } 319 319 320 + static const struct header_ops arcnet_header_ops = { 321 + .create = arcnet_header, 322 + .rebuild = arcnet_rebuild_header, 323 + }; 324 + 320 325 321 326 /* Setup a struct device for ARCnet. */ 322 327 static void arcdev_setup(struct net_device *dev) 323 328 { 324 329 dev->type = ARPHRD_ARCNET; 330 + dev->header_ops = &arcnet_header_ops; 325 331 dev->hard_header_len = sizeof(struct archdr); 326 332 dev->mtu = choose_mtu(); 327 333 ··· 348 342 dev->hard_start_xmit = arcnet_send_packet; 349 343 dev->tx_timeout = arcnet_timeout; 350 344 dev->get_stats = arcnet_get_stats; 351 - dev->hard_header = arcnet_header; 352 - dev->rebuild_header = arcnet_rebuild_header; 353 345 } 354 346 355 347 struct net_device *alloc_arcdev(char *name) ··· 492 488 493 489 494 490 static int arcnet_header(struct sk_buff *skb, struct net_device *dev, 495 - unsigned short type, void *daddr, void *saddr, 496 - unsigned len) 491 + unsigned short type, const void *daddr, 492 + const void *saddr, unsigned len) 497 493 { 498 - struct arcnet_local *lp = dev->priv; 494 + const struct arcnet_local *lp = netdev_priv(dev); 499 495 uint8_t _daddr, proto_num; 500 496 struct ArcProto *proto; 501 497
+10 -3
drivers/net/hamradio/6pack.c
··· 288 288 289 289 /* Return the frame type ID */ 290 290 static int sp_header(struct sk_buff *skb, struct net_device *dev, 291 - unsigned short type, void *daddr, void *saddr, unsigned len) 291 + unsigned short type, const void *daddr, 292 + const void *saddr, unsigned len) 292 293 { 293 294 #ifdef CONFIG_INET 294 295 if (type != htons(ETH_P_AX25)) ··· 324 323 #endif 325 324 } 326 325 326 + static const struct header_ops sp_header_ops = { 327 + .create = sp_header, 328 + .rebuild = sp_rebuild_header, 329 + }; 330 + 327 331 static void sp_setup(struct net_device *dev) 328 332 { 329 333 /* Finish setting up the DEVICE info. */ ··· 337 331 dev->open = sp_open_dev; 338 332 dev->destructor = free_netdev; 339 333 dev->stop = sp_close; 340 - dev->hard_header = sp_header; 334 + 341 335 dev->get_stats = sp_get_stats; 342 336 dev->set_mac_address = sp_set_mac_address; 343 337 dev->hard_header_len = AX25_MAX_HEADER_LEN; 338 + dev->header_ops = &sp_header_ops; 339 + 344 340 dev->addr_len = AX25_ADDR_LEN; 345 341 dev->type = ARPHRD_AX25; 346 342 dev->tx_queue_len = 10; 347 - dev->rebuild_header = sp_rebuild_header; 348 343 dev->tx_timeout = NULL; 349 344 350 345 /* Only activated in AX.25 mode */
+1 -2
drivers/net/hamradio/baycom_epp.c
··· 1159 1159 /* Fill in the fields of the device structure */ 1160 1160 bc->skb = NULL; 1161 1161 1162 - dev->hard_header = ax25_hard_header; 1163 - dev->rebuild_header = ax25_rebuild_header; 1162 + dev->header_ops = &ax25_header_ops; 1164 1163 dev->set_mac_address = baycom_set_mac_address; 1165 1164 1166 1165 dev->type = ARPHRD_AX25; /* AF_AX25 device */
+1 -2
drivers/net/hamradio/bpqether.c
··· 483 483 dev->flags = 0; 484 484 485 485 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) 486 - dev->hard_header = ax25_hard_header; 487 - dev->rebuild_header = ax25_rebuild_header; 486 + dev->header_ops = &ax25_header_ops; 488 487 #endif 489 488 490 489 dev->type = ARPHRD_AX25;
+1 -2
drivers/net/hamradio/dmascc.c
··· 581 581 dev->do_ioctl = scc_ioctl; 582 582 dev->hard_start_xmit = scc_send_packet; 583 583 dev->get_stats = scc_get_stats; 584 - dev->hard_header = ax25_hard_header; 585 - dev->rebuild_header = ax25_rebuild_header; 584 + dev->header_ops = &ax25_header_ops; 586 585 dev->set_mac_address = scc_set_mac_address; 587 586 } 588 587 if (register_netdev(info->dev[0])) {
+1 -2
drivers/net/hamradio/hdlcdrv.c
··· 682 682 683 683 s->skb = NULL; 684 684 685 - dev->hard_header = ax25_hard_header; 686 - dev->rebuild_header = ax25_rebuild_header; 685 + dev->header_ops = &ax25_header_ops; 687 686 dev->set_mac_address = hdlcdrv_set_mac_address; 688 687 689 688 dev->type = ARPHRD_AX25; /* AF_AX25 device */
+10 -4
drivers/net/hamradio/mkiss.c
··· 578 578 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) 579 579 580 580 /* Return the frame type ID */ 581 - static int ax_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 582 - void *daddr, void *saddr, unsigned len) 581 + static int ax_header(struct sk_buff *skb, struct net_device *dev, 582 + unsigned short type, const void *daddr, 583 + const void *saddr, unsigned len) 583 584 { 584 585 #ifdef CONFIG_INET 585 586 if (type != htons(ETH_P_AX25)) ··· 671 670 return &ax->stats; 672 671 } 673 672 673 + static const struct header_ops ax_header_ops = { 674 + .create = ax_header, 675 + .rebuild = ax_rebuild_header, 676 + }; 677 + 674 678 static void ax_setup(struct net_device *dev) 675 679 { 676 680 /* Finish setting up the DEVICE info. */ ··· 689 683 dev->addr_len = 0; 690 684 dev->type = ARPHRD_AX25; 691 685 dev->tx_queue_len = 10; 692 - dev->hard_header = ax_header; 693 - dev->rebuild_header = ax_rebuild_header; 686 + dev->header_ops = &ax_header_ops; 687 + 694 688 695 689 memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN); 696 690 memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
+2 -2
drivers/net/hamradio/scc.c
··· 1551 1551 dev->stop = scc_net_close; 1552 1552 1553 1553 dev->hard_start_xmit = scc_net_tx; 1554 - dev->hard_header = ax25_hard_header; 1555 - dev->rebuild_header = ax25_rebuild_header; 1554 + dev->header_ops = &ax25_header_ops; 1555 + 1556 1556 dev->set_mac_address = scc_net_set_mac_address; 1557 1557 dev->get_stats = scc_net_get_stats; 1558 1558 dev->do_ioctl = scc_net_ioctl;
+1 -2
drivers/net/hamradio/yam.c
··· 1097 1097 1098 1098 skb_queue_head_init(&yp->send_queue); 1099 1099 1100 - dev->hard_header = ax25_hard_header; 1101 - dev->rebuild_header = ax25_rebuild_header; 1100 + dev->header_ops = &ax25_header_ops; 1102 1101 1103 1102 dev->set_mac_address = yam_set_mac_address; 1104 1103
+2 -6
drivers/net/loopback.c
··· 221 221 } 222 222 223 223 /* 224 - * The loopback device is special. There is only one instance and 225 - * it is statically allocated. Don't do this for other devices. 224 + * The loopback device is special. There is only one instance. 226 225 */ 227 226 static void loopback_setup(struct net_device *dev) 228 227 { 229 228 dev->get_stats = &get_stats; 230 229 dev->mtu = (16 * 1024) + 20 + 20 + 12; 231 230 dev->hard_start_xmit = loopback_xmit; 232 - dev->hard_header = eth_header; 233 - dev->hard_header_cache = eth_header_cache; 234 - dev->header_cache_update = eth_header_cache_update; 235 231 dev->hard_header_len = ETH_HLEN; /* 14 */ 236 232 dev->addr_len = ETH_ALEN; /* 6 */ 237 233 dev->tx_queue_len = 0; 238 234 dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ 239 - dev->rebuild_header = eth_rebuild_header; 240 235 dev->flags = IFF_LOOPBACK; 241 236 dev->features = NETIF_F_SG | NETIF_F_FRAGLIST 242 237 #ifdef LOOPBACK_TSO ··· 242 247 | NETIF_F_LLTX 243 248 | NETIF_F_NETNS_LOCAL, 244 249 dev->ethtool_ops = &loopback_ethtool_ops; 250 + dev->header_ops = &eth_header_ops; 245 251 dev->init = loopback_dev_init; 246 252 dev->destructor = loopback_dev_free; 247 253 }
+12 -3
drivers/net/macvlan.c
··· 164 164 } 165 165 166 166 static int macvlan_hard_header(struct sk_buff *skb, struct net_device *dev, 167 - unsigned short type, void *daddr, void *saddr, 168 - unsigned len) 167 + unsigned short type, const void *daddr, 168 + const void *saddr, unsigned len) 169 169 { 170 170 const struct macvlan_dev *vlan = netdev_priv(dev); 171 171 struct net_device *lowerdev = vlan->lowerdev; ··· 173 173 return dev_hard_header(skb, lowerdev, type, daddr, 174 174 saddr ? : dev->dev_addr, len); 175 175 } 176 + 177 + static const struct header_ops macvlan_hard_header_ops = { 178 + .create = macvlan_hard_header, 179 + .rebuild = eth_rebuild_header, 180 + .parse = eth_header_parse, 181 + .rebuild = eth_rebuild_header, 182 + .cache = eth_header_cache, 183 + .cache_update = eth_header_cache_update, 184 + }; 176 185 177 186 static int macvlan_open(struct net_device *dev) 178 187 { ··· 304 295 dev->change_mtu = macvlan_change_mtu; 305 296 dev->change_rx_flags = macvlan_change_rx_flags; 306 297 dev->set_multicast_list = macvlan_set_multicast_list; 307 - dev->hard_header = macvlan_hard_header; 308 298 dev->hard_start_xmit = macvlan_hard_start_xmit; 309 299 dev->destructor = free_netdev; 300 + dev->header_ops = &macvlan_hard_header_ops, 310 301 dev->ethtool_ops = &macvlan_ethtool_ops; 311 302 dev->tx_queue_len = 0; 312 303 }
+18 -10
drivers/net/myri_sbus.c
··· 676 676 * saddr=NULL means use device source address 677 677 * daddr=NULL means leave destination address (eg unresolved arp) 678 678 */ 679 - static int myri_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 680 - void *daddr, void *saddr, unsigned len) 679 + static int myri_header(struct sk_buff *skb, struct net_device *dev, 680 + unsigned short type, const void *daddr, 681 + const void *saddr, unsigned len) 681 682 { 682 683 struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 683 684 unsigned char *pad = (unsigned char *) skb_push(skb, MYRI_PAD_LEN); ··· 760 759 return 0; 761 760 } 762 761 763 - int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh) 762 + static int myri_header_cache(const struct neighbour *neigh, struct hh_cache *hh) 764 763 { 765 764 unsigned short type = hh->hh_type; 766 765 unsigned char *pad; 767 766 struct ethhdr *eth; 768 - struct net_device *dev = neigh->dev; 767 + const struct net_device *dev = neigh->dev; 769 768 770 769 pad = ((unsigned char *) hh->hh_data) + 771 770 HH_DATA_OFF(sizeof(*eth) + MYRI_PAD_LEN); 772 771 eth = (struct ethhdr *) (pad + MYRI_PAD_LEN); 773 772 774 - if (type == __constant_htons(ETH_P_802_3)) 773 + if (type == htons(ETH_P_802_3)) 775 774 return -1; 776 775 777 776 /* Refill MyriNet padding identifiers, this is just being anal. */ ··· 787 786 788 787 789 788 /* Called by Address Resolution module to notify changes in address. */ 790 - void myri_header_cache_update(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr) 789 + void myri_header_cache_update(struct hh_cache *hh, 790 + const struct net_device *dev, 791 + const unsigned char * haddr) 791 792 { 792 793 memcpy(((u8*)hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)), 793 794 haddr, dev->addr_len); ··· 883 880 printk("EEPROM: serial_num[%08x]\n", mp->eeprom.serial_num); 884 881 } 885 882 #endif 883 + 884 + static const struct header_ops myri_header_ops = { 885 + .create = myri_header, 886 + .rebuild = myri_rebuild_header, 887 + .cache = myri_header_cache, 888 + .cache_update = myri_header_cache_update, 889 + }; 886 890 887 891 static int __devinit myri_ether_init(struct sbus_dev *sdev) 888 892 { ··· 1075 1065 1076 1066 dev->mtu = MYRINET_MTU; 1077 1067 dev->change_mtu = myri_change_mtu; 1078 - dev->hard_header = myri_header; 1079 - dev->rebuild_header = myri_rebuild_header; 1068 + dev->header_ops = &myri_header_ops; 1069 + 1080 1070 dev->hard_header_len = (ETH_HLEN + MYRI_PAD_LEN); 1081 - dev->hard_header_cache = myri_header_cache; 1082 - dev->header_cache_update= myri_header_cache_update; 1083 1071 1084 1072 /* Load code onto the LANai. */ 1085 1073 DET(("Loading LANAI firmware\n"));
+22 -28
drivers/net/plip.c
··· 148 148 /* Functions for DEV methods */ 149 149 static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev); 150 150 static int plip_hard_header(struct sk_buff *skb, struct net_device *dev, 151 - unsigned short type, void *daddr, 152 - void *saddr, unsigned len); 153 - static int plip_hard_header_cache(struct neighbour *neigh, 151 + unsigned short type, const void *daddr, 152 + const void *saddr, unsigned len); 153 + static int plip_hard_header_cache(const struct neighbour *neigh, 154 154 struct hh_cache *hh); 155 155 static int plip_open(struct net_device *dev); 156 156 static int plip_close(struct net_device *dev); ··· 219 219 int is_deferred; 220 220 int port_owner; 221 221 int should_relinquish; 222 - int (*orig_hard_header)(struct sk_buff *skb, struct net_device *dev, 223 - unsigned short type, void *daddr, 224 - void *saddr, unsigned len); 225 - int (*orig_hard_header_cache)(struct neighbour *neigh, 226 - struct hh_cache *hh); 227 222 spinlock_t lock; 228 223 atomic_t kill_timer; 229 224 struct semaphore killed_timer_sem; ··· 260 265 return port->ops->read_status (port); 261 266 } 262 267 268 + static const struct header_ops plip_header_ops = { 269 + .create = plip_hard_header, 270 + .cache = plip_hard_header_cache, 271 + }; 272 + 263 273 /* Entry point of PLIP driver. 264 274 Probe the hardware, and register/initialize the driver. 265 275 ··· 284 284 dev->open = plip_open; 285 285 dev->stop = plip_close; 286 286 dev->do_ioctl = plip_ioctl; 287 - dev->header_cache_update = NULL; 287 + 288 288 dev->tx_queue_len = 10; 289 289 dev->flags = IFF_POINTOPOINT|IFF_NOARP; 290 290 memset(dev->dev_addr, 0xfc, ETH_ALEN); 291 291 292 - /* Set the private structure */ 293 - nl->orig_hard_header = dev->hard_header; 294 - dev->hard_header = plip_hard_header; 295 - 296 - nl->orig_hard_header_cache = dev->hard_header_cache; 297 - dev->hard_header_cache = plip_hard_header_cache; 292 + dev->header_ops = &plip_header_ops; 298 293 299 294 300 295 nl->port_owner = 0; ··· 988 993 } 989 994 990 995 static void 991 - plip_rewrite_address(struct net_device *dev, struct ethhdr *eth) 996 + plip_rewrite_address(const struct net_device *dev, struct ethhdr *eth) 992 997 { 993 - struct in_device *in_dev; 998 + const struct in_device *in_dev = dev->ip_ptr; 994 999 995 - if ((in_dev=dev->ip_ptr) != NULL) { 1000 + if (in_dev) { 996 1001 /* Any address will do - we take the first */ 997 - struct in_ifaddr *ifa=in_dev->ifa_list; 998 - if (ifa != NULL) { 1002 + const struct in_ifaddr *ifa = in_dev->ifa_list; 1003 + if (ifa) { 999 1004 memcpy(eth->h_source, dev->dev_addr, 6); 1000 1005 memset(eth->h_dest, 0xfc, 2); 1001 1006 memcpy(eth->h_dest+2, &ifa->ifa_address, 4); ··· 1005 1010 1006 1011 static int 1007 1012 plip_hard_header(struct sk_buff *skb, struct net_device *dev, 1008 - unsigned short type, void *daddr, 1009 - void *saddr, unsigned len) 1013 + unsigned short type, const void *daddr, 1014 + const void *saddr, unsigned len) 1010 1015 { 1011 - struct net_local *nl = netdev_priv(dev); 1012 1016 int ret; 1013 1017 1014 - if ((ret = nl->orig_hard_header(skb, dev, type, daddr, saddr, len)) >= 0) 1018 + ret = eth_header(skb, dev, type, daddr, saddr, len); 1019 + if (ret >= 0) 1015 1020 plip_rewrite_address (dev, (struct ethhdr *)skb->data); 1016 1021 1017 1022 return ret; 1018 1023 } 1019 1024 1020 - int plip_hard_header_cache(struct neighbour *neigh, 1025 + int plip_hard_header_cache(const struct neighbour *neigh, 1021 1026 struct hh_cache *hh) 1022 1027 { 1023 - struct net_local *nl = neigh->dev->priv; 1024 1028 int ret; 1025 1029 1026 - if ((ret = nl->orig_hard_header_cache(neigh, hh)) == 0) 1027 - { 1030 + ret = eth_header_cache(neigh, hh); 1031 + if (ret == 0) { 1028 1032 struct ethhdr *eth; 1029 1033 1030 1034 eth = (struct ethhdr*)(((u8*)hh->hh_data) +
+11 -50
drivers/net/shaper.c
··· 331 331 */ 332 332 333 333 static int shaper_header(struct sk_buff *skb, struct net_device *dev, 334 - unsigned short type, void *daddr, void *saddr, unsigned len) 334 + unsigned short type, 335 + const void *daddr, const void *saddr, unsigned len) 335 336 { 336 337 struct shaper *sh=dev->priv; 337 338 int v; 338 339 if(sh_debug) 339 340 printk("Shaper header\n"); 340 - skb->dev=sh->dev; 341 - v=sh->hard_header(skb,sh->dev,type,daddr,saddr,len); 342 - skb->dev=dev; 341 + skb->dev = sh->dev; 342 + v = dev_hard_header(skb, sh->dev, type, daddr, saddr, len); 343 + skb->dev = dev; 343 344 return v; 344 345 } 345 346 ··· 352 351 if(sh_debug) 353 352 printk("Shaper rebuild header\n"); 354 353 skb->dev=sh->dev; 355 - v=sh->rebuild_header(skb); 354 + v = sh->dev->header_ops->rebuild(skb); 356 355 skb->dev=dev; 357 356 return v; 358 357 } ··· 416 415 417 416 #endif 418 417 418 + static const struct header_ops shaper_ops = { 419 + .create = shaper_header, 420 + .rebuild = shaper_rebuild_header, 421 + }; 422 + 419 423 static int shaper_attach(struct net_device *shdev, struct shaper *sh, struct net_device *dev) 420 424 { 421 425 sh->dev = dev; 422 - sh->hard_start_xmit=dev->hard_start_xmit; 423 426 sh->get_stats=dev->get_stats; 424 - if(dev->hard_header) 425 - { 426 - sh->hard_header=dev->hard_header; 427 - shdev->hard_header = shaper_header; 428 - } 429 - else 430 - shdev->hard_header = NULL; 431 427 432 - if(dev->rebuild_header) 433 - { 434 - sh->rebuild_header = dev->rebuild_header; 435 - shdev->rebuild_header = shaper_rebuild_header; 436 - } 437 - else 438 - shdev->rebuild_header = NULL; 439 - 440 - #if 0 441 - if(dev->hard_header_cache) 442 - { 443 - sh->hard_header_cache = dev->hard_header_cache; 444 - shdev->hard_header_cache= shaper_cache; 445 - } 446 - else 447 - { 448 - shdev->hard_header_cache= NULL; 449 - } 450 - 451 - if(dev->header_cache_update) 452 - { 453 - sh->header_cache_update = dev->header_cache_update; 454 - shdev->header_cache_update = shaper_cache_update; 455 - } 456 - else 457 - shdev->header_cache_update= NULL; 458 - #else 459 - shdev->header_cache_update = NULL; 460 - shdev->hard_header_cache = NULL; 461 - #endif 462 428 shdev->neigh_setup = shaper_neigh_setup_dev; 463 - 464 429 shdev->hard_header_len=dev->hard_header_len; 465 430 shdev->type=dev->type; 466 431 shdev->addr_len=dev->addr_len; ··· 509 542 * Handlers for when we attach to a device. 510 543 */ 511 544 512 - dev->hard_header = shaper_header; 513 - dev->rebuild_header = shaper_rebuild_header; 514 - #if 0 515 - dev->hard_header_cache = shaper_cache; 516 - dev->header_cache_update= shaper_cache_update; 517 - #endif 518 545 dev->neigh_setup = shaper_neigh_setup_dev; 519 546 dev->do_ioctl = shaper_ioctl; 520 547 dev->hard_header_len = 0;
-1
drivers/net/skfp/skfddi.c
··· 260 260 dev->set_multicast_list = &skfp_ctl_set_multicast_list; 261 261 dev->set_mac_address = &skfp_ctl_set_mac_address; 262 262 dev->do_ioctl = &skfp_ioctl; 263 - dev->header_cache_update = NULL; /* not supported */ 264 263 265 264 SET_NETDEV_DEV(dev, &pdev->dev); 266 265
+20 -11
drivers/net/wan/cycx_x25.c
··· 131 131 cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev); 132 132 133 133 /* Network device interface */ 134 - static int cycx_netdevice_init(struct net_device *dev), 135 - cycx_netdevice_open(struct net_device *dev), 136 - cycx_netdevice_stop(struct net_device *dev), 137 - cycx_netdevice_hard_header(struct sk_buff *skb, 138 - struct net_device *dev, u16 type, 139 - void *daddr, void *saddr, unsigned len), 140 - cycx_netdevice_rebuild_header(struct sk_buff *skb), 141 - cycx_netdevice_hard_start_xmit(struct sk_buff *skb, 134 + static int cycx_netdevice_init(struct net_device *dev); 135 + static int cycx_netdevice_open(struct net_device *dev); 136 + static int cycx_netdevice_stop(struct net_device *dev); 137 + static int cycx_netdevice_hard_header(struct sk_buff *skb, 138 + struct net_device *dev, u16 type, 139 + const void *daddr, const void *saddr, 140 + unsigned len); 141 + static int cycx_netdevice_rebuild_header(struct sk_buff *skb); 142 + static int cycx_netdevice_hard_start_xmit(struct sk_buff *skb, 142 143 struct net_device *dev); 143 144 144 145 static struct net_device_stats * ··· 469 468 return 0; 470 469 } 471 470 471 + 472 472 /* Network Device Interface */ 473 + 474 + static const struct header_ops cycx_header_ops = { 475 + .create = cycx_netdevice_hard_header, 476 + .rebuild = cycx_netdevice_rebuild_header, 477 + }; 478 + 473 479 /* Initialize Linux network interface. 474 480 * 475 481 * This routine is called only once for each interface, during Linux network ··· 491 483 /* Initialize device driver entry points */ 492 484 dev->open = cycx_netdevice_open; 493 485 dev->stop = cycx_netdevice_stop; 494 - dev->hard_header = cycx_netdevice_hard_header; 495 - dev->rebuild_header = cycx_netdevice_rebuild_header; 486 + dev->header_ops = &cycx_header_ops; 487 + 496 488 dev->hard_start_xmit = cycx_netdevice_hard_start_xmit; 497 489 dev->get_stats = cycx_netdevice_get_stats; 498 490 ··· 562 554 * Return: media header length. */ 563 555 static int cycx_netdevice_hard_header(struct sk_buff *skb, 564 556 struct net_device *dev, u16 type, 565 - void *daddr, void *saddr, unsigned len) 557 + const void *daddr, const void *saddr, 558 + unsigned len) 566 559 { 567 560 skb->protocol = type; 568 561
+7 -3
drivers/net/wan/dlci.c
··· 66 66 */ 67 67 68 68 static int dlci_header(struct sk_buff *skb, struct net_device *dev, 69 - unsigned short type, void *daddr, void *saddr, 70 - unsigned len) 69 + unsigned short type, const void *daddr, 70 + const void *saddr, unsigned len) 71 71 { 72 72 struct frhdr hdr; 73 73 struct dlci_local *dlp; ··· 485 485 return(err); 486 486 } 487 487 488 + static const struct header_ops dlci_header_ops = { 489 + .create = dlci_header, 490 + }; 491 + 488 492 static void dlci_setup(struct net_device *dev) 489 493 { 490 494 struct dlci_local *dlp = dev->priv; ··· 498 494 dev->stop = dlci_close; 499 495 dev->do_ioctl = dlci_dev_ioctl; 500 496 dev->hard_start_xmit = dlci_transmit; 501 - dev->hard_header = dlci_header; 497 + dev->header_ops = &dlci_header_ops; 502 498 dev->get_stats = dlci_get_stats; 503 499 dev->change_mtu = dlci_change_mtu; 504 500 dev->destructor = free_netdev;
+4 -6
drivers/net/wan/hdlc.c
··· 232 232 return -EINVAL; 233 233 } 234 234 235 + static const struct header_ops hdlc_null_ops; 236 + 235 237 static void hdlc_setup_dev(struct net_device *dev) 236 238 { 237 239 /* Re-init all variables changed by HDLC protocol drivers, ··· 245 243 dev->type = ARPHRD_RAWHDLC; 246 244 dev->hard_header_len = 16; 247 245 dev->addr_len = 0; 248 - dev->hard_header = NULL; 249 - dev->rebuild_header = NULL; 250 - dev->set_mac_address = NULL; 251 - dev->hard_header_cache = NULL; 252 - dev->header_cache_update = NULL; 246 + dev->header_ops = &hdlc_null_ops; 247 + 253 248 dev->change_mtu = hdlc_change_mtu; 254 - dev->hard_header_parse = NULL; 255 249 } 256 250 257 251 static void hdlc_setup(struct net_device *dev)
+6 -4
drivers/net/wan/hdlc_cisco.c
··· 74 74 75 75 76 76 static int cisco_hard_header(struct sk_buff *skb, struct net_device *dev, 77 - u16 type, void *daddr, void *saddr, 77 + u16 type, const void *daddr, const void *saddr, 78 78 unsigned int len) 79 79 { 80 80 struct hdlc_header *data; ··· 309 309 } 310 310 311 311 312 - 313 312 static struct hdlc_proto proto = { 314 313 .start = cisco_start, 315 314 .stop = cisco_stop, ··· 316 317 .ioctl = cisco_ioctl, 317 318 .module = THIS_MODULE, 318 319 }; 319 - 320 + 321 + static const struct header_ops cisco_header_ops = { 322 + .create = cisco_hard_header, 323 + }; 320 324 321 325 static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr) 322 326 { ··· 367 365 368 366 memcpy(&state(hdlc)->settings, &new_settings, size); 369 367 dev->hard_start_xmit = hdlc->xmit; 370 - dev->hard_header = cisco_hard_header; 368 + dev->header_ops = &cisco_header_ops; 371 369 dev->type = ARPHRD_CISCO; 372 370 netif_dormant_on(dev); 373 371 return 0;
+1 -1
drivers/net/wan/hdlc_ppp.c
··· 73 73 74 74 sppp_close(dev); 75 75 sppp_detach(dev); 76 - dev->rebuild_header = NULL; 76 + 77 77 dev->change_mtu = state(hdlc)->old_change_mtu; 78 78 dev->mtu = HDLC_MAX_MTU; 79 79 dev->hard_header_len = 16;
+1 -1
drivers/net/wan/lmc/lmc_proto.c
··· 111 111 * They set a few basics because they don't use sync_ppp 112 112 */ 113 113 dev->flags |= IFF_POINTOPOINT; 114 - dev->hard_header = NULL; 114 + 115 115 dev->hard_header_len = 0; 116 116 dev->addr_len = 0; 117 117 }
+9 -10
drivers/net/wan/syncppp.c
··· 359 359 * Handle transmit packets. 360 360 */ 361 361 362 - static int sppp_hard_header(struct sk_buff *skb, struct net_device *dev, __u16 type, 363 - void *daddr, void *saddr, unsigned int len) 362 + static int sppp_hard_header(struct sk_buff *skb, 363 + struct net_device *dev, __u16 type, 364 + const void *daddr, const void *saddr, 365 + unsigned int len) 364 366 { 365 367 struct sppp *sp = (struct sppp *)sppp_of(dev); 366 368 struct ppp_header *h; ··· 394 392 return sizeof(struct ppp_header); 395 393 } 396 394 397 - static int sppp_rebuild_header(struct sk_buff *skb) 398 - { 399 - return 0; 400 - } 395 + static const struct header_ops sppp_header_ops = { 396 + .create = sppp_hard_header, 397 + }; 401 398 402 399 /* 403 400 * Send keepalive packets, every 10 seconds. ··· 1099 1098 * hard_start_xmit. 1100 1099 */ 1101 1100 1102 - dev->hard_header = sppp_hard_header; 1103 - dev->rebuild_header = sppp_rebuild_header; 1101 + dev->header_ops = &sppp_header_ops; 1102 + 1104 1103 dev->tx_queue_len = 10; 1105 1104 dev->type = ARPHRD_HDLC; 1106 1105 dev->addr_len = 0; ··· 1116 1115 dev->stop = sppp_close; 1117 1116 #endif 1118 1117 dev->change_mtu = sppp_change_mtu; 1119 - dev->hard_header_cache = NULL; 1120 - dev->header_cache_update = NULL; 1121 1118 dev->flags = IFF_MULTICAST|IFF_POINTOPOINT|IFF_NOARP; 1122 1119 } 1123 1120
+5 -1
drivers/net/wireless/airo.c
··· 2696 2696 return rc; 2697 2697 } 2698 2698 2699 + static const struct header_ops airo_header_ops = { 2700 + .parse = wll_header_parse, 2701 + }; 2702 + 2699 2703 static void wifi_setup(struct net_device *dev) 2700 2704 { 2701 - dev->hard_header_parse = wll_header_parse; 2705 + dev->header_ops = &airo_header_ops; 2702 2706 dev->hard_start_xmit = &airo_start_xmit11; 2703 2707 dev->get_stats = &airo_get_stats; 2704 2708 dev->set_mac_address = &airo_set_mac_address;
+1 -2
drivers/net/wireless/hostap/hostap.h
··· 30 30 const struct hfa384x_rx_frame *rx); 31 31 void hostap_dump_tx_header(const char *name, 32 32 const struct hfa384x_tx_frame *tx); 33 - int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr); 34 - int hostap_80211_prism_header_parse(struct sk_buff *skb, unsigned char *haddr); 33 + extern const struct header_ops hostap_80211_ops; 35 34 int hostap_80211_get_hdrlen(u16 fc); 36 35 struct net_device_stats *hostap_get_stats(struct net_device *dev); 37 36 void hostap_setup_dev(struct net_device *dev, local_info_t *local,
+1 -2
drivers/net/wireless/hostap/hostap_hw.c
··· 3258 3258 INIT_LIST_HEAD(&local->bss_list); 3259 3259 3260 3260 hostap_setup_dev(dev, local, 1); 3261 - local->saved_eth_header_parse = dev->hard_header_parse; 3262 3261 3263 3262 dev->hard_start_xmit = hostap_master_start_xmit; 3264 3263 dev->type = ARPHRD_IEEE80211; 3265 - dev->hard_header_parse = hostap_80211_header_parse; 3264 + dev->header_ops = &hostap_80211_ops; 3266 3265 3267 3266 rtnl_lock(); 3268 3267 ret = dev_alloc_name(dev, "wifi%d");
+1 -4
drivers/net/wireless/hostap/hostap_ioctl.c
··· 897 897 if (local->monitor_type == PRISM2_MONITOR_PRISM || 898 898 local->monitor_type == PRISM2_MONITOR_CAPHDR) { 899 899 dev->type = ARPHRD_IEEE80211_PRISM; 900 - dev->hard_header_parse = 901 - hostap_80211_prism_header_parse; 902 900 } else { 903 901 dev->type = ARPHRD_IEEE80211; 904 - dev->hard_header_parse = hostap_80211_header_parse; 905 902 } 906 903 } 907 904 ··· 1138 1141 1139 1142 printk(KERN_DEBUG "%s: Disabling monitor mode\n", dev->name); 1140 1143 dev->type = ARPHRD_ETHER; 1141 - dev->hard_header_parse = local->saved_eth_header_parse; 1144 + 1142 1145 if (local->func->cmd(dev, HFA384X_CMDCODE_TEST | 1143 1146 (HFA384X_TEST_STOP << 8), 1144 1147 0, NULL, NULL))
+27 -16
drivers/net/wireless/hostap/hostap_main.c
··· 594 594 } 595 595 596 596 597 - int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr) 597 + int hostap_80211_header_parse(const struct sk_buff *skb, unsigned char *haddr) 598 598 { 599 - memcpy(haddr, skb_mac_header(skb) + 10, ETH_ALEN); /* addr2 */ 600 - return ETH_ALEN; 601 - } 599 + struct hostap_interface *iface = netdev_priv(skb->dev); 600 + local_info_t *local = iface->local; 602 601 602 + if (local->monitor_type == PRISM2_MONITOR_PRISM || 603 + local->monitor_type == PRISM2_MONITOR_CAPHDR) { 604 + const unsigned char *mac = skb_mac_header(skb); 603 605 604 - int hostap_80211_prism_header_parse(struct sk_buff *skb, unsigned char *haddr) 605 - { 606 - const unsigned char *mac = skb_mac_header(skb); 606 + if (*(u32 *)mac == LWNG_CAP_DID_BASE) { 607 + memcpy(haddr, 608 + mac + sizeof(struct linux_wlan_ng_prism_hdr) + 10, 609 + ETH_ALEN); /* addr2 */ 610 + } else { /* (*(u32 *)mac == htonl(LWNG_CAPHDR_VERSION)) */ 611 + memcpy(haddr, 612 + mac + sizeof(struct linux_wlan_ng_cap_hdr) + 10, 613 + ETH_ALEN); /* addr2 */ 614 + } 615 + } else 616 + memcpy(haddr, skb_mac_header(skb) + 10, ETH_ALEN); /* addr2 */ 607 617 608 - if (*(u32 *)mac == LWNG_CAP_DID_BASE) { 609 - memcpy(haddr, mac + sizeof(struct linux_wlan_ng_prism_hdr) + 10, 610 - ETH_ALEN); /* addr2 */ 611 - } else { /* (*(u32 *)mac == htonl(LWNG_CAPHDR_VERSION)) */ 612 - memcpy(haddr, mac + sizeof(struct linux_wlan_ng_cap_hdr) + 10, 613 - ETH_ALEN); /* addr2 */ 614 - } 615 618 return ETH_ALEN; 616 619 } 617 620 ··· 846 843 local->func->schedule_reset(local); 847 844 } 848 845 846 + const struct header_ops hostap_80211_ops = { 847 + .create = eth_header, 848 + .rebuild = eth_rebuild_header, 849 + .cache = eth_header_cache, 850 + .cache_update = eth_header_cache_update, 851 + 852 + .parse = hostap_80211_header_parse, 853 + }; 854 + EXPORT_SYMBOL(hostap_80211_ops); 849 855 850 856 void hostap_setup_dev(struct net_device *dev, local_info_t *local, 851 857 int main_dev) ··· 895 883 netif_stop_queue(dev); 896 884 } 897 885 898 - 899 886 static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked) 900 887 { 901 888 struct net_device *dev = local->dev; ··· 912 901 913 902 local->apdev->hard_start_xmit = hostap_mgmt_start_xmit; 914 903 local->apdev->type = ARPHRD_IEEE80211; 915 - local->apdev->hard_header_parse = hostap_80211_header_parse; 904 + local->apdev->header_ops = &hostap_80211_ops; 916 905 917 906 return 0; 918 907 }
-2
drivers/net/wireless/hostap/hostap_wlan.h
··· 736 736 PRISM2_MONITOR_80211 = 0, PRISM2_MONITOR_PRISM = 1, 737 737 PRISM2_MONITOR_CAPHDR = 2 738 738 } monitor_type; 739 - int (*saved_eth_header_parse)(struct sk_buff *skb, 740 - unsigned char *haddr); 741 739 int monitor_allow_fcserr; 742 740 743 741 int hostapd; /* whether user space daemon, hostapd, is used for AP
+9 -4
drivers/net/wireless/strip.c
··· 1631 1631 */ 1632 1632 1633 1633 static int strip_header(struct sk_buff *skb, struct net_device *dev, 1634 - unsigned short type, void *daddr, void *saddr, 1635 - unsigned len) 1634 + unsigned short type, const void *daddr, 1635 + const void *saddr, unsigned len) 1636 1636 { 1637 1637 struct strip *strip_info = netdev_priv(dev); 1638 1638 STRIP_Header *header = (STRIP_Header *) skb_push(skb, sizeof(STRIP_Header)); ··· 2497 2497 return 0; 2498 2498 } 2499 2499 2500 + static const struct header_ops strip_header_ops = { 2501 + .create = strip_header, 2502 + .rebuild = strip_rebuild_header, 2503 + }; 2504 + 2500 2505 /* 2501 2506 * This routine is called by DDI when the 2502 2507 * (dynamically assigned) device is registered ··· 2536 2531 dev->open = strip_open_low; 2537 2532 dev->stop = strip_close_low; 2538 2533 dev->hard_start_xmit = strip_xmit; 2539 - dev->hard_header = strip_header; 2540 - dev->rebuild_header = strip_rebuild_header; 2534 + dev->header_ops = &strip_header_ops; 2535 + 2541 2536 dev->set_mac_address = strip_set_mac_address; 2542 2537 dev->get_stats = strip_get_stats; 2543 2538 dev->change_mtu = strip_change_mtu;
+1 -2
drivers/s390/net/qeth.h
··· 833 833 struct qeth_qdio_info qdio; 834 834 struct qeth_perf_stats perf_stats; 835 835 int use_hard_stop; 836 - int (*orig_hard_header)(struct sk_buff *,struct net_device *, 837 - unsigned short,void *,void *,unsigned); 836 + const struct header_ops *orig_header_ops; 838 837 struct qeth_osn_info osn_info; 839 838 atomic_t force_alloc_skb; 840 839 };
+26 -18
drivers/s390/net/qeth_main.c
··· 160 160 static void 161 161 qeth_setadp_promisc_mode(struct qeth_card *); 162 162 163 + static int 164 + qeth_hard_header_parse(const struct sk_buff *skb, unsigned char *haddr); 165 + 163 166 static void 164 167 qeth_notify_processes(void) 165 168 { ··· 3790 3787 /*hard_header fake function; used in case fake_ll is set */ 3791 3788 static int 3792 3789 qeth_fake_header(struct sk_buff *skb, struct net_device *dev, 3793 - unsigned short type, void *daddr, void *saddr, 3794 - unsigned len) 3790 + unsigned short type, const void *daddr, const void *saddr, 3791 + unsigned len) 3795 3792 { 3796 3793 if(dev->type == ARPHRD_IEEE802_TR){ 3797 3794 struct trh_hdr *hdr; ··· 3813 3810 3814 3811 } 3815 3812 } 3813 + 3814 + static const struct header_ops qeth_fake_ops = { 3815 + .create = qeth_fake_header, 3816 + .parse = qeth_hard_header_parse, 3817 + }; 3816 3818 3817 3819 static int 3818 3820 qeth_send_packet(struct qeth_card *, struct sk_buff *); ··· 4657 4649 [qeth_get_priority_queue(card, skb, ipv, cast_type)]; 4658 4650 if (!card->options.layer2) { 4659 4651 ipv = qeth_get_ip_version(skb); 4660 - if ((card->dev->hard_header == qeth_fake_header) && ipv) { 4652 + if ((card->dev->header_ops == &qeth_fake_ops) && ipv) { 4661 4653 new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC); 4662 4654 if (!new_skb) 4663 4655 return -ENOMEM; ··· 6574 6566 const struct qeth_card *card; 6575 6567 const struct ethhdr *eth; 6576 6568 6569 + if (dev->type != ARPHRD_IEEE802_TR) 6570 + return 0; 6571 + 6577 6572 card = qeth_get_card_from_dev(skb->dev); 6578 6573 if (card->options.layer2) 6579 6574 goto haveheader; ··· 6607 6596 return ETH_ALEN; 6608 6597 } 6609 6598 6599 + static const struct header_ops qeth_null_ops = { 6600 + .parse = qeth_hard_header_parse, 6601 + }; 6602 + 6610 6603 static int 6611 6604 qeth_netdev_init(struct net_device *dev) 6612 6605 { ··· 6635 6620 dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid; 6636 6621 dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid; 6637 6622 #endif 6638 - if (qeth_get_netdev_flags(card) & IFF_NOARP) { 6639 - dev->rebuild_header = NULL; 6640 - dev->hard_header = NULL; 6641 - dev->header_cache_update = NULL; 6642 - dev->hard_header_cache = NULL; 6643 - } 6623 + dev->header_ops = &qeth_null_ops; 6624 + 6644 6625 #ifdef CONFIG_QETH_IPV6 6645 6626 /*IPv6 address autoconfiguration stuff*/ 6646 6627 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) ··· 6644 6633 #endif 6645 6634 if (card->options.fake_ll && 6646 6635 (qeth_get_netdev_flags(card) & IFF_NOARP)) 6647 - dev->hard_header = qeth_fake_header; 6648 - if (dev->type == ARPHRD_IEEE802_TR) 6649 - dev->hard_header_parse = NULL; 6650 - else 6651 - dev->hard_header_parse = qeth_hard_header_parse; 6636 + dev->header_ops = &qeth_fake_ops; 6637 + 6652 6638 dev->set_mac_address = qeth_layer2_set_mac_address; 6653 6639 dev->flags |= qeth_get_netdev_flags(card); 6654 6640 if ((card->options.fake_broadcast) || ··· 6748 6740 } 6749 6741 /*network device will be recovered*/ 6750 6742 if (card->dev) { 6751 - card->dev->hard_header = card->orig_hard_header; 6743 + card->dev->header_ops = card->orig_header_ops; 6752 6744 if (card->options.fake_ll && 6753 6745 (qeth_get_netdev_flags(card) & IFF_NOARP)) 6754 - card->dev->hard_header = qeth_fake_header; 6746 + card->dev->header_ops = &qeth_fake_ops; 6755 6747 return 0; 6756 6748 } 6757 6749 /* at first set_online allocate netdev */ ··· 6765 6757 goto out; 6766 6758 } 6767 6759 card->dev->priv = card; 6768 - card->orig_hard_header = card->dev->hard_header; 6760 + card->orig_header_ops = card->dev->header_ops; 6769 6761 card->dev->type = qeth_get_arphdr_type(card->info.type, 6770 6762 card->info.link_type); 6771 6763 card->dev->init = qeth_netdev_init; ··· 8316 8308 if (card == NULL) 8317 8309 goto out; 8318 8310 if((card->options.layer2) || 8319 - (card->dev->hard_header == qeth_fake_header)) 8311 + (card->dev->header_ops == &qeth_fake_ops)) 8320 8312 goto out; 8321 8313 8322 8314 rcu_read_lock();
+12 -8
include/linux/etherdevice.h
··· 29 29 #include <linux/random.h> 30 30 31 31 #ifdef __KERNEL__ 32 - extern int eth_header(struct sk_buff *skb, struct net_device *dev, 33 - unsigned short type, void *daddr, 34 - void *saddr, unsigned len); 35 - extern int eth_rebuild_header(struct sk_buff *skb); 36 32 extern __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); 37 - extern void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, 38 - unsigned char * haddr); 39 - extern int eth_header_cache(struct neighbour *neigh, 40 - struct hh_cache *hh); 33 + extern const struct header_ops eth_header_ops; 34 + 35 + extern int eth_header(struct sk_buff *skb, struct net_device *dev, 36 + unsigned short type, 37 + const void *daddr, const void *saddr, unsigned len); 38 + extern int eth_rebuild_header(struct sk_buff *skb); 39 + extern int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); 40 + extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh); 41 + extern void eth_header_cache_update(struct hh_cache *hh, 42 + const struct net_device *dev, 43 + const unsigned char *haddr); 44 + 41 45 42 46 extern struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count); 43 47 #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
+2
include/linux/if_ether.h
··· 117 117 return (struct ethhdr *)skb_mac_header(skb); 118 118 } 119 119 120 + int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); 121 + 120 122 #ifdef CONFIG_SYSCTL 121 123 extern struct ctl_table ether_table[]; 122 124 #endif
-11
include/linux/if_shaper.h
··· 25 25 an empty queue */ 26 26 spinlock_t lock; 27 27 struct net_device *dev; 28 - int (*hard_start_xmit) (struct sk_buff *skb, 29 - struct net_device *dev); 30 - int (*hard_header) (struct sk_buff *skb, 31 - struct net_device *dev, 32 - unsigned short type, 33 - void *daddr, 34 - void *saddr, 35 - unsigned len); 36 - int (*rebuild_header)(struct sk_buff *skb); 37 - int (*hard_header_cache)(struct neighbour *neigh, struct hh_cache *hh); 38 - void (*header_cache_update)(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr); 39 28 struct net_device_stats* (*get_stats)(struct net_device *dev); 40 29 struct timer_list timer; 41 30 };
-7
include/linux/isdn.h
··· 353 353 /* a particular channel (including */ 354 354 /* the frame_cnt */ 355 355 356 - int (*org_hhc)( 357 - struct neighbour *neigh, 358 - struct hh_cache *hh); 359 - /* Ptr to orig. header_cache_update */ 360 - void (*org_hcu)(struct hh_cache *, 361 - struct net_device *, 362 - unsigned char *); 363 356 int pppbind; /* ippp device for bindings */ 364 357 int dialtimeout; /* How long shall we try on dialing? (jiffies) */ 365 358 int dialwait; /* How long shall we wait after failed attempt? (jiffies) */
+23 -20
include/linux/netdevice.h
··· 250 250 #define LL_RESERVED_SPACE_EXTRA(dev,extra) \ 251 251 ((((dev)->hard_header_len+extra)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) 252 252 253 + struct header_ops { 254 + int (*create) (struct sk_buff *skb, struct net_device *dev, 255 + unsigned short type, const void *daddr, 256 + const void *saddr, unsigned len); 257 + int (*parse)(const struct sk_buff *skb, unsigned char *haddr); 258 + int (*rebuild)(struct sk_buff *skb); 259 + #define HAVE_HEADER_CACHE 260 + int (*cache)(const struct neighbour *neigh, struct hh_cache *hh); 261 + void (*cache_update)(struct hh_cache *hh, 262 + const struct net_device *dev, 263 + const unsigned char *haddr); 264 + }; 265 + 253 266 /* These flag bits are private to the generic network queueing 254 267 * layer, they may not be explicitly referenced by any other 255 268 * code. ··· 505 492 #endif 506 493 const struct ethtool_ops *ethtool_ops; 507 494 495 + /* Hardware header description */ 496 + const struct header_ops *header_ops; 497 + 508 498 /* 509 499 * This marks the end of the "visible" part of the structure. All 510 500 * fields hereafter are internal to the system, and may change at ··· 631 615 int (*open)(struct net_device *dev); 632 616 int (*stop)(struct net_device *dev); 633 617 #define HAVE_NETDEV_POLL 634 - int (*hard_header) (struct sk_buff *skb, 635 - struct net_device *dev, 636 - unsigned short type, 637 - void *daddr, 638 - void *saddr, 639 - unsigned len); 640 - int (*rebuild_header)(struct sk_buff *skb); 641 618 #define HAVE_CHANGE_RX_FLAGS 642 619 void (*change_rx_flags)(struct net_device *dev, 643 620 int flags); ··· 647 638 #define HAVE_SET_CONFIG 648 639 int (*set_config)(struct net_device *dev, 649 640 struct ifmap *map); 650 - #define HAVE_HEADER_CACHE 651 - int (*hard_header_cache)(struct neighbour *neigh, 652 - struct hh_cache *hh); 653 - void (*header_cache_update)(struct hh_cache *hh, 654 - struct net_device *dev, 655 - unsigned char * haddr); 656 641 #define HAVE_CHANGE_MTU 657 642 int (*change_mtu)(struct net_device *dev, int new_mtu); 658 643 ··· 660 657 void (*vlan_rx_kill_vid)(struct net_device *dev, 661 658 unsigned short vid); 662 659 663 - int (*hard_header_parse)(const struct sk_buff *skb, 664 - unsigned char *haddr); 665 660 int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); 666 661 #ifdef CONFIG_NETPOLL 667 662 struct netpoll_info *npinfo; ··· 803 802 804 803 static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, 805 804 unsigned short type, 806 - void *daddr, void *saddr, unsigned len) 805 + const void *daddr, const void *saddr, 806 + unsigned len) 807 807 { 808 - if (!dev->hard_header) 808 + if (!dev->header_ops) 809 809 return 0; 810 - return dev->hard_header(skb, dev, type, daddr, saddr, len); 810 + 811 + return dev->header_ops->create(skb, dev, type, daddr, saddr, len); 811 812 } 812 813 813 814 static inline int dev_parse_header(const struct sk_buff *skb, ··· 817 814 { 818 815 const struct net_device *dev = skb->dev; 819 816 820 - if (!dev->hard_header_parse) 817 + if (!dev->header_ops->parse) 821 818 return 0; 822 - return dev->hard_header_parse(skb, haddr); 819 + return dev->header_ops->parse(skb, haddr); 823 820 } 824 821 825 822 typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
+4 -1
include/net/ax25.h
··· 363 363 extern int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); 364 364 365 365 /* ax25_ip.c */ 366 - extern int ax25_hard_header(struct sk_buff *, struct net_device *, unsigned short, void *, void *, unsigned int); 366 + extern int ax25_hard_header(struct sk_buff *, struct net_device *, 367 + unsigned short, const void *, 368 + const void *, unsigned int); 367 369 extern int ax25_rebuild_header(struct sk_buff *); 370 + extern const struct header_ops ax25_header_ops; 368 371 369 372 /* ax25_out.c */ 370 373 extern ax25_cb *ax25_send_frame(struct sk_buff *, int, ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
+2 -3
include/net/pkt_sched.h
··· 97 97 /* Calculate maximal size of packet seen by hard_start_xmit 98 98 routine of this device. 99 99 */ 100 - static inline unsigned psched_mtu(struct net_device *dev) 100 + static inline unsigned psched_mtu(const struct net_device *dev) 101 101 { 102 - unsigned mtu = dev->mtu; 103 - return dev->hard_header ? mtu + dev->hard_header_len : mtu; 102 + return dev->mtu + dev->hard_header_len; 104 103 } 105 104 106 105 #endif
+7 -4
net/802/fc.c
··· 35 35 36 36 static int fc_header(struct sk_buff *skb, struct net_device *dev, 37 37 unsigned short type, 38 - void *daddr, void *saddr, unsigned len) 38 + const void *daddr, const void *saddr, unsigned len) 39 39 { 40 40 struct fch_hdr *fch; 41 41 int hdr_len; ··· 95 95 #endif 96 96 } 97 97 98 + static const struct header_ops fc_header_ops = { 99 + .create = fc_header, 100 + .rebuild = fc_rebuild_header, 101 + }; 102 + 98 103 static void fc_setup(struct net_device *dev) 99 104 { 100 - dev->hard_header = fc_header; 101 - dev->rebuild_header = fc_rebuild_header; 102 - 105 + dev->header_ops = &fc_header_ops; 103 106 dev->type = ARPHRD_IEEE802; 104 107 dev->hard_header_len = FC_HLEN; 105 108 dev->mtu = 2024;
+7 -3
net/802/fddi.c
··· 52 52 53 53 static int fddi_header(struct sk_buff *skb, struct net_device *dev, 54 54 unsigned short type, 55 - void *daddr, void *saddr, unsigned len) 55 + const void *daddr, const void *saddr, unsigned len) 56 56 { 57 57 int hl = FDDI_K_SNAP_HLEN; 58 58 struct fddihdr *fddi; ··· 175 175 return(0); 176 176 } 177 177 178 + static const struct header_ops fddi_header_ops = { 179 + .create = fddi_header, 180 + .rebuild = fddi_rebuild_header, 181 + }; 182 + 178 183 static void fddi_setup(struct net_device *dev) 179 184 { 180 185 dev->change_mtu = fddi_change_mtu; 181 - dev->hard_header = fddi_header; 182 - dev->rebuild_header = fddi_rebuild_header; 186 + dev->header_ops = &fddi_header_ops; 183 187 184 188 dev->type = ARPHRD_FDDI; 185 189 dev->hard_header_len = FDDI_K_SNAP_HLEN+3; /* Assume 802.2 SNAP hdr len + 3 pad bytes */
+9 -7
net/802/hippi.c
··· 45 45 */ 46 46 47 47 static int hippi_header(struct sk_buff *skb, struct net_device *dev, 48 - unsigned short type, void *daddr, void *saddr, 49 - unsigned len) 48 + unsigned short type, 49 + const void *daddr, const void *saddr, unsigned len) 50 50 { 51 51 struct hippi_hdr *hip = (struct hippi_hdr *)skb_push(skb, HIPPI_HLEN); 52 52 struct hippi_cb *hcb = (struct hippi_cb *) skb->cb; ··· 182 182 return 0; 183 183 } 184 184 185 + static const struct header_ops hippi_header_ops = { 186 + .create = hippi_header, 187 + .rebuild = hippi_rebuild_header, 188 + }; 189 + 190 + 185 191 static void hippi_setup(struct net_device *dev) 186 192 { 187 193 dev->set_multicast_list = NULL; 188 194 dev->change_mtu = hippi_change_mtu; 189 - dev->hard_header = hippi_header; 190 - dev->rebuild_header = hippi_rebuild_header; 195 + dev->header_ops = &hippi_header_ops; 191 196 dev->set_mac_address = hippi_mac_addr; 192 - dev->hard_header_parse = NULL; 193 - dev->hard_header_cache = NULL; 194 - dev->header_cache_update = NULL; 195 197 dev->neigh_setup = hippi_neigh_setup_dev; 196 198 197 199 /*
+10 -5
net/802/tr.c
··· 100 100 101 101 static int tr_header(struct sk_buff *skb, struct net_device *dev, 102 102 unsigned short type, 103 - void *daddr, void *saddr, unsigned len) 103 + const void *daddr, const void *saddr, unsigned len) 104 104 { 105 105 struct trh_hdr *trh; 106 106 int hdr_len; ··· 142 142 if(daddr) 143 143 { 144 144 memcpy(trh->daddr,daddr,dev->addr_len); 145 - tr_source_route(skb,trh,dev); 145 + tr_source_route(skb, trh, dev); 146 146 return(hdr_len); 147 147 } 148 148 ··· 247 247 * We try to do source routing... 248 248 */ 249 249 250 - void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev) 250 + void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh, 251 + struct net_device *dev) 251 252 { 252 253 int slack; 253 254 unsigned int hash; ··· 593 592 594 593 #endif 595 594 595 + static const struct header_ops tr_header_ops = { 596 + .create = tr_header, 597 + .rebuild= tr_rebuild_header, 598 + }; 599 + 596 600 static void tr_setup(struct net_device *dev) 597 601 { 598 602 /* 599 603 * Configure and register 600 604 */ 601 605 602 - dev->hard_header = tr_header; 603 - dev->rebuild_header = tr_rebuild_header; 606 + dev->header_ops = &tr_header_ops; 604 607 605 608 dev->type = ARPHRD_IEEE802_TR; 606 609 dev->hard_header_len = TR_HLEN;
+8 -6
net/8021q/vlan.c
··· 314 314 */ 315 315 static struct lock_class_key vlan_netdev_xmit_lock_key; 316 316 317 + static const struct header_ops vlan_header_ops = { 318 + .create = vlan_dev_hard_header, 319 + .rebuild = vlan_dev_rebuild_header, 320 + .parse = eth_header_parse, 321 + }; 322 + 317 323 static int vlan_dev_init(struct net_device *dev) 318 324 { 319 325 struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev; ··· 337 331 memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len); 338 332 339 333 if (real_dev->features & NETIF_F_HW_VLAN_TX) { 340 - dev->hard_header = real_dev->hard_header; 334 + dev->header_ops = real_dev->header_ops; 341 335 dev->hard_header_len = real_dev->hard_header_len; 342 336 dev->hard_start_xmit = vlan_dev_hwaccel_hard_start_xmit; 343 - dev->rebuild_header = real_dev->rebuild_header; 344 337 } else { 345 - dev->hard_header = vlan_dev_hard_header; 338 + dev->header_ops = &vlan_header_ops; 346 339 dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN; 347 340 dev->hard_start_xmit = vlan_dev_hard_start_xmit; 348 - dev->rebuild_header = vlan_dev_rebuild_header; 349 341 } 350 - dev->hard_header_parse = real_dev->hard_header_parse; 351 - dev->hard_header_cache = NULL; 352 342 353 343 lockdep_set_class(&dev->_xmit_lock, &vlan_netdev_xmit_lock_key); 354 344 return 0;
+2 -2
net/8021q/vlan.h
··· 53 53 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, 54 54 struct packet_type *ptype, struct net_device *orig_dev); 55 55 int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, 56 - unsigned short type, void *daddr, void *saddr, 57 - unsigned len); 56 + unsigned short type, const void *daddr, 57 + const void *saddr, unsigned len); 58 58 int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); 59 59 int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); 60 60 int vlan_dev_change_mtu(struct net_device *dev, int new_mtu);
+2 -2
net/8021q/vlan_dev.c
··· 343 343 * physical devices. 344 344 */ 345 345 int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, 346 - unsigned short type, void *daddr, void *saddr, 347 - unsigned len) 346 + unsigned short type, 347 + const void *daddr, const void *saddr, unsigned len) 348 348 { 349 349 struct vlan_hdr *vhdr; 350 350 unsigned short veth_TCI = 0;
-4
net/appletalk/dev.c
··· 24 24 /* Fill in the fields of the device structure with localtalk-generic values. */ 25 25 26 26 dev->change_mtu = ltalk_change_mtu; 27 - dev->hard_header = NULL; 28 - dev->rebuild_header = NULL; 29 27 dev->set_mac_address = ltalk_mac_addr; 30 - dev->hard_header_cache = NULL; 31 - dev->header_cache_update= NULL; 32 28 33 29 dev->type = ARPHRD_LOCALTLK; 34 30 dev->hard_header_len = LTALK_HLEN;
+13 -2
net/ax25/ax25_ip.c
··· 46 46 47 47 #ifdef CONFIG_INET 48 48 49 - int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len) 49 + int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, 50 + unsigned short type, const void *daddr, 51 + const void *saddr, unsigned len) 50 52 { 51 53 unsigned char *buff; 52 54 ··· 217 215 218 216 #else /* INET */ 219 217 220 - int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len) 218 + int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, 219 + unsigned short type, const void *daddr, 220 + const void *saddr, unsigned len) 221 221 { 222 222 return -AX25_HEADER_LEN; 223 223 } ··· 231 227 232 228 #endif 233 229 230 + const struct header_ops ax25_header_ops = { 231 + .create = ax25_hard_header, 232 + .rebuild = ax25_rebuild_header, 233 + }; 234 + 234 235 EXPORT_SYMBOL(ax25_hard_header); 235 236 EXPORT_SYMBOL(ax25_rebuild_header); 237 + EXPORT_SYMBOL(ax25_header_ops); 238 +
-16
net/core/dev.c
··· 967 967 request_module("%s", name); 968 968 } 969 969 970 - static int default_rebuild_header(struct sk_buff *skb) 971 - { 972 - printk(KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n", 973 - skb->dev ? skb->dev->name : "NULL!!!"); 974 - kfree_skb(skb); 975 - return 1; 976 - } 977 - 978 970 /** 979 971 * dev_open - prepare an interface for use. 980 972 * @dev: device to open ··· 3552 3560 dev->features &= ~NETIF_F_UFO; 3553 3561 } 3554 3562 } 3555 - 3556 - /* 3557 - * nil rebuild_header routine, 3558 - * that should be never called and used as just bug trap. 3559 - */ 3560 - 3561 - if (!dev->rebuild_header) 3562 - dev->rebuild_header = default_rebuild_header; 3563 3563 3564 3564 ret = netdev_register_kobject(dev); 3565 3565 if (ret)
+6 -5
net/core/neighbour.c
··· 897 897 static void neigh_update_hhs(struct neighbour *neigh) 898 898 { 899 899 struct hh_cache *hh; 900 - void (*update)(struct hh_cache*, struct net_device*, unsigned char *) = 901 - neigh->dev->header_cache_update; 900 + void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) 901 + = neigh->dev->header_ops->cache_update; 902 902 903 903 if (update) { 904 904 for (hh = neigh->hh; hh; hh = hh->hh_next) { ··· 1095 1095 hh->hh_type = protocol; 1096 1096 atomic_set(&hh->hh_refcnt, 0); 1097 1097 hh->hh_next = NULL; 1098 - if (dev->hard_header_cache(n, hh)) { 1098 + 1099 + if (dev->header_ops->cache(n, hh)) { 1099 1100 kfree(hh); 1100 1101 hh = NULL; 1101 1102 } else { ··· 1128 1127 1129 1128 if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, 1130 1129 skb->len) < 0 && 1131 - dev->rebuild_header(skb)) 1130 + dev->header_ops->rebuild(skb)) 1132 1131 return 0; 1133 1132 1134 1133 return dev_queue_xmit(skb); ··· 1150 1149 if (!neigh_event_send(neigh, skb)) { 1151 1150 int err; 1152 1151 struct net_device *dev = neigh->dev; 1153 - if (dev->hard_header_cache && !dst->hh) { 1152 + if (dev->header_ops->cache && !dst->hh) { 1154 1153 write_lock_bh(&neigh->lock); 1155 1154 if (!dst->hh) 1156 1155 neigh_hh_init(neigh, dst, dst->ops->protocol);
+24 -12
net/ethernet/eth.c
··· 75 75 * Set the protocol type. For a packet of type ETH_P_802_3 we put the length 76 76 * in here instead. It is up to the 802.2 layer to carry protocol information. 77 77 */ 78 - int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 79 - void *daddr, void *saddr, unsigned len) 78 + int eth_header(struct sk_buff *skb, struct net_device *dev, 79 + unsigned short type, 80 + const void *daddr, const void *saddr, unsigned len) 80 81 { 81 82 struct ethhdr *eth = (struct ethhdr *)skb_push(skb, ETH_HLEN); 82 83 ··· 110 109 111 110 return -ETH_HLEN; 112 111 } 112 + EXPORT_SYMBOL(eth_header); 113 113 114 114 /** 115 115 * eth_rebuild_header- rebuild the Ethernet MAC header. ··· 143 141 144 142 return 0; 145 143 } 144 + EXPORT_SYMBOL(eth_rebuild_header); 146 145 147 146 /** 148 147 * eth_type_trans - determine the packet's protocol ID. ··· 210 207 * @skb: packet to extract header from 211 208 * @haddr: destination buffer 212 209 */ 213 - static int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr) 210 + int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr) 214 211 { 215 212 const struct ethhdr *eth = eth_hdr(skb); 216 213 memcpy(haddr, eth->h_source, ETH_ALEN); 217 214 return ETH_ALEN; 218 215 } 216 + EXPORT_SYMBOL(eth_header_parse); 219 217 220 218 /** 221 219 * eth_header_cache - fill cache entry from neighbour ··· 224 220 * @hh: destination cache entry 225 221 * Create an Ethernet header template from the neighbour. 226 222 */ 227 - int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh) 223 + int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh) 228 224 { 229 225 __be16 type = hh->hh_type; 230 226 struct ethhdr *eth; 231 - struct net_device *dev = neigh->dev; 227 + const struct net_device *dev = neigh->dev; 232 228 233 229 eth = (struct ethhdr *) 234 230 (((u8 *) hh->hh_data) + (HH_DATA_OFF(sizeof(*eth)))); ··· 242 238 hh->hh_len = ETH_HLEN; 243 239 return 0; 244 240 } 241 + EXPORT_SYMBOL(eth_header_cache); 245 242 246 243 /** 247 244 * eth_header_cache_update - update cache entry ··· 252 247 * 253 248 * Called by Address Resolution module to notify changes in address. 254 249 */ 255 - void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, 256 - unsigned char *haddr) 250 + void eth_header_cache_update(struct hh_cache *hh, 251 + const struct net_device *dev, 252 + const unsigned char *haddr) 257 253 { 258 254 memcpy(((u8 *) hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)), 259 255 haddr, ETH_ALEN); 260 256 } 257 + EXPORT_SYMBOL(eth_header_cache_update); 261 258 262 259 /** 263 260 * eth_mac_addr - set new Ethernet hardware address ··· 298 291 return 0; 299 292 } 300 293 294 + const struct header_ops eth_header_ops ____cacheline_aligned = { 295 + .create = eth_header, 296 + .parse = eth_header_parse, 297 + .rebuild = eth_rebuild_header, 298 + .cache = eth_header_cache, 299 + .cache_update = eth_header_cache_update, 300 + }; 301 + 301 302 /** 302 303 * ether_setup - setup Ethernet network device 303 304 * @dev: network device ··· 313 298 */ 314 299 void ether_setup(struct net_device *dev) 315 300 { 301 + dev->header_ops = &eth_header_ops; 302 + 316 303 dev->change_mtu = eth_change_mtu; 317 - dev->hard_header = eth_header; 318 - dev->rebuild_header = eth_rebuild_header; 319 304 dev->set_mac_address = eth_mac_addr; 320 - dev->hard_header_cache = eth_header_cache; 321 - dev->header_cache_update= eth_header_cache_update; 322 - dev->hard_header_parse = eth_header_parse; 323 305 324 306 dev->type = ARPHRD_ETHER; 325 307 dev->hard_header_len = ETH_HLEN;
+4 -2
net/ipv4/arp.c
··· 253 253 neigh->parms = neigh_parms_clone(parms); 254 254 rcu_read_unlock(); 255 255 256 - if (dev->hard_header == NULL) { 256 + if (!dev->header_ops) { 257 257 neigh->nud_state = NUD_NOARP; 258 258 neigh->ops = &arp_direct_ops; 259 259 neigh->output = neigh->ops->queue_xmit; ··· 310 310 neigh->nud_state = NUD_NOARP; 311 311 memcpy(neigh->ha, dev->broadcast, dev->addr_len); 312 312 } 313 - if (dev->hard_header_cache) 313 + 314 + if (dev->header_ops->cache) 314 315 neigh->ops = &arp_hh_ops; 315 316 else 316 317 neigh->ops = &arp_generic_ops; 318 + 317 319 if (neigh->nud_state&NUD_VALID) 318 320 neigh->output = neigh->ops->connected_output; 319 321 else
+9 -4
net/ipv4/ip_gre.c
··· 684 684 goto tx_error; 685 685 } 686 686 687 - if (dev->hard_header) { 687 + if (dev->header_ops) { 688 688 gre_hlen = 0; 689 689 tiph = (struct iphdr*)skb->data; 690 690 } else { ··· 1063 1063 1064 1064 */ 1065 1065 1066 - static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 1067 - void *daddr, void *saddr, unsigned len) 1066 + static int ipgre_header(struct sk_buff *skb, struct net_device *dev, 1067 + unsigned short type, 1068 + const void *daddr, const void *saddr, unsigned len) 1068 1069 { 1069 1070 struct ip_tunnel *t = netdev_priv(dev); 1070 1071 struct iphdr *iph = (struct iphdr *)skb_push(skb, t->hlen); ··· 1091 1090 1092 1091 return -t->hlen; 1093 1092 } 1093 + 1094 + static const struct header_ops ipgre_header_ops = { 1095 + .create = ipgre_header, 1096 + }; 1094 1097 1095 1098 static int ipgre_open(struct net_device *dev) 1096 1099 { ··· 1192 1187 if (!iph->saddr) 1193 1188 return -EINVAL; 1194 1189 dev->flags = IFF_BROADCAST; 1195 - dev->hard_header = ipgre_header; 1190 + dev->header_ops = &ipgre_header_ops; 1196 1191 dev->open = ipgre_open; 1197 1192 dev->stop = ipgre_close; 1198 1193 }
+1 -1
net/ipv4/ip_output.c
··· 169 169 IP_INC_STATS(IPSTATS_MIB_OUTBCASTPKTS); 170 170 171 171 /* Be paranoid, rather than too clever. */ 172 - if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) { 172 + if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { 173 173 struct sk_buff *skb2; 174 174 175 175 skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev));
+3 -3
net/ipv6/ndisc.c
··· 354 354 rcu_read_unlock(); 355 355 356 356 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; 357 - if (dev->hard_header == NULL) { 357 + if (!dev->header_ops) { 358 358 neigh->nud_state = NUD_NOARP; 359 359 neigh->ops = &ndisc_direct_ops; 360 360 neigh->output = neigh->ops->queue_xmit; ··· 371 371 neigh->nud_state = NUD_NOARP; 372 372 memcpy(neigh->ha, dev->broadcast, dev->addr_len); 373 373 } 374 - if (dev->hard_header_cache) 374 + if (dev->header_ops->cache) 375 375 neigh->ops = &ndisc_hh_ops; 376 376 else 377 377 neigh->ops = &ndisc_generic_ops; ··· 807 807 neigh_update(neigh, lladdr, NUD_STALE, 808 808 NEIGH_UPDATE_F_WEAK_OVERRIDE| 809 809 NEIGH_UPDATE_F_OVERRIDE); 810 - if (neigh || !dev->hard_header) { 810 + if (neigh || !dev->header_ops) { 811 811 ndisc_send_na(dev, neigh, saddr, &msg->target, 812 812 is_router, 813 813 1, (ifp != NULL && inc), inc);
+10 -2
net/mac80211/ieee80211.c
··· 228 228 dev->open = ieee80211_mgmt_open; 229 229 dev->stop = ieee80211_mgmt_stop; 230 230 dev->type = ARPHRD_IEEE80211_PRISM; 231 - dev->hard_header_parse = header_parse_80211; 232 231 dev->uninit = ieee80211_if_reinit; 233 232 dev->destructor = ieee80211_if_free; 234 233 } ··· 545 546 netif_tx_unlock(local->mdev); 546 547 } 547 548 549 + static const struct header_ops ieee80211_header_ops = { 550 + .create = eth_header, 551 + .parse = header_parse_80211, 552 + .rebuild = eth_rebuild_header, 553 + .cache = eth_header_cache, 554 + .cache_update = eth_header_cache_update, 555 + }; 556 + 548 557 /* Must not be called for mdev and apdev */ 549 558 void ieee80211_if_setup(struct net_device *dev) 550 559 { 551 560 ether_setup(dev); 561 + dev->header_ops = &ieee80211_header_ops; 552 562 dev->hard_start_xmit = ieee80211_subif_start_xmit; 553 563 dev->wireless_handlers = &ieee80211_iw_handler_def; 554 564 dev->set_multicast_list = ieee80211_set_multicast_list; ··· 1205 1197 mdev->open = ieee80211_master_open; 1206 1198 mdev->stop = ieee80211_master_stop; 1207 1199 mdev->type = ARPHRD_IEEE80211; 1208 - mdev->hard_header_parse = header_parse_80211; 1200 + mdev->header_ops = &ieee80211_header_ops; 1209 1201 1210 1202 sdata->type = IEEE80211_IF_TYPE_AP; 1211 1203 sdata->dev = mdev;
+10 -4
net/netrom/nr_dev.c
··· 95 95 96 96 #endif 97 97 98 - static int nr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 99 - void *daddr, void *saddr, unsigned len) 98 + static int nr_header(struct sk_buff *skb, struct net_device *dev, 99 + unsigned short type, 100 + const void *daddr, const void *saddr, unsigned len) 100 101 { 101 102 unsigned char *buff = skb_push(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN); 102 103 ··· 194 193 return &nr->stats; 195 194 } 196 195 196 + static const struct header_ops nr_header_ops = { 197 + .create = nr_header, 198 + .rebuild= nr_rebuild_header, 199 + }; 200 + 201 + 197 202 void nr_setup(struct net_device *dev) 198 203 { 199 204 dev->mtu = NR_MAX_PACKET_SIZE; ··· 207 200 dev->open = nr_open; 208 201 dev->stop = nr_close; 209 202 210 - dev->hard_header = nr_header; 203 + dev->header_ops = &nr_header_ops; 211 204 dev->hard_header_len = NR_NETWORK_LEN + NR_TRANSPORT_LEN; 212 205 dev->addr_len = AX25_ADDR_LEN; 213 206 dev->type = ARPHRD_NETROM; 214 - dev->rebuild_header = nr_rebuild_header; 215 207 dev->set_mac_address = nr_set_mac_address; 216 208 217 209 /* New-style flags. */
+3 -3
net/packet/af_packet.c
··· 389 389 skb_reset_network_header(skb); 390 390 391 391 /* Try to align data part correctly */ 392 - if (dev->hard_header) { 392 + if (dev->header_ops) { 393 393 skb->data -= dev->hard_header_len; 394 394 skb->tail -= dev->hard_header_len; 395 395 if (len < dev->hard_header_len) ··· 466 466 467 467 skb->dev = dev; 468 468 469 - if (dev->hard_header) { 469 + if (dev->header_ops) { 470 470 /* The device has an explicit notion of ll header, 471 471 exported to higher levels. 472 472 ··· 581 581 sk = pt->af_packet_priv; 582 582 po = pkt_sk(sk); 583 583 584 - if (dev->hard_header) { 584 + if (dev->header_ops) { 585 585 if (sk->sk_type != SOCK_DGRAM) 586 586 skb_push(skb, skb->data - skb_mac_header(skb)); 587 587 else if (skb->pkt_type == PACKET_OUTGOING) {
+9 -4
net/rose/rose_dev.c
··· 35 35 #include <net/ax25.h> 36 36 #include <net/rose.h> 37 37 38 - static int rose_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 39 - void *daddr, void *saddr, unsigned len) 38 + static int rose_header(struct sk_buff *skb, struct net_device *dev, 39 + unsigned short type, 40 + const void *daddr, const void *saddr, unsigned len) 40 41 { 41 42 unsigned char *buff = skb_push(skb, ROSE_MIN_LEN + 2); 42 43 ··· 149 148 return netdev_priv(dev); 150 149 } 151 150 151 + static const struct header_ops rose_header_ops = { 152 + .create = rose_header, 153 + .rebuild= rose_rebuild_header, 154 + }; 155 + 152 156 void rose_setup(struct net_device *dev) 153 157 { 154 158 dev->mtu = ROSE_MAX_PACKET_SIZE - 2; ··· 161 155 dev->open = rose_open; 162 156 dev->stop = rose_close; 163 157 164 - dev->hard_header = rose_header; 158 + dev->header_ops = &rose_header_ops; 165 159 dev->hard_header_len = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN; 166 160 dev->addr_len = ROSE_ADDR_LEN; 167 161 dev->type = ARPHRD_ROSE; 168 - dev->rebuild_header = rose_rebuild_header; 169 162 dev->set_mac_address = rose_set_mac_address; 170 163 171 164 /* New-style flags. */
+3 -3
net/sched/sch_teql.c
··· 249 249 return (skb_res == NULL) ? -EAGAIN : 1; 250 250 } 251 251 252 - static __inline__ int 253 - teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *dev) 252 + static inline int teql_resolve(struct sk_buff *skb, 253 + struct sk_buff *skb_res, struct net_device *dev) 254 254 { 255 - if (dev->hard_header == NULL || 255 + if (dev->header_ops == NULL || 256 256 skb->dst == NULL || 257 257 skb->dst->neighbour == NULL) 258 258 return 0;