aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/neighbour.c
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@linux-foundation.org>2007-10-09 04:40:57 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:52:52 -0400
commit3b04ddde02cf1b6f14f2697da5c20eca5715017f (patch)
tree9da1341a5a399a507b5ea6bf5a3047506b8d8f8f /net/core/neighbour.c
parentb95cce3576813ac3f86bafa6b5daaaaf7574b0fe (diff)
[NET]: Move hardware header operations out of netdevice.
Since hardware header operations are part of the protocol class not the device instance, make them into a separate object and save memory. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/neighbour.c')
-rw-r--r--net/core/neighbour.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 10bcb9f8da5..c52df858d0b 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -897,8 +897,8 @@ out_unlock_bh:
897static void neigh_update_hhs(struct neighbour *neigh) 897static void neigh_update_hhs(struct neighbour *neigh)
898{ 898{
899 struct hh_cache *hh; 899 struct hh_cache *hh;
900 void (*update)(struct hh_cache*, struct net_device*, unsigned char *) = 900 void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *)
901 neigh->dev->header_cache_update; 901 = neigh->dev->header_ops->cache_update;
902 902
903 if (update) { 903 if (update) {
904 for (hh = neigh->hh; hh; hh = hh->hh_next) { 904 for (hh = neigh->hh; hh; hh = hh->hh_next) {
@@ -1095,7 +1095,8 @@ static void neigh_hh_init(struct neighbour *n, struct dst_entry *dst,
1095 hh->hh_type = protocol; 1095 hh->hh_type = protocol;
1096 atomic_set(&hh->hh_refcnt, 0); 1096 atomic_set(&hh->hh_refcnt, 0);
1097 hh->hh_next = NULL; 1097 hh->hh_next = NULL;
1098 if (dev->hard_header_cache(n, hh)) { 1098
1099 if (dev->header_ops->cache(n, hh)) {
1099 kfree(hh); 1100 kfree(hh);
1100 hh = NULL; 1101 hh = NULL;
1101 } else { 1102 } else {
@@ -1127,7 +1128,7 @@ int neigh_compat_output(struct sk_buff *skb)
1127 1128
1128 if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, 1129 if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
1129 skb->len) < 0 && 1130 skb->len) < 0 &&
1130 dev->rebuild_header(skb)) 1131 dev->header_ops->rebuild(skb))
1131 return 0; 1132 return 0;
1132 1133
1133 return dev_queue_xmit(skb); 1134 return dev_queue_xmit(skb);
@@ -1149,7 +1150,7 @@ int neigh_resolve_output(struct sk_buff *skb)
1149 if (!neigh_event_send(neigh, skb)) { 1150 if (!neigh_event_send(neigh, skb)) {
1150 int err; 1151 int err;
1151 struct net_device *dev = neigh->dev; 1152 struct net_device *dev = neigh->dev;
1152 if (dev->hard_header_cache && !dst->hh) { 1153 if (dev->header_ops->cache && !dst->hh) {
1153 write_lock_bh(&neigh->lock); 1154 write_lock_bh(&neigh->lock);
1154 if (!dst->hh) 1155 if (!dst->hh)
1155 neigh_hh_init(neigh, dst, dst->ops->protocol); 1156 neigh_hh_init(neigh, dst, dst->ops->protocol);