br_input.c (29a26a56803855a79dbd028cd61abee56237d6e5) | br_input.c (0c4b51f0054ce85c0ec578ab818f0631834573eb) |
---|---|
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 --- 12 unchanged lines hidden (view full) --- 21#include <linux/export.h> 22#include <linux/rculist.h> 23#include "br_private.h" 24 25/* Hook for brouter */ 26br_should_route_hook_t __rcu *br_should_route_hook __read_mostly; 27EXPORT_SYMBOL(br_should_route_hook); 28 | 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 --- 12 unchanged lines hidden (view full) --- 21#include <linux/export.h> 22#include <linux/rculist.h> 23#include "br_private.h" 24 25/* Hook for brouter */ 26br_should_route_hook_t __rcu *br_should_route_hook __read_mostly; 27EXPORT_SYMBOL(br_should_route_hook); 28 |
29static int br_netif_receive_skb(struct sock *sk, struct sk_buff *skb) | 29static int 30br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb) |
30{ 31 return netif_receive_skb(skb); 32} 33 34static int br_pass_frame_up(struct sk_buff *skb) 35{ 36 struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev; 37 struct net_bridge *br = netdev_priv(brdev); --- 82 unchanged lines hidden (view full) --- 120 BR_INPUT_SKB_CB(skb)->proxyarp_replied = true; 121 } 122 123 neigh_release(n); 124 } 125} 126 127/* note: already called with rcu_read_lock */ | 31{ 32 return netif_receive_skb(skb); 33} 34 35static int br_pass_frame_up(struct sk_buff *skb) 36{ 37 struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev; 38 struct net_bridge *br = netdev_priv(brdev); --- 82 unchanged lines hidden (view full) --- 121 BR_INPUT_SKB_CB(skb)->proxyarp_replied = true; 122 } 123 124 neigh_release(n); 125 } 126} 127 128/* note: already called with rcu_read_lock */ |
128int br_handle_frame_finish(struct sock *sk, struct sk_buff *skb) | 129int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb) |
129{ 130 const unsigned char *dest = eth_hdr(skb)->h_dest; 131 struct net_bridge_port *p = br_port_get_rcu(skb->dev); 132 struct net_bridge *br; 133 struct net_bridge_fdb_entry *dst; 134 struct net_bridge_mdb_entry *mdst; 135 struct sk_buff *skb2; 136 bool unicast = true; --- 71 unchanged lines hidden (view full) --- 208 return 0; 209drop: 210 kfree_skb(skb); 211 goto out; 212} 213EXPORT_SYMBOL_GPL(br_handle_frame_finish); 214 215/* note: already called with rcu_read_lock */ | 130{ 131 const unsigned char *dest = eth_hdr(skb)->h_dest; 132 struct net_bridge_port *p = br_port_get_rcu(skb->dev); 133 struct net_bridge *br; 134 struct net_bridge_fdb_entry *dst; 135 struct net_bridge_mdb_entry *mdst; 136 struct sk_buff *skb2; 137 bool unicast = true; --- 71 unchanged lines hidden (view full) --- 209 return 0; 210drop: 211 kfree_skb(skb); 212 goto out; 213} 214EXPORT_SYMBOL_GPL(br_handle_frame_finish); 215 216/* note: already called with rcu_read_lock */ |
216static int br_handle_local_finish(struct sock *sk, struct sk_buff *skb) | 217static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) |
217{ 218 struct net_bridge_port *p = br_port_get_rcu(skb->dev); 219 u16 vid = 0; 220 221 /* check if vlan is allowed, to avoid spoofing */ 222 if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid)) 223 br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false); 224 return 0; /* process further */ --- 97 unchanged lines hidden --- | 218{ 219 struct net_bridge_port *p = br_port_get_rcu(skb->dev); 220 u16 vid = 0; 221 222 /* check if vlan is allowed, to avoid spoofing */ 223 if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid)) 224 br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false); 225 return 0; /* process further */ --- 97 unchanged lines hidden --- |