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