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