aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@linux-foundation.org>2007-10-09 04:36:32 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:52:50 -0400
commit0c4e85813d0a94eeb8bf813397a4907bdd7bb610 (patch)
tree53ee948abc930bb1c5cd270c490f87fda5eb45b3 /net/core
parent4c94f8c0c9a82fad84bc5df453aff755cfed70b7 (diff)
[NET]: Wrap netdevice hardware header creation.
Add inline for common usage of hardware header creation, and fix bug in IPV6 mcast where the assumption about negative return is an errno. Negative return from hard_header means not enough space was available,(ie -N bytes). Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/neighbour.c17
-rw-r--r--net/core/netpoll.c8
2 files changed, 11 insertions, 14 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 2c6577c1eedd..10bcb9f8da5c 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1125,9 +1125,8 @@ int neigh_compat_output(struct sk_buff *skb)
1125 1125
1126 __skb_pull(skb, skb_network_offset(skb)); 1126 __skb_pull(skb, skb_network_offset(skb));
1127 1127
1128 if (dev->hard_header && 1128 if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
1129 dev->hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, 1129 skb->len) < 0 &&
1130 skb->len) < 0 &&
1131 dev->rebuild_header(skb)) 1130 dev->rebuild_header(skb))
1132 return 0; 1131 return 0;
1133 1132
@@ -1154,13 +1153,13 @@ int neigh_resolve_output(struct sk_buff *skb)
1154 write_lock_bh(&neigh->lock); 1153 write_lock_bh(&neigh->lock);
1155 if (!dst->hh) 1154 if (!dst->hh)
1156 neigh_hh_init(neigh, dst, dst->ops->protocol); 1155 neigh_hh_init(neigh, dst, dst->ops->protocol);
1157 err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1156 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1158 neigh->ha, NULL, skb->len); 1157 neigh->ha, NULL, skb->len);
1159 write_unlock_bh(&neigh->lock); 1158 write_unlock_bh(&neigh->lock);
1160 } else { 1159 } else {
1161 read_lock_bh(&neigh->lock); 1160 read_lock_bh(&neigh->lock);
1162 err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1161 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1163 neigh->ha, NULL, skb->len); 1162 neigh->ha, NULL, skb->len);
1164 read_unlock_bh(&neigh->lock); 1163 read_unlock_bh(&neigh->lock);
1165 } 1164 }
1166 if (err >= 0) 1165 if (err >= 0)
@@ -1191,8 +1190,8 @@ int neigh_connected_output(struct sk_buff *skb)
1191 __skb_pull(skb, skb_network_offset(skb)); 1190 __skb_pull(skb, skb_network_offset(skb));
1192 1191
1193 read_lock_bh(&neigh->lock); 1192 read_lock_bh(&neigh->lock);
1194 err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1193 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
1195 neigh->ha, NULL, skb->len); 1194 neigh->ha, NULL, skb->len);
1196 read_unlock_bh(&neigh->lock); 1195 read_unlock_bh(&neigh->lock);
1197 if (err >= 0) 1196 if (err >= 0)
1198 err = neigh->ops->queue_xmit(skb); 1197 err = neigh->ops->queue_xmit(skb);
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index e13602d8154d..95daba624967 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -415,11 +415,9 @@ static void arp_reply(struct sk_buff *skb)
415 send_skb->protocol = htons(ETH_P_ARP); 415 send_skb->protocol = htons(ETH_P_ARP);
416 416
417 /* Fill the device header for the ARP frame */ 417 /* Fill the device header for the ARP frame */
418 418 if (dev_hard_header(send_skb, skb->dev, ptype,
419 if (np->dev->hard_header && 419 sha, np->local_mac,
420 np->dev->hard_header(send_skb, skb->dev, ptype, 420 send_skb->len) < 0) {
421 sha, np->local_mac,
422 send_skb->len) < 0) {
423 kfree_skb(send_skb); 421 kfree_skb(send_skb);
424 return; 422 return;
425 } 423 }