bond_main.c (2d7011ca79f1a8792e04d131b8ea21db179ab917) | bond_main.c (8a4eb5734e8d1dc60a8c28576bbbdfdcc643626d) |
---|---|
1/* 2 * originally based on the dummy device. 3 * 4 * Copyright 1999, Thomas Davis, tadavis@lbl.gov. 5 * Licensed under the GPL. Based on dummy.c, and eql.c devices. 6 * 7 * bonding.c: an Ethernet Bonding driver 8 * --- 1466 unchanged lines hidden (view full) --- 1475 skb->protocol == __cpu_to_be16(ETH_P_SLOW)) 1476 return false; 1477 1478 return true; 1479 } 1480 return false; 1481} 1482 | 1/* 2 * originally based on the dummy device. 3 * 4 * Copyright 1999, Thomas Davis, tadavis@lbl.gov. 5 * Licensed under the GPL. Based on dummy.c, and eql.c devices. 6 * 7 * bonding.c: an Ethernet Bonding driver 8 * --- 1466 unchanged lines hidden (view full) --- 1475 skb->protocol == __cpu_to_be16(ETH_P_SLOW)) 1476 return false; 1477 1478 return true; 1479 } 1480 return false; 1481} 1482 |
1483static struct sk_buff *bond_handle_frame(struct sk_buff *skb) | 1483static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) |
1484{ | 1484{ |
1485 struct sk_buff *skb = *pskb; |
|
1485 struct slave *slave; 1486 struct net_device *bond_dev; 1487 struct bonding *bond; 1488 | 1486 struct slave *slave; 1487 struct net_device *bond_dev; 1488 struct bonding *bond; 1489 |
1489 skb = skb_share_check(skb, GFP_ATOMIC); 1490 if (unlikely(!skb)) 1491 return NULL; 1492 | |
1493 slave = bond_slave_get_rcu(skb->dev); 1494 bond_dev = ACCESS_ONCE(slave->dev->master); 1495 if (unlikely(!bond_dev)) | 1490 slave = bond_slave_get_rcu(skb->dev); 1491 bond_dev = ACCESS_ONCE(slave->dev->master); 1492 if (unlikely(!bond_dev)) |
1496 return skb; | 1493 return RX_HANDLER_PASS; |
1497 | 1494 |
1495 skb = skb_share_check(skb, GFP_ATOMIC); 1496 if (unlikely(!skb)) 1497 return RX_HANDLER_CONSUMED; 1498 1499 *pskb = skb; 1500 |
|
1498 bond = netdev_priv(bond_dev); 1499 1500 if (bond->params.arp_interval) 1501 slave->dev->last_rx = jiffies; 1502 1503 if (bond_should_deliver_exact_match(skb, slave, bond)) { | 1501 bond = netdev_priv(bond_dev); 1502 1503 if (bond->params.arp_interval) 1504 slave->dev->last_rx = jiffies; 1505 1506 if (bond_should_deliver_exact_match(skb, slave, bond)) { |
1504 skb->deliver_no_wcard = 1; 1505 return skb; | 1507 return RX_HANDLER_EXACT; |
1506 } 1507 1508 skb->dev = bond_dev; 1509 1510 if (bond->params.mode == BOND_MODE_ALB && 1511 bond_dev->priv_flags & IFF_BRIDGE_PORT && 1512 skb->pkt_type == PACKET_HOST) { 1513 1514 if (unlikely(skb_cow_head(skb, 1515 skb->data - skb_mac_header(skb)))) { 1516 kfree_skb(skb); | 1508 } 1509 1510 skb->dev = bond_dev; 1511 1512 if (bond->params.mode == BOND_MODE_ALB && 1513 bond_dev->priv_flags & IFF_BRIDGE_PORT && 1514 skb->pkt_type == PACKET_HOST) { 1515 1516 if (unlikely(skb_cow_head(skb, 1517 skb->data - skb_mac_header(skb)))) { 1518 kfree_skb(skb); |
1517 return NULL; | 1519 return RX_HANDLER_CONSUMED; |
1518 } 1519 memcpy(eth_hdr(skb)->h_dest, bond_dev->dev_addr, ETH_ALEN); 1520 } 1521 | 1520 } 1521 memcpy(eth_hdr(skb)->h_dest, bond_dev->dev_addr, ETH_ALEN); 1522 } 1523 |
1522 return skb; | 1524 return RX_HANDLER_ANOTHER; |
1523} 1524 1525/* enslave device <slave> to bond device <master> */ 1526int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) 1527{ 1528 struct bonding *bond = netdev_priv(bond_dev); 1529 const struct net_device_ops *slave_ops = slave_dev->netdev_ops; 1530 struct slave *new_slave = NULL; --- 3625 unchanged lines hidden --- | 1525} 1526 1527/* enslave device <slave> to bond device <master> */ 1528int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) 1529{ 1530 struct bonding *bond = netdev_priv(bond_dev); 1531 const struct net_device_ops *slave_ops = slave_dev->netdev_ops; 1532 struct slave *new_slave = NULL; --- 3625 unchanged lines hidden --- |