bridge: use rx_handler_data pointer to store net_bridge_port pointer
Register net_bridge_port pointer as rx_handler data pointer. As br_port is removed from struct net_device, another netdev priv_flag is added to indicate the device serves as a bridge port. Also rcuized pointers are now correctly dereferenced in br_fdb.c and in netfilter parts. Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a35e2c1b6d
commit
f350a0a873
@@ -41,7 +41,7 @@ static int br_pass_frame_up(struct sk_buff *skb)
|
||||
int br_handle_frame_finish(struct sk_buff *skb)
|
||||
{
|
||||
const unsigned char *dest = eth_hdr(skb)->h_dest;
|
||||
struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
|
||||
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
||||
struct net_bridge *br;
|
||||
struct net_bridge_fdb_entry *dst;
|
||||
struct net_bridge_mdb_entry *mdst;
|
||||
@@ -111,10 +111,9 @@ drop:
|
||||
/* note: already called with rcu_read_lock (preempt_disabled) */
|
||||
static int br_handle_local_finish(struct sk_buff *skb)
|
||||
{
|
||||
struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
|
||||
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
||||
|
||||
if (p)
|
||||
br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
|
||||
br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
|
||||
return 0; /* process further */
|
||||
}
|
||||
|
||||
@@ -151,7 +150,7 @@ struct sk_buff *br_handle_frame(struct sk_buff *skb)
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
p = rcu_dereference(skb->dev->br_port);
|
||||
p = br_port_get_rcu(skb->dev);
|
||||
|
||||
if (unlikely(is_link_local(dest))) {
|
||||
/* Pause frames shouldn't be passed up by driver anyway */
|
||||
|
Reference in New Issue
Block a user