diff options
| author | Stephen Hemminger <shemminger@linux-foundation.org> | 2007-10-09 04:40:57 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:52:52 -0400 |
| commit | 3b04ddde02cf1b6f14f2697da5c20eca5715017f (patch) | |
| tree | 9da1341a5a399a507b5ea6bf5a3047506b8d8f8f | |
| parent | b95cce3576813ac3f86bafa6b5daaaaf7574b0fe (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>
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 | ||
| 161 | static int ether1394_header(struct sk_buff *skb, struct net_device *dev, | 161 | static 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); |
| 164 | static int ether1394_rebuild_header(struct sk_buff *skb); | 164 | static int ether1394_rebuild_header(struct sk_buff *skb); |
| 165 | static int ether1394_header_parse(const struct sk_buff *skb, | 165 | static int ether1394_header_parse(const struct sk_buff *skb, |
| 166 | unsigned char *haddr); | 166 | unsigned char *haddr); |
| 167 | static int ether1394_header_cache(struct neighbour *neigh, struct hh_cache *hh); | 167 | static int ether1394_header_cache(const struct neighbour *neigh, |
| 168 | struct hh_cache *hh); | ||
| 168 | static void ether1394_header_cache_update(struct hh_cache *hh, | 169 | static 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); |
| 171 | static int ether1394_tx(struct sk_buff *skb, struct net_device *dev); | 172 | static int ether1394_tx(struct sk_buff *skb, struct net_device *dev); |
| 172 | static void ether1394_iso(struct hpsb_iso *iso); | 173 | static 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 | ||
| 511 | static 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 | |||
| 510 | static void ether1394_init_dev(struct net_device *dev) | 519 | static 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 = ðer1394_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, ðtool_ops); | 530 | SET_ETHTOOL_OPS(dev, ðtool_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). */ |
| 713 | static int ether1394_header(struct sk_buff *skb, struct net_device *dev, | 718 | static 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 | ||
| 762 | static int ether1394_header_cache(struct neighbour *neigh, struct hh_cache *hh) | 767 | static 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. */ |
| 780 | static void ether1394_header_cache_update(struct hh_cache *hh, | 786 | static 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) | |||
| 780 | static int ipoib_hard_header(struct sk_buff *skb, | 780 | static 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 | ||
| 943 | static const struct header_ops ipoib_header_ops = { | ||
| 944 | .create = ipoib_hard_header, | ||
| 945 | }; | ||
| 946 | |||
| 943 | static void ipoib_setup(struct net_device *dev) | 947 | static 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 | ||
| 1876 | static int | ||
| 1877 | my_eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | ||
| 1878 | void *daddr, void *saddr, unsigned len) | ||
| 1879 | { | ||
| 1880 | struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); | ||
| 1881 | |||
| 1882 | /* | ||
| 1883 | * Set the protocol type. For a packet of type ETH_P_802_3 we | ||
| 1884 | * put the length here instead. It is up to the 802.2 layer to | ||
| 1885 | * carry protocol information. | ||
| 1886 | */ | ||
| 1887 | |||
| 1888 | if (type != ETH_P_802_3) | ||
| 1889 | eth->h_proto = htons(type); | ||
| 1890 | else | ||
| 1891 | eth->h_proto = htons(len); | ||
| 1892 | |||
| 1893 | /* | ||
| 1894 | * Set the source hardware address. | ||
| 1895 | */ | ||
| 1896 | if (saddr) | ||
| 1897 | memcpy(eth->h_source, saddr, dev->addr_len); | ||
| 1898 | else | ||
| 1899 | memcpy(eth->h_source, dev->dev_addr, dev->addr_len); | ||
| 1900 | |||
| 1901 | /* | ||
| 1902 | * Anyway, the loopback-device should never use this function... | ||
| 1903 | */ | ||
| 1904 | |||
| 1905 | if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) { | ||
| 1906 | memset(eth->h_dest, 0, dev->addr_len); | ||
| 1907 | return ETH_HLEN /*(dev->hard_header_len)*/; | ||
| 1908 | } | ||
| 1909 | if (daddr) { | ||
| 1910 | memcpy(eth->h_dest, daddr, dev->addr_len); | ||
| 1911 | return ETH_HLEN /*dev->hard_header_len*/; | ||
| 1912 | } | ||
| 1913 | return -ETH_HLEN /*dev->hard_header_len*/; | ||
| 1914 | } | ||
| 1915 | |||
| 1916 | /* | 1876 | /* |
| 1917 | * 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 | ||
| 1921 | static int | 1881 | static int isdn_net_header(struct sk_buff *skb, struct net_device *dev, |
| 1922 | isdn_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 | ||
| 1968 | static 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 | |||
| 1978 | static 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 | |||
| 1987 | static 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 | |||
| 2012 | isdn_net_init(struct net_device *ndev) | 1998 | isdn_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 | ||
| 1228 | static const struct header_ops dvb_header_ops = { | ||
| 1229 | .create = eth_header, | ||
| 1230 | .parse = eth_header_parse, | ||
| 1231 | .rebuild = eth_rebuild_header, | ||
| 1232 | }; | ||
| 1233 | |||
| 1228 | static void dvb_net_setup(struct net_device *dev) | 1234 | static 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); | |||
| 194 | static void cops_rx (struct net_device *dev); | 194 | static void cops_rx (struct net_device *dev); |
| 195 | static int cops_send_packet (struct sk_buff *skb, struct net_device *dev); | 195 | static int cops_send_packet (struct sk_buff *skb, struct net_device *dev); |
| 196 | static void set_multicast_list (struct net_device *dev); | 196 | static void set_multicast_list (struct net_device *dev); |
| 197 | static int cops_hard_header (struct sk_buff *skb, struct net_device *dev, | ||
| 198 | unsigned short type, void *daddr, void *saddr, | ||
| 199 | unsigned len); | ||
| 200 | |||
| 201 | static int cops_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); | 197 | static int cops_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); |
| 202 | static int cops_close (struct net_device *dev); | 198 | static int cops_close (struct net_device *dev); |
| 203 | static struct net_device_stats *cops_get_stats (struct net_device *dev); | 199 | static 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 | |||
| 951 | static 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 | ||
| 873 | static int ltpc_hard_header (struct sk_buff *skb, struct net_device *dev, | ||
| 874 | unsigned short type, void *daddr, void *saddr, unsigned len) | ||
| 875 | { | ||
| 876 | if(debug & DEBUG_VERBOSE) | ||
| 877 | printk("ltpc_hard_header called for device %s\n", | ||
| 878 | dev->name); | ||
| 879 | return 0; | ||
| 880 | } | ||
| 881 | |||
| 882 | static int ltpc_poll_counter; | 873 | static int ltpc_poll_counter; |
| 883 | 874 | ||
| 884 | static void ltpc_poll(unsigned long l) | 875 | static 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); | |||
| 102 | static int arcnet_send_packet(struct sk_buff *skb, struct net_device *dev); | 102 | static int arcnet_send_packet(struct sk_buff *skb, struct net_device *dev); |
| 103 | static void arcnet_timeout(struct net_device *dev); | 103 | static void arcnet_timeout(struct net_device *dev); |
| 104 | static int arcnet_header(struct sk_buff *skb, struct net_device *dev, | 104 | static 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); |
| 107 | static int arcnet_rebuild_header(struct sk_buff *skb); | 107 | static int arcnet_rebuild_header(struct sk_buff *skb); |
| 108 | static struct net_device_stats *arcnet_get_stats(struct net_device *dev); | 108 | static struct net_device_stats *arcnet_get_stats(struct net_device *dev); |
| 109 | static int go_tx(struct net_device *dev); | 109 | static 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 | ||
| 320 | static 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. */ |
| 322 | static void arcdev_setup(struct net_device *dev) | 327 | static 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 | ||
| 349 | struct net_device *alloc_arcdev(char *name) | 353 | struct net_device *alloc_arcdev(char *name) |
| @@ -488,10 +492,10 @@ static int arcnet_close(struct net_device *dev) | |||
| 488 | 492 | ||
| 489 | 493 | ||
| 490 | static int arcnet_header(struct sk_buff *skb, struct net_device *dev, | 494 | static 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 */ |
| 290 | static int sp_header(struct sk_buff *skb, struct net_device *dev, | 290 | static int sp_header(struct sk_buff *skb, struct net_device *dev, |
| 291 | unsigned short type, void *daddr, void *saddr, unsigned len) | 291 | unsigned short type, const void *daddr, |
| 292 | const void *saddr, unsigned len) | ||
| 292 | { | 293 | { |
| 293 | #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 | ||
| 327 | static const struct header_ops sp_header_ops = { | ||
| 328 | .create = sp_header, | ||
| 329 | .rebuild = sp_rebuild_header, | ||
| 330 | }; | ||
| 331 | |||
| 326 | static void sp_setup(struct net_device *dev) | 332 | static 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 */ |
| 581 | static int ax_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 581 | static 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 | ||
| 674 | static const struct header_ops ax_header_ops = { | ||
| 675 | .create = ax_header, | ||
| 676 | .rebuild = ax_rebuild_header, | ||
| 677 | }; | ||
| 678 | |||
| 673 | static void ax_setup(struct net_device *dev) | 679 | static 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 | */ |
| 227 | static void loopback_setup(struct net_device *dev) | 226 | static 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 = ð_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 | ||
| 166 | static int macvlan_hard_header(struct sk_buff *skb, struct net_device *dev, | 166 | static 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 | ||
| 177 | static const struct header_ops macvlan_hard_header_ops = { | ||
| 178 | .create = macvlan_hard_header, | ||
| 179 | .rebuild = eth_rebuild_header, | ||
| 180 | .parse = eth_header_parse, | ||
| 181 | .rebuild = eth_rebuild_header, | ||
| 182 | .cache = eth_header_cache, | ||
| 183 | .cache_update = eth_header_cache_update, | ||
| 184 | }; | ||
| 185 | |||
| 177 | static int macvlan_open(struct net_device *dev) | 186 | static 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 | */ |
| 679 | static int myri_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 679 | static 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 | ||
| 762 | int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh) | 763 | static 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. */ |
| 789 | void myri_header_cache_update(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr) | 790 | void 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 | ||
| 887 | static 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 | |||
| 884 | static int __devinit myri_ether_init(struct sbus_dev *sdev) | 894 | static 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 */ |
| 149 | static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev); | 149 | static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev); |
| 150 | static int plip_hard_header(struct sk_buff *skb, struct net_device *dev, | 150 | static 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); |
| 153 | static int plip_hard_header_cache(struct neighbour *neigh, | 153 | static int plip_hard_header_cache(const struct neighbour *neigh, |
| 154 | struct hh_cache *hh); | 154 | struct hh_cache *hh); |
| 155 | static int plip_open(struct net_device *dev); | 155 | static int plip_open(struct net_device *dev); |
| 156 | static int plip_close(struct net_device *dev); | 156 | static 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 | ||
| 263 | static 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 | ||
| 995 | static void | 990 | static void |
| 996 | plip_rewrite_address(struct net_device *dev, struct ethhdr *eth) | 991 | plip_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 | ||
| 1011 | static int | 1006 | static int |
| 1012 | plip_hard_header(struct sk_buff *skb, struct net_device *dev, | 1007 | plip_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 | ||
| 1025 | int plip_hard_header_cache(struct neighbour *neigh, | 1020 | int 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 | ||
| 333 | static int shaper_header(struct sk_buff *skb, struct net_device *dev, | 333 | static int shaper_header(struct sk_buff *skb, struct net_device *dev, |
| 334 | unsigned short type, void *daddr, void *saddr, unsigned len) | 334 | unsigned short type, |
| 335 | const void *daddr, const void *saddr, unsigned len) | ||
| 335 | { | 336 | { |
| 336 | 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 | ||
| 419 | static const struct header_ops shaper_ops = { | ||
| 420 | .create = shaper_header, | ||
| 421 | .rebuild = shaper_rebuild_header, | ||
| 422 | }; | ||
| 423 | |||
| 418 | static int shaper_attach(struct net_device *shdev, struct shaper *sh, struct net_device *dev) | 424 | static 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 */ |
| 134 | static int cycx_netdevice_init(struct net_device *dev), | 134 | static int cycx_netdevice_init(struct net_device *dev); |
| 135 | cycx_netdevice_open(struct net_device *dev), | 135 | static int cycx_netdevice_open(struct net_device *dev); |
| 136 | cycx_netdevice_stop(struct net_device *dev), | 136 | static int cycx_netdevice_stop(struct net_device *dev); |
| 137 | cycx_netdevice_hard_header(struct sk_buff *skb, | 137 | static 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, | 141 | static int cycx_netdevice_rebuild_header(struct sk_buff *skb); |
| 142 | static int cycx_netdevice_hard_start_xmit(struct sk_buff *skb, | ||
| 142 | struct net_device *dev); | 143 | struct net_device *dev); |
| 143 | 144 | ||
| 144 | static struct net_device_stats * | 145 | static 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 | |||
| 475 | static 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. */ |
| 555 | static int cycx_netdevice_hard_header(struct sk_buff *skb, | 563 | static 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 | ||
| 68 | static int dlci_header(struct sk_buff *skb, struct net_device *dev, | 68 | static 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 | ||
| 488 | static const struct header_ops dlci_header_ops = { | ||
| 489 | .create = dlci_header, | ||
| 490 | }; | ||
| 491 | |||
| 488 | static void dlci_setup(struct net_device *dev) | 492 | static 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 | ||
| 235 | static const struct header_ops hdlc_null_ops; | ||
| 236 | |||
| 235 | static void hdlc_setup_dev(struct net_device *dev) | 237 | static 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 | ||
| 255 | static void hdlc_setup(struct net_device *dev) | 253 | static 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 | ||
| 76 | static int cisco_hard_header(struct sk_buff *skb, struct net_device *dev, | 76 | static int cisco_hard_header(struct sk_buff *skb, struct net_device *dev, |
| 77 | u16 type, void *daddr, void *saddr, | 77 | u16 type, const void *daddr, const void *saddr, |
| 78 | 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 | |||
| 313 | static struct hdlc_proto proto = { | 312 | static 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 | ||
| 320 | static const struct header_ops cisco_header_ops = { | ||
| 321 | .create = cisco_hard_header, | ||
| 322 | }; | ||
| 321 | 323 | ||
| 322 | static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr) | 324 | static 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 | ||
| 362 | static int sppp_hard_header(struct sk_buff *skb, struct net_device *dev, __u16 type, | 362 | static 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 | ||
| 395 | static int sppp_rebuild_header(struct sk_buff *skb) | 397 | static 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 | ||
| 2699 | static const struct header_ops airo_header_ops = { | ||
| 2700 | .parse = wll_header_parse, | ||
| 2701 | }; | ||
| 2702 | |||
| 2699 | static void wifi_setup(struct net_device *dev) | 2703 | static void wifi_setup(struct net_device *dev) |
| 2700 | { | 2704 | { |
| 2701 | dev->hard_header_parse = wll_header_parse; | 2705 | dev->header_ops = &airo_header_ops; |
| 2702 | 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); |
| 31 | void hostap_dump_tx_header(const char *name, | 31 | void hostap_dump_tx_header(const char *name, |
| 32 | const struct hfa384x_tx_frame *tx); | 32 | const struct hfa384x_tx_frame *tx); |
| 33 | int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr); | 33 | extern const struct header_ops hostap_80211_ops; |
| 34 | int hostap_80211_prism_header_parse(struct sk_buff *skb, unsigned char *haddr); | ||
| 35 | int hostap_80211_get_hdrlen(u16 fc); | 34 | int hostap_80211_get_hdrlen(u16 fc); |
| 36 | struct net_device_stats *hostap_get_stats(struct net_device *dev); | 35 | struct net_device_stats *hostap_get_stats(struct net_device *dev); |
| 37 | void hostap_setup_dev(struct net_device *dev, local_info_t *local, | 36 | void 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 | ||
| 597 | int hostap_80211_header_parse(struct sk_buff *skb, unsigned char *haddr) | 597 | int hostap_80211_header_parse(const struct sk_buff *skb, unsigned char *haddr) |
| 598 | { | 598 | { |
| 599 | memcpy(haddr, skb_mac_header(skb) + 10, ETH_ALEN); /* addr2 */ | 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 | ||
| 604 | int 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 | ||
| 849 | const 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 | }; | ||
| 857 | EXPORT_SYMBOL(hostap_80211_ops); | ||
| 846 | 858 | ||
| 847 | void hostap_setup_dev(struct net_device *dev, local_info_t *local, | 859 | void 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 | |||
| 887 | static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked) | 898 | static 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 | ||
| 1633 | static int strip_header(struct sk_buff *skb, struct net_device *dev, | 1633 | static 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 | ||
| 2500 | static 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 *); | |||
| 160 | static void | 160 | static void |
| 161 | qeth_setadp_promisc_mode(struct qeth_card *); | 161 | qeth_setadp_promisc_mode(struct qeth_card *); |
| 162 | 162 | ||
| 163 | static int | ||
| 164 | qeth_hard_header_parse(const struct sk_buff *skb, unsigned char *haddr); | ||
| 165 | |||
| 163 | static void | 166 | static void |
| 164 | qeth_notify_processes(void) | 167 | qeth_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 */ |
| 3788 | static int | 3791 | static int |
| 3789 | qeth_fake_header(struct sk_buff *skb, struct net_device *dev, | 3792 | qeth_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 | ||
| 3817 | static const struct header_ops qeth_fake_ops = { | ||
| 3818 | .create = qeth_fake_header, | ||
| 3819 | .parse = qeth_hard_header_parse, | ||
| 3820 | }; | ||
| 3821 | |||
| 3814 | static int | 3822 | static int |
| 3815 | qeth_send_packet(struct qeth_card *, struct sk_buff *); | 3823 | qeth_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 | ||
| 6610 | static const struct header_ops qeth_null_ops = { | ||
| 6611 | .parse = qeth_hard_header_parse, | ||
| 6612 | }; | ||
| 6613 | |||
| 6599 | static int | 6614 | static int |
| 6600 | qeth_netdev_init(struct net_device *dev) | 6615 | qeth_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__ |
| 32 | extern int eth_header(struct sk_buff *skb, struct net_device *dev, | ||
| 33 | unsigned short type, void *daddr, | ||
| 34 | void *saddr, unsigned len); | ||
| 35 | extern int eth_rebuild_header(struct sk_buff *skb); | ||
| 36 | extern __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); | 32 | extern __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); |
| 37 | extern void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, | 33 | extern const struct header_ops eth_header_ops; |
| 38 | unsigned char * haddr); | 34 | |
| 39 | extern int eth_header_cache(struct neighbour *neigh, | 35 | extern 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); | ||
| 38 | extern int eth_rebuild_header(struct sk_buff *skb); | ||
| 39 | extern int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); | ||
| 40 | extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh); | ||
| 41 | extern void eth_header_cache_update(struct hh_cache *hh, | ||
| 42 | const struct net_device *dev, | ||
| 43 | const unsigned char *haddr); | ||
| 44 | |||
| 41 | 45 | ||
| 42 | extern struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count); | 46 | extern 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 | ||
| 120 | int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr); | ||
| 121 | |||
| 120 | #ifdef CONFIG_SYSCTL | 122 | #ifdef CONFIG_SYSCTL |
| 121 | extern struct ctl_table ether_table[]; | 123 | extern 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 | ||
| 253 | struct header_ops { | ||
| 254 | int (*create) (struct sk_buff *skb, struct net_device *dev, | ||
| 255 | unsigned short type, const void *daddr, | ||
| 256 | const void *saddr, unsigned len); | ||
| 257 | int (*parse)(const struct sk_buff *skb, unsigned char *haddr); | ||
| 258 | int (*rebuild)(struct sk_buff *skb); | ||
| 259 | #define HAVE_HEADER_CACHE | ||
| 260 | int (*cache)(const struct neighbour *neigh, struct hh_cache *hh); | ||
| 261 | void (*cache_update)(struct hh_cache *hh, | ||
| 262 | const struct net_device *dev, | ||
| 263 | const unsigned char *haddr); | ||
| 264 | }; | ||
| 265 | |||
| 253 | /* 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 | ||
| 803 | static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, | 804 | static 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 | ||
| 812 | static inline int dev_parse_header(const struct sk_buff *skb, | 815 | static 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 | ||
| 822 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); | 825 | typedef 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 *); | |||
| 363 | extern int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); | 363 | extern 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 */ |
| 366 | extern int ax25_hard_header(struct sk_buff *, struct net_device *, unsigned short, void *, void *, unsigned int); | 366 | extern int ax25_hard_header(struct sk_buff *, struct net_device *, |
| 367 | unsigned short, const void *, | ||
| 368 | const void *, unsigned int); | ||
| 367 | extern int ax25_rebuild_header(struct sk_buff *); | 369 | extern int ax25_rebuild_header(struct sk_buff *); |
| 370 | extern const struct header_ops ax25_header_ops; | ||
| 368 | 371 | ||
| 369 | /* ax25_out.c */ | 372 | /* ax25_out.c */ |
| 370 | extern ax25_cb *ax25_send_frame(struct sk_buff *, int, ax25_address *, ax25_address *, ax25_digi *, struct net_device *); | 373 | extern 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 | */ |
| 100 | static inline unsigned psched_mtu(struct net_device *dev) | 100 | static inline unsigned psched_mtu(const struct net_device *dev) |
| 101 | { | 101 | { |
| 102 | unsigned mtu = dev->mtu; | 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 | ||
| 36 | static int fc_header(struct sk_buff *skb, struct net_device *dev, | 36 | static 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 | ||
| 98 | static const struct header_ops fc_header_ops = { | ||
| 99 | .create = fc_header, | ||
| 100 | .rebuild = fc_rebuild_header, | ||
| 101 | }; | ||
| 102 | |||
| 98 | static void fc_setup(struct net_device *dev) | 103 | static 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 | ||
| 53 | static int fddi_header(struct sk_buff *skb, struct net_device *dev, | 53 | static 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 | ||
| 178 | static const struct header_ops fddi_header_ops = { | ||
| 179 | .create = fddi_header, | ||
| 180 | .rebuild = fddi_rebuild_header, | ||
| 181 | }; | ||
| 182 | |||
| 178 | static void fddi_setup(struct net_device *dev) | 183 | static 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 | ||
| 47 | static int hippi_header(struct sk_buff *skb, struct net_device *dev, | 47 | static 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 | ||
| 185 | static const struct header_ops hippi_header_ops = { | ||
| 186 | .create = hippi_header, | ||
| 187 | .rebuild = hippi_rebuild_header, | ||
| 188 | }; | ||
| 189 | |||
| 190 | |||
| 185 | static void hippi_setup(struct net_device *dev) | 191 | static 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 | ||
| 101 | static int tr_header(struct sk_buff *skb, struct net_device *dev, | 101 | static 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 | ||
| 250 | void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev) | 250 | void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh, |
| 251 | struct net_device *dev) | ||
| 251 | { | 252 | { |
| 252 | 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 | ||
| 596 | static const struct header_ops tr_header_ops = { | ||
| 597 | .create = tr_header, | ||
| 598 | .rebuild= tr_rebuild_header, | ||
| 599 | }; | ||
| 600 | |||
| 595 | static void tr_setup(struct net_device *dev) | 601 | static 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 | */ |
| 315 | static struct lock_class_key vlan_netdev_xmit_lock_key; | 315 | static struct lock_class_key vlan_netdev_xmit_lock_key; |
| 316 | 316 | ||
| 317 | static const struct header_ops vlan_header_ops = { | ||
| 318 | .create = vlan_dev_hard_header, | ||
| 319 | .rebuild = vlan_dev_rebuild_header, | ||
| 320 | .parse = eth_header_parse, | ||
| 321 | }; | ||
| 322 | |||
| 317 | static int vlan_dev_init(struct net_device *dev) | 323 | static 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); | |||
| 53 | int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | 53 | int 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); |
| 55 | int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, | 55 | int 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); |
| 58 | int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); | 58 | int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); |
| 59 | int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); | 59 | int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev); |
| 60 | int vlan_dev_change_mtu(struct net_device *dev, int new_mtu); | 60 | int 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 | */ |
| 345 | int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, | 345 | int 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 | ||
| 49 | int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len) | 49 | int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, |
| 50 | unsigned short type, const void *daddr, | ||
| 51 | const void *saddr, unsigned len) | ||
| 50 | { | 52 | { |
| 51 | unsigned char *buff; | 53 | unsigned char *buff; |
| 52 | 54 | ||
| @@ -215,7 +217,9 @@ put: | |||
| 215 | 217 | ||
| 216 | #else /* INET */ | 218 | #else /* INET */ |
| 217 | 219 | ||
| 218 | int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len) | 220 | int 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 | ||
| 234 | const struct header_ops ax25_header_ops = { | ||
| 235 | .create = ax25_hard_header, | ||
| 236 | .rebuild = ax25_rebuild_header, | ||
| 237 | }; | ||
| 238 | |||
| 230 | EXPORT_SYMBOL(ax25_hard_header); | 239 | EXPORT_SYMBOL(ax25_hard_header); |
| 231 | EXPORT_SYMBOL(ax25_rebuild_header); | 240 | EXPORT_SYMBOL(ax25_rebuild_header); |
| 241 | EXPORT_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 | ||
| 970 | static int default_rebuild_header(struct sk_buff *skb) | ||
| 971 | { | ||
| 972 | printk(KERN_DEBUG "%s: default_rebuild_header called -- BUG!\n", | ||
| 973 | skb->dev ? skb->dev->name : "NULL!!!"); | ||
| 974 | kfree_skb(skb); | ||
| 975 | return 1; | ||
| 976 | } | ||
| 977 | |||
| 978 | /** | 970 | /** |
| 979 | * 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: | |||
| 897 | static void neigh_update_hhs(struct neighbour *neigh) | 897 | static 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 | */ |
| 78 | int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 78 | int 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 | } |
| 113 | EXPORT_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 | } |
| 146 | EXPORT_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 | */ |
| 210 | static int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr) | 213 | int 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 | } |
| 219 | EXPORT_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 | */ |
| 223 | int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh) | 227 | int 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 | } |
| 245 | EXPORT_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 | */ |
| 250 | void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, | 255 | void 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 | } |
| 262 | EXPORT_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 | ||
| 301 | const 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 | */ |
| 299 | void ether_setup(struct net_device *dev) | 314 | void ether_setup(struct net_device *dev) |
| 300 | { | 315 | { |
| 316 | dev->header_ops = ð_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 | ||
| 1066 | static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 1066 | static 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 | ||
| 1095 | static const struct header_ops ipgre_header_ops = { | ||
| 1096 | .create = ipgre_header, | ||
| 1097 | }; | ||
| 1098 | |||
| 1094 | static int ipgre_open(struct net_device *dev) | 1099 | static 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 | ||
| 548 | static 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 */ |
| 550 | void ieee80211_if_setup(struct net_device *dev) | 557 | void 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 | ||
| 98 | static int nr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 98 | static 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 | ||
| 197 | static const struct header_ops nr_header_ops = { | ||
| 198 | .create = nr_header, | ||
| 199 | .rebuild= nr_rebuild_header, | ||
| 200 | }; | ||
| 201 | |||
| 202 | |||
| 196 | void nr_setup(struct net_device *dev) | 203 | void 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 | ||
| 38 | static int rose_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, | 38 | static 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 | ||
| 152 | static const struct header_ops rose_header_ops = { | ||
| 153 | .create = rose_header, | ||
| 154 | .rebuild= rose_rebuild_header, | ||
| 155 | }; | ||
| 156 | |||
| 151 | void rose_setup(struct net_device *dev) | 157 | void 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 | ||
| 252 | static __inline__ int | 252 | static inline int teql_resolve(struct sk_buff *skb, |
| 253 | teql_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; |
