linux/net/bridge/br_input.c
<<
>>
Prefs
   1/*
   2 *      Handle incoming frames
   3 *      Linux ethernet bridge
   4 *
   5 *      Authors:
   6 *      Lennert Buytenhek               <buytenh@gnu.org>
   7 *
   8 *      This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 */
  13
  14#include <linux/slab.h>
  15#include <linux/kernel.h>
  16#include <linux/netdevice.h>
  17#include <linux/etherdevice.h>
  18#include <linux/netfilter_bridge.h>
  19#include <linux/export.h>
  20#include <linux/rculist.h>
  21#include "br_private.h"
  22
  23/* Hook for brouter */
  24br_should_route_hook_t __rcu *br_should_route_hook __read_mostly;
  25EXPORT_SYMBOL(br_should_route_hook);
  26
  27static int br_pass_frame_up(struct sk_buff *skb)
  28{
  29        struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
  30        struct net_bridge *br = netdev_priv(brdev);
  31        struct br_cpu_netstats *brstats = this_cpu_ptr(br->stats);
  32
  33        u64_stats_update_begin(&brstats->syncp);
  34        brstats->rx_packets++;
  35        brstats->rx_bytes += skb->len;
  36        u64_stats_update_end(&brstats->syncp);
  37
  38        /* Bridge is just like any other port.  Make sure the
  39         * packet is allowed except in promisc modue when someone
  40         * may be running packet capture.
  41         */
  42        if (!(brdev->flags & IFF_PROMISC) &&
  43            !br_allowed_egress(br, br_get_vlan_info(br), skb)) {
  44                kfree_skb(skb);
  45                return NET_RX_DROP;
  46        }
  47
  48        skb = br_handle_vlan(br, br_get_vlan_info(br), skb);
  49        if (!skb)
  50                return NET_RX_DROP;
  51
  52        indev = skb->dev;
  53        skb->dev = brdev;
  54
  55        return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
  56                       netif_receive_skb);
  57}
  58
  59/* note: already called with rcu_read_lock */
  60int br_handle_frame_finish(struct sk_buff *skb)
  61{
  62        const unsigned char *dest = eth_hdr(skb)->h_dest;
  63        struct net_bridge_port *p = br_port_get_rcu(skb->dev);
  64        struct net_bridge *br;
  65        struct net_bridge_fdb_entry *dst;
  66        struct net_bridge_mdb_entry *mdst;
  67        struct sk_buff *skb2;
  68        u16 vid = 0;
  69
  70        if (!p || p->state == BR_STATE_DISABLED)
  71                goto drop;
  72
  73        if (!br_allowed_ingress(p->br, nbp_get_vlan_info(p), skb, &vid))
  74                goto drop;
  75
  76        /* insert into forwarding database after filtering to avoid spoofing */
  77        br = p->br;
  78        br_fdb_update(br, p, eth_hdr(skb)->h_source, vid);
  79
  80        if (!is_broadcast_ether_addr(dest) && is_multicast_ether_addr(dest) &&
  81            br_multicast_rcv(br, p, skb))
  82                goto drop;
  83
  84        if (p->state == BR_STATE_LEARNING)
  85                goto drop;
  86
  87        BR_INPUT_SKB_CB(skb)->brdev = br->dev;
  88
  89        /* The packet skb2 goes to the local host (NULL to skip). */
  90        skb2 = NULL;
  91
  92        if (br->dev->flags & IFF_PROMISC)
  93                skb2 = skb;
  94
  95        dst = NULL;
  96
  97        if (is_broadcast_ether_addr(dest))
  98                skb2 = skb;
  99        else if (is_multicast_ether_addr(dest)) {
 100                mdst = br_mdb_get(br, skb, vid);
 101                if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) {
 102                        if ((mdst && mdst->mglist) ||
 103                            br_multicast_is_router(br))
 104                                skb2 = skb;
 105                        br_multicast_forward(mdst, skb, skb2);
 106                        skb = NULL;
 107                        if (!skb2)
 108                                goto out;
 109                } else
 110                        skb2 = skb;
 111
 112                br->dev->stats.multicast++;
 113        } else if ((dst = __br_fdb_get(br, dest, vid)) &&
 114                        dst->is_local) {
 115                skb2 = skb;
 116                /* Do not forward the packet since it's local. */
 117                skb = NULL;
 118        }
 119
 120        if (skb) {
 121                if (dst) {
 122                        dst->used = jiffies;
 123                        br_forward(dst->dst, skb, skb2);
 124                } else
 125                        br_flood_forward(br, skb, skb2);
 126        }
 127
 128        if (skb2)
 129                return br_pass_frame_up(skb2);
 130
 131out:
 132        return 0;
 133drop:
 134        kfree_skb(skb);
 135        goto out;
 136}
 137
 138/* note: already called with rcu_read_lock */
 139static int br_handle_local_finish(struct sk_buff *skb)
 140{
 141        struct net_bridge_port *p = br_port_get_rcu(skb->dev);
 142        u16 vid = 0;
 143
 144        br_vlan_get_tag(skb, &vid);
 145        br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid);
 146        return 0;        /* process further */
 147}
 148
 149/*
 150 * Return NULL if skb is handled
 151 * note: already called with rcu_read_lock
 152 */
 153rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
 154{
 155        struct net_bridge_port *p;
 156        struct sk_buff *skb = *pskb;
 157        const unsigned char *dest = eth_hdr(skb)->h_dest;
 158        br_should_route_hook_t *rhook;
 159
 160        if (unlikely(skb->pkt_type == PACKET_LOOPBACK))
 161                return RX_HANDLER_PASS;
 162
 163        if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
 164                goto drop;
 165
 166        skb = skb_share_check(skb, GFP_ATOMIC);
 167        if (!skb)
 168                return RX_HANDLER_CONSUMED;
 169
 170        p = br_port_get_rcu(skb->dev);
 171
 172        if (unlikely(is_link_local_ether_addr(dest))) {
 173                /*
 174                 * See IEEE 802.1D Table 7-10 Reserved addresses
 175                 *
 176                 * Assignment                           Value
 177                 * Bridge Group Address         01-80-C2-00-00-00
 178                 * (MAC Control) 802.3          01-80-C2-00-00-01
 179                 * (Link Aggregation) 802.3     01-80-C2-00-00-02
 180                 * 802.1X PAE address           01-80-C2-00-00-03
 181                 *
 182                 * 802.1AB LLDP                 01-80-C2-00-00-0E
 183                 *
 184                 * Others reserved for future standardization
 185                 */
 186                switch (dest[5]) {
 187                case 0x00:      /* Bridge Group Address */
 188                        /* If STP is turned off,
 189                           then must forward to keep loop detection */
 190                        if (p->br->stp_enabled == BR_NO_STP)
 191                                goto forward;
 192                        break;
 193
 194                case 0x01:      /* IEEE MAC (Pause) */
 195                        goto drop;
 196
 197                default:
 198                        /* Allow selective forwarding for most other protocols */
 199                        if (p->br->group_fwd_mask & (1u << dest[5]))
 200                                goto forward;
 201                }
 202
 203                /* Deliver packet to local host only */
 204                if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
 205                            NULL, br_handle_local_finish)) {
 206                        return RX_HANDLER_CONSUMED; /* consumed by filter */
 207                } else {
 208                        *pskb = skb;
 209                        return RX_HANDLER_PASS; /* continue processing */
 210                }
 211        }
 212
 213forward:
 214        switch (p->state) {
 215        case BR_STATE_FORWARDING:
 216                rhook = rcu_dereference(br_should_route_hook);
 217                if (rhook) {
 218                        if ((*rhook)(skb)) {
 219                                *pskb = skb;
 220                                return RX_HANDLER_PASS;
 221                        }
 222                        dest = eth_hdr(skb)->h_dest;
 223                }
 224                /* fall through */
 225        case BR_STATE_LEARNING:
 226                if (ether_addr_equal(p->br->dev->dev_addr, dest))
 227                        skb->pkt_type = PACKET_HOST;
 228
 229                NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
 230                        br_handle_frame_finish);
 231                break;
 232        default:
 233drop:
 234                kfree_skb(skb);
 235        }
 236        return RX_HANDLER_CONSUMED;
 237}
 238