[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>
This commit is contained in:

committed by
David S. Miller

parent
b95cce3576
commit
3b04ddde02
@@ -253,7 +253,7 @@ static int arp_constructor(struct neighbour *neigh)
|
||||
neigh->parms = neigh_parms_clone(parms);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (dev->hard_header == NULL) {
|
||||
if (!dev->header_ops) {
|
||||
neigh->nud_state = NUD_NOARP;
|
||||
neigh->ops = &arp_direct_ops;
|
||||
neigh->output = neigh->ops->queue_xmit;
|
||||
@@ -310,10 +310,12 @@ static int arp_constructor(struct neighbour *neigh)
|
||||
neigh->nud_state = NUD_NOARP;
|
||||
memcpy(neigh->ha, dev->broadcast, dev->addr_len);
|
||||
}
|
||||
if (dev->hard_header_cache)
|
||||
|
||||
if (dev->header_ops->cache)
|
||||
neigh->ops = &arp_hh_ops;
|
||||
else
|
||||
neigh->ops = &arp_generic_ops;
|
||||
|
||||
if (neigh->nud_state&NUD_VALID)
|
||||
neigh->output = neigh->ops->connected_output;
|
||||
else
|
||||
|
@@ -684,7 +684,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
goto tx_error;
|
||||
}
|
||||
|
||||
if (dev->hard_header) {
|
||||
if (dev->header_ops) {
|
||||
gre_hlen = 0;
|
||||
tiph = (struct iphdr*)skb->data;
|
||||
} else {
|
||||
@@ -1063,8 +1063,9 @@ static int ipgre_tunnel_change_mtu(struct net_device *dev, int new_mtu)
|
||||
|
||||
*/
|
||||
|
||||
static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
|
||||
void *daddr, void *saddr, unsigned len)
|
||||
static int ipgre_header(struct sk_buff *skb, struct net_device *dev,
|
||||
unsigned short type,
|
||||
const void *daddr, const void *saddr, unsigned len)
|
||||
{
|
||||
struct ip_tunnel *t = netdev_priv(dev);
|
||||
struct iphdr *iph = (struct iphdr *)skb_push(skb, t->hlen);
|
||||
@@ -1091,6 +1092,10 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned sh
|
||||
return -t->hlen;
|
||||
}
|
||||
|
||||
static const struct header_ops ipgre_header_ops = {
|
||||
.create = ipgre_header,
|
||||
};
|
||||
|
||||
static int ipgre_open(struct net_device *dev)
|
||||
{
|
||||
struct ip_tunnel *t = netdev_priv(dev);
|
||||
@@ -1187,7 +1192,7 @@ static int ipgre_tunnel_init(struct net_device *dev)
|
||||
if (!iph->saddr)
|
||||
return -EINVAL;
|
||||
dev->flags = IFF_BROADCAST;
|
||||
dev->hard_header = ipgre_header;
|
||||
dev->header_ops = &ipgre_header_ops;
|
||||
dev->open = ipgre_open;
|
||||
dev->stop = ipgre_close;
|
||||
}
|
||||
|
@@ -169,7 +169,7 @@ static inline int ip_finish_output2(struct sk_buff *skb)
|
||||
IP_INC_STATS(IPSTATS_MIB_OUTBCASTPKTS);
|
||||
|
||||
/* Be paranoid, rather than too clever. */
|
||||
if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) {
|
||||
if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) {
|
||||
struct sk_buff *skb2;
|
||||
|
||||
skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev));
|
||||
|
Reference in New Issue
Block a user