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