Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Stephen Hemminger and committed by
David S. Miller
0c4e8581 4c94f8c0

+63 -70
+1 -1
drivers/net/hamradio/bpqether.c
··· 286 286 287 287 skb->protocol = ax25_type_trans(skb, dev); 288 288 skb_reset_network_header(skb); 289 - dev->hard_header(skb, dev, ETH_P_BPQ, bpq->dest_addr, NULL, 0); 289 + dev_hard_header(skb, dev, ETH_P_BPQ, bpq->dest_addr, NULL, 0); 290 290 bpq->stats.tx_packets++; 291 291 bpq->stats.tx_bytes+=skb->len; 292 292
+2 -2
drivers/net/macvlan.c
··· 170 170 const struct macvlan_dev *vlan = netdev_priv(dev); 171 171 struct net_device *lowerdev = vlan->lowerdev; 172 172 173 - return lowerdev->hard_header(skb, lowerdev, type, daddr, 174 - saddr ? : dev->dev_addr, len); 173 + return dev_hard_header(skb, lowerdev, type, daddr, 174 + saddr ? : dev->dev_addr, len); 175 175 } 176 176 177 177 static int macvlan_open(struct net_device *dev)
+4 -4
drivers/net/pppoe.c
··· 834 834 } 835 835 836 836 error = total_len; 837 - dev->hard_header(skb, dev, ETH_P_PPP_SES, 838 - po->pppoe_pa.remote, NULL, total_len); 837 + dev_hard_header(skb, dev, ETH_P_PPP_SES, 838 + po->pppoe_pa.remote, NULL, total_len); 839 839 840 840 memcpy(ph, &hdr, sizeof(struct pppoe_hdr)); 841 841 ··· 886 886 skb->protocol = __constant_htons(ETH_P_PPP_SES); 887 887 skb->dev = dev; 888 888 889 - dev->hard_header(skb, dev, ETH_P_PPP_SES, 890 - po->pppoe_pa.remote, NULL, data_len); 889 + dev_hard_header(skb, dev, ETH_P_PPP_SES, 890 + po->pppoe_pa.remote, NULL, data_len); 891 891 892 892 dev_queue_xmit(skb); 893 893
+1 -1
drivers/net/wan/lapbether.c
··· 216 216 217 217 skb->dev = dev = lapbeth->ethdev; 218 218 219 - dev->hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0); 219 + dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0); 220 220 221 221 dev_queue_xmit(skb); 222 222 }
+9
include/linux/netdevice.h
··· 800 800 extern int netpoll_trap(void); 801 801 #endif 802 802 803 + static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, 804 + unsigned short type, 805 + void *daddr, void *saddr, unsigned len) 806 + { 807 + if (!dev->hard_header) 808 + return 0; 809 + return dev->hard_header(skb, dev, type, daddr, saddr, len); 810 + } 811 + 803 812 typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); 804 813 extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf); 805 814 static inline int unregister_gifconf(unsigned int family)
+1 -2
include/net/dn_route.h
··· 100 100 if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_LOOPBACK)) 101 101 dst = NULL; 102 102 103 - if (!dev->hard_header || (dev->hard_header(skb, dev, ETH_P_DNA_RT, 104 - dst, src, skb->len) >= 0)) 103 + if (dev_hard_header(skb, dev, ETH_P_DNA_RT, dst, src, skb->len) >= 0) 105 104 dn_rt_send(skb); 106 105 else 107 106 kfree_skb(skb);
+1 -1
net/802/p8023.c
··· 31 31 { 32 32 struct net_device *dev = skb->dev; 33 33 34 - dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len); 34 + dev_hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len); 35 35 return dev_queue_xmit(skb); 36 36 } 37 37
+6 -8
net/8021q/vlan_dev.c
··· 434 434 435 435 if (build_vlan_header) { 436 436 /* Now make the underlying real hard header */ 437 - rc = dev->hard_header(skb, dev, ETH_P_8021Q, daddr, saddr, len + VLAN_HLEN); 438 - 439 - if (rc > 0) { 437 + rc = dev_hard_header(skb, dev, ETH_P_8021Q, daddr, saddr, 438 + len + VLAN_HLEN); 439 + if (rc > 0) 440 440 rc += VLAN_HLEN; 441 - } else if (rc < 0) { 441 + else if (rc < 0) 442 442 rc -= VLAN_HLEN; 443 - } 444 - } else { 443 + } else 445 444 /* If here, then we'll just make a normal looking ethernet frame, 446 445 * but, the hard_start_xmit method will insert the tag (it has to 447 446 * be able to do this for bridged and other skbs that don't come 448 447 * down the protocol stack in an orderly manner. 449 448 */ 450 - rc = dev->hard_header(skb, dev, type, daddr, saddr, len); 451 - } 449 + rc = dev_hard_header(skb, dev, type, daddr, saddr, len); 452 450 453 451 return rc; 454 452 }
+8 -9
net/core/neighbour.c
··· 1125 1125 1126 1126 __skb_pull(skb, skb_network_offset(skb)); 1127 1127 1128 - if (dev->hard_header && 1129 - dev->hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, 1130 - skb->len) < 0 && 1128 + if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, 1129 + skb->len) < 0 && 1131 1130 dev->rebuild_header(skb)) 1132 1131 return 0; 1133 1132 ··· 1153 1154 write_lock_bh(&neigh->lock); 1154 1155 if (!dst->hh) 1155 1156 neigh_hh_init(neigh, dst, dst->ops->protocol); 1156 - err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1157 - neigh->ha, NULL, skb->len); 1157 + err = dev_hard_header(skb, dev, ntohs(skb->protocol), 1158 + neigh->ha, NULL, skb->len); 1158 1159 write_unlock_bh(&neigh->lock); 1159 1160 } else { 1160 1161 read_lock_bh(&neigh->lock); 1161 - err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1162 - neigh->ha, NULL, skb->len); 1162 + err = dev_hard_header(skb, dev, ntohs(skb->protocol), 1163 + neigh->ha, NULL, skb->len); 1163 1164 read_unlock_bh(&neigh->lock); 1164 1165 } 1165 1166 if (err >= 0) ··· 1190 1191 __skb_pull(skb, skb_network_offset(skb)); 1191 1192 1192 1193 read_lock_bh(&neigh->lock); 1193 - err = dev->hard_header(skb, dev, ntohs(skb->protocol), 1194 - neigh->ha, NULL, skb->len); 1194 + err = dev_hard_header(skb, dev, ntohs(skb->protocol), 1195 + neigh->ha, NULL, skb->len); 1195 1196 read_unlock_bh(&neigh->lock); 1196 1197 if (err >= 0) 1197 1198 err = neigh->ops->queue_xmit(skb);
+3 -5
net/core/netpoll.c
··· 415 415 send_skb->protocol = htons(ETH_P_ARP); 416 416 417 417 /* Fill the device header for the ARP frame */ 418 - 419 - if (np->dev->hard_header && 420 - np->dev->hard_header(send_skb, skb->dev, ptype, 421 - sha, np->local_mac, 422 - send_skb->len) < 0) { 418 + if (dev_hard_header(send_skb, skb->dev, ptype, 419 + sha, np->local_mac, 420 + send_skb->len) < 0) { 423 421 kfree_skb(send_skb); 424 422 return; 425 423 }
+2 -1
net/decnet/dn_neigh.c
··· 211 211 char mac_addr[ETH_ALEN]; 212 212 213 213 dn_dn2eth(mac_addr, rt->rt_local_src); 214 - if (!dev->hard_header || dev->hard_header(skb, dev, ntohs(skb->protocol), neigh->ha, mac_addr, skb->len) >= 0) 214 + if (dev_hard_header(skb, dev, ntohs(skb->protocol), neigh->ha, 215 + mac_addr, skb->len) >= 0) 215 216 return neigh->ops->queue_xmit(skb); 216 217 217 218 if (net_ratelimit())
+7 -7
net/econet/af_econet.c
··· 336 336 /* Real hardware Econet. We're not worthy etc. */ 337 337 #ifdef CONFIG_ECONET_NATIVE 338 338 unsigned short proto = 0; 339 + int res; 339 340 340 341 dev_hold(dev); 341 342 ··· 355 354 eb->sec = *saddr; 356 355 eb->sent = ec_tx_done; 357 356 358 - if (dev->hard_header) { 359 - int res; 357 + err = -EINVAL; 358 + res = dev_hard_header(skb, dev, ntohs(proto), &addr, NULL, len); 359 + if (res < 0) 360 + goto out_free; 361 + if (res > 0) { 360 362 struct ec_framehdr *fh; 361 - err = -EINVAL; 362 - res = dev->hard_header(skb, dev, ntohs(proto), 363 - &addr, NULL, len); 364 363 /* Poke in our control byte and 365 364 port number. Hack, hack. */ 366 365 fh = (struct ec_framehdr *)(skb->data); ··· 369 368 if (sock->type != SOCK_DGRAM) { 370 369 skb_reset_tail_pointer(skb); 371 370 skb->len = 0; 372 - } else if (res < 0) 373 - goto out_free; 371 + } 374 372 } 375 373 376 374 /* Copy the data. Returns -EFAULT on error */
+1 -3
net/ethernet/pe2.c
··· 12 12 struct net_device *dev = skb->dev; 13 13 14 14 skb->protocol = htons(ETH_P_IPX); 15 - if (dev->hard_header) 16 - dev->hard_header(skb, dev, ETH_P_IPX, 17 - dest_node, NULL, skb->len); 15 + dev_hard_header(skb, dev, ETH_P_IPX, dest_node, NULL, skb->len); 18 16 return dev_queue_xmit(skb); 19 17 } 20 18
+1 -2
net/ipv4/arp.c
··· 591 591 /* 592 592 * Fill the device header for the ARP frame 593 593 */ 594 - if (dev->hard_header && 595 - dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb->len) < 0) 594 + if (dev_hard_header(skb, dev, ptype, dest_hw, src_hw, skb->len) < 0) 596 595 goto out; 597 596 598 597 /*
+2 -2
net/ipv4/ipconfig.c
··· 757 757 /* Chain packet down the line... */ 758 758 skb->dev = dev; 759 759 skb->protocol = htons(ETH_P_IP); 760 - if ((dev->hard_header && 761 - dev->hard_header(skb, dev, ntohs(skb->protocol), dev->broadcast, dev->dev_addr, skb->len) < 0) || 760 + if (dev_hard_header(skb, dev, ntohs(skb->protocol), 761 + dev->broadcast, dev->dev_addr, skb->len) < 0 || 762 762 dev_queue_xmit(skb) < 0) 763 763 printk("E"); 764 764 }
+5 -10
net/ipv6/mcast.c
··· 1438 1438 static inline int mld_dev_queue_xmit2(struct sk_buff *skb) 1439 1439 { 1440 1440 struct net_device *dev = skb->dev; 1441 + unsigned char ha[MAX_ADDR_LEN]; 1441 1442 1442 - if (dev->hard_header) { 1443 - unsigned char ha[MAX_ADDR_LEN]; 1444 - int err; 1445 - 1446 - ndisc_mc_map(&ipv6_hdr(skb)->daddr, ha, dev, 1); 1447 - err = dev->hard_header(skb, dev, ETH_P_IPV6, ha, NULL, skb->len); 1448 - if (err < 0) { 1449 - kfree_skb(skb); 1450 - return err; 1451 - } 1443 + ndisc_mc_map(&ipv6_hdr(skb)->daddr, ha, dev, 1); 1444 + if (dev_hard_header(skb, dev, ETH_P_IPV6, ha, NULL, skb->len) < 0) { 1445 + kfree_skb(skb); 1446 + return -EINVAL; 1452 1447 } 1453 1448 return dev_queue_xmit(skb); 1454 1449 }
+4 -10
net/packet/af_packet.c
··· 765 765 skb_reserve(skb, LL_RESERVED_SPACE(dev)); 766 766 skb_reset_network_header(skb); 767 767 768 - if (dev->hard_header) { 769 - int res; 770 - err = -EINVAL; 771 - res = dev->hard_header(skb, dev, ntohs(proto), addr, NULL, len); 772 - if (sock->type != SOCK_DGRAM) { 773 - skb_reset_tail_pointer(skb); 774 - skb->len = 0; 775 - } else if (res < 0) 776 - goto out_free; 777 - } 768 + err = -EINVAL; 769 + if (sock->type == SOCK_DGRAM && 770 + dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len) < 0) 771 + goto out_free; 778 772 779 773 /* Returns -EFAULT on error */ 780 774 err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
+4 -1
net/sched/sch_teql.c
··· 232 232 } 233 233 if (neigh_event_send(n, skb_res) == 0) { 234 234 int err; 235 + 235 236 read_lock(&n->lock); 236 - err = dev->hard_header(skb, dev, ntohs(skb->protocol), n->ha, NULL, skb->len); 237 + err = dev_hard_header(skb, dev, ntohs(skb->protocol), 238 + n->ha, NULL, skb->len); 237 239 read_unlock(&n->lock); 240 + 238 241 if (err < 0) { 239 242 neigh_release(n); 240 243 return -EINVAL;
+1 -1
net/tipc/eth_media.c
··· 77 77 skb_reset_network_header(clone); 78 78 dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; 79 79 clone->dev = dev; 80 - dev->hard_header(clone, dev, ETH_P_TIPC, 80 + dev_hard_header(clone, dev, ETH_P_TIPC, 81 81 &dest->dev_addr.eth_addr, 82 82 dev->dev_addr, clone->len); 83 83 dev_queue_xmit(clone);