macvlan.c (cf5c5763eb531ff5120111ad300126e926fb5a56) macvlan.c (e16b859872b87650bb55b12cca5a5fcdc49c1442)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2007 Patrick McHardy <kaber@trash.net>
4 *
5 * The code this is based on carried the following copyright notice:
6 * ---
7 * (C) Copyright 2001-2006
8 * Alex Zeffertt, Cambridge Broadband Ltd, ajz@cambridgebroadband.com

--- 446 unchanged lines hidden (view full) ---

455 if (is_multicast_ether_addr(eth->h_dest)) {
456 unsigned int hash;
457
458 skb = ip_check_defrag(dev_net(skb->dev), skb, IP_DEFRAG_MACVLAN);
459 if (!skb)
460 return RX_HANDLER_CONSUMED;
461 *pskb = skb;
462 eth = eth_hdr(skb);
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2007 Patrick McHardy <kaber@trash.net>
4 *
5 * The code this is based on carried the following copyright notice:
6 * ---
7 * (C) Copyright 2001-2006
8 * Alex Zeffertt, Cambridge Broadband Ltd, ajz@cambridgebroadband.com

--- 446 unchanged lines hidden (view full) ---

455 if (is_multicast_ether_addr(eth->h_dest)) {
456 unsigned int hash;
457
458 skb = ip_check_defrag(dev_net(skb->dev), skb, IP_DEFRAG_MACVLAN);
459 if (!skb)
460 return RX_HANDLER_CONSUMED;
461 *pskb = skb;
462 eth = eth_hdr(skb);
463 if (macvlan_forward_source(skb, port, eth->h_source))
463 if (macvlan_forward_source(skb, port, eth->h_source)) {
464 kfree_skb(skb);
464 return RX_HANDLER_CONSUMED;
465 return RX_HANDLER_CONSUMED;
466 }
465 src = macvlan_hash_lookup(port, eth->h_source);
466 if (src && src->mode != MACVLAN_MODE_VEPA &&
467 src->mode != MACVLAN_MODE_BRIDGE) {
468 /* forward to original port. */
469 vlan = src;
470 ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?:
471 __netif_rx(skb);
472 handle_res = RX_HANDLER_CONSUMED;
473 goto out;
474 }
475
476 hash = mc_hash(NULL, eth->h_dest);
477 if (test_bit(hash, port->mc_filter))
478 macvlan_broadcast_enqueue(port, src, skb);
479
480 return RX_HANDLER_PASS;
481 }
482
467 src = macvlan_hash_lookup(port, eth->h_source);
468 if (src && src->mode != MACVLAN_MODE_VEPA &&
469 src->mode != MACVLAN_MODE_BRIDGE) {
470 /* forward to original port. */
471 vlan = src;
472 ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?:
473 __netif_rx(skb);
474 handle_res = RX_HANDLER_CONSUMED;
475 goto out;
476 }
477
478 hash = mc_hash(NULL, eth->h_dest);
479 if (test_bit(hash, port->mc_filter))
480 macvlan_broadcast_enqueue(port, src, skb);
481
482 return RX_HANDLER_PASS;
483 }
484
483 if (macvlan_forward_source(skb, port, eth->h_source))
485 if (macvlan_forward_source(skb, port, eth->h_source)) {
486 kfree_skb(skb);
484 return RX_HANDLER_CONSUMED;
487 return RX_HANDLER_CONSUMED;
488 }
485 if (macvlan_passthru(port))
486 vlan = list_first_or_null_rcu(&port->vlans,
487 struct macvlan_dev, list);
488 else
489 vlan = macvlan_hash_lookup(port, eth->h_dest);
490 if (!vlan || vlan->mode == MACVLAN_MODE_SOURCE)
491 return RX_HANDLER_PASS;
492

--- 1348 unchanged lines hidden ---
489 if (macvlan_passthru(port))
490 vlan = list_first_or_null_rcu(&port->vlans,
491 struct macvlan_dev, list);
492 else
493 vlan = macvlan_hash_lookup(port, eth->h_dest);
494 if (!vlan || vlan->mode == MACVLAN_MODE_SOURCE)
495 return RX_HANDLER_PASS;
496

--- 1348 unchanged lines hidden ---