diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-03-11 22:14:39 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-16 15:53:54 -0400 |
commit | 8a4eb5734e8d1dc60a8c28576bbbdfdcc643626d (patch) | |
tree | ed4cd2f9a2a04a30994a8f8964a81834c895c0c9 /drivers/net/bonding | |
parent | 2d7011ca79f1a8792e04d131b8ea21db179ab917 (diff) |
net: introduce rx_handler results and logic around that
This patch allows rx_handlers to better signalize what to do next to
it's caller. That makes skb->deliver_no_wcard no longer needed.
kernel-doc for rx_handler_result is taken from Nicolas' patch.
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Reviewed-by: Nicolas de Pesloüan <nicolas.2p.debian@free.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 04119b1e7cdb..27c413aa15da 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1480,20 +1480,23 @@ static bool bond_should_deliver_exact_match(struct sk_buff *skb, | |||
1480 | return false; | 1480 | return false; |
1481 | } | 1481 | } |
1482 | 1482 | ||
1483 | static struct sk_buff *bond_handle_frame(struct sk_buff *skb) | 1483 | static 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 slave *slave; |
1486 | struct net_device *bond_dev; | 1487 | struct net_device *bond_dev; |
1487 | struct bonding *bond; | 1488 | struct bonding *bond; |
1488 | 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); | 1490 | slave = bond_slave_get_rcu(skb->dev); |
1494 | bond_dev = ACCESS_ONCE(slave->dev->master); | 1491 | bond_dev = ACCESS_ONCE(slave->dev->master); |
1495 | if (unlikely(!bond_dev)) | 1492 | if (unlikely(!bond_dev)) |
1496 | return skb; | 1493 | return RX_HANDLER_PASS; |
1494 | |||
1495 | skb = skb_share_check(skb, GFP_ATOMIC); | ||
1496 | if (unlikely(!skb)) | ||
1497 | return RX_HANDLER_CONSUMED; | ||
1498 | |||
1499 | *pskb = skb; | ||
1497 | 1500 | ||
1498 | bond = netdev_priv(bond_dev); | 1501 | bond = netdev_priv(bond_dev); |
1499 | 1502 | ||
@@ -1501,8 +1504,7 @@ static struct sk_buff *bond_handle_frame(struct sk_buff *skb) | |||
1501 | slave->dev->last_rx = jiffies; | 1504 | slave->dev->last_rx = jiffies; |
1502 | 1505 | ||
1503 | if (bond_should_deliver_exact_match(skb, slave, bond)) { | 1506 | if (bond_should_deliver_exact_match(skb, slave, bond)) { |
1504 | skb->deliver_no_wcard = 1; | 1507 | return RX_HANDLER_EXACT; |
1505 | return skb; | ||
1506 | } | 1508 | } |
1507 | 1509 | ||
1508 | skb->dev = bond_dev; | 1510 | skb->dev = bond_dev; |
@@ -1514,12 +1516,12 @@ static struct sk_buff *bond_handle_frame(struct sk_buff *skb) | |||
1514 | if (unlikely(skb_cow_head(skb, | 1516 | if (unlikely(skb_cow_head(skb, |
1515 | skb->data - skb_mac_header(skb)))) { | 1517 | skb->data - skb_mac_header(skb)))) { |
1516 | kfree_skb(skb); | 1518 | kfree_skb(skb); |
1517 | return NULL; | 1519 | return RX_HANDLER_CONSUMED; |
1518 | } | 1520 | } |
1519 | memcpy(eth_hdr(skb)->h_dest, bond_dev->dev_addr, ETH_ALEN); | 1521 | memcpy(eth_hdr(skb)->h_dest, bond_dev->dev_addr, ETH_ALEN); |
1520 | } | 1522 | } |
1521 | 1523 | ||
1522 | return skb; | 1524 | return RX_HANDLER_ANOTHER; |
1523 | } | 1525 | } |
1524 | 1526 | ||
1525 | /* enslave device <slave> to bond device <master> */ | 1527 | /* enslave device <slave> to bond device <master> */ |