Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Just minor overlapping changes in the conflicts here. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -37,12 +37,15 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
|
||||
int err;
|
||||
|
||||
if (dev->priv_flags & IFF_EBRIDGE) {
|
||||
err = br_vlan_bridge_event(dev, event, ptr);
|
||||
if (err)
|
||||
return notifier_from_errno(err);
|
||||
|
||||
if (event == NETDEV_REGISTER) {
|
||||
/* register of bridge completed, add sysfs entries */
|
||||
br_sysfs_addbr(dev);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
br_vlan_bridge_event(dev, event, ptr);
|
||||
}
|
||||
|
||||
/* not a port of a bridge */
|
||||
|
@@ -1388,6 +1388,9 @@ br_multicast_leave_group(struct net_bridge *br,
|
||||
if (!br_port_group_equal(p, port, src))
|
||||
continue;
|
||||
|
||||
if (p->flags & MDB_PG_FLAGS_PERMANENT)
|
||||
break;
|
||||
|
||||
rcu_assign_pointer(*pp, p->next);
|
||||
hlist_del_init(&p->mglist);
|
||||
del_timer(&p->timer);
|
||||
|
@@ -895,8 +895,8 @@ int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask);
|
||||
void br_vlan_get_stats(const struct net_bridge_vlan *v,
|
||||
struct br_vlan_stats *stats);
|
||||
void br_vlan_port_event(struct net_bridge_port *p, unsigned long event);
|
||||
void br_vlan_bridge_event(struct net_device *dev, unsigned long event,
|
||||
void *ptr);
|
||||
int br_vlan_bridge_event(struct net_device *dev, unsigned long event,
|
||||
void *ptr);
|
||||
|
||||
static inline struct net_bridge_vlan_group *br_vlan_group(
|
||||
const struct net_bridge *br)
|
||||
@@ -1086,9 +1086,10 @@ static inline void br_vlan_port_event(struct net_bridge_port *p,
|
||||
{
|
||||
}
|
||||
|
||||
static inline void br_vlan_bridge_event(struct net_device *dev,
|
||||
unsigned long event, void *ptr)
|
||||
static inline int br_vlan_bridge_event(struct net_device *dev,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -1053,7 +1053,6 @@ int br_vlan_init(struct net_bridge *br)
|
||||
{
|
||||
struct net_bridge_vlan_group *vg;
|
||||
int ret = -ENOMEM;
|
||||
bool changed;
|
||||
|
||||
vg = kzalloc(sizeof(*vg), GFP_KERNEL);
|
||||
if (!vg)
|
||||
@@ -1068,17 +1067,10 @@ int br_vlan_init(struct net_bridge *br)
|
||||
br->vlan_proto = htons(ETH_P_8021Q);
|
||||
br->default_pvid = 1;
|
||||
rcu_assign_pointer(br->vlgrp, vg);
|
||||
ret = br_vlan_add(br, 1,
|
||||
BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED |
|
||||
BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
|
||||
if (ret)
|
||||
goto err_vlan_add;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
err_vlan_add:
|
||||
vlan_tunnel_deinit(vg);
|
||||
err_tunnel_init:
|
||||
rhashtable_destroy(&vg->vlan_hash);
|
||||
err_rhtbl:
|
||||
@@ -1464,13 +1456,23 @@ static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid)
|
||||
}
|
||||
|
||||
/* Must be protected by RTNL. */
|
||||
void br_vlan_bridge_event(struct net_device *dev, unsigned long event,
|
||||
void *ptr)
|
||||
int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
|
||||
{
|
||||
struct netdev_notifier_changeupper_info *info;
|
||||
struct net_bridge *br;
|
||||
struct net_bridge *br = netdev_priv(dev);
|
||||
bool changed;
|
||||
int ret = 0;
|
||||
|
||||
switch (event) {
|
||||
case NETDEV_REGISTER:
|
||||
ret = br_vlan_add(br, br->default_pvid,
|
||||
BRIDGE_VLAN_INFO_PVID |
|
||||
BRIDGE_VLAN_INFO_UNTAGGED |
|
||||
BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
|
||||
break;
|
||||
case NETDEV_UNREGISTER:
|
||||
br_vlan_delete(br, br->default_pvid);
|
||||
break;
|
||||
case NETDEV_CHANGEUPPER:
|
||||
info = ptr;
|
||||
br_vlan_upper_change(dev, info->upper_dev, info->linking);
|
||||
@@ -1478,12 +1480,13 @@ void br_vlan_bridge_event(struct net_device *dev, unsigned long event,
|
||||
|
||||
case NETDEV_CHANGE:
|
||||
case NETDEV_UP:
|
||||
br = netdev_priv(dev);
|
||||
if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING))
|
||||
return;
|
||||
break;
|
||||
br_vlan_link_state_change(dev, br);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Must be protected by RTNL. */
|
||||
|
@@ -1770,20 +1770,28 @@ static int compat_calc_entry(const struct ebt_entry *e,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ebt_compat_init_offsets(unsigned int number)
|
||||
{
|
||||
if (number > INT_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
/* also count the base chain policies */
|
||||
number += NF_BR_NUMHOOKS;
|
||||
|
||||
return xt_compat_init_offsets(NFPROTO_BRIDGE, number);
|
||||
}
|
||||
|
||||
static int compat_table_info(const struct ebt_table_info *info,
|
||||
struct compat_ebt_replace *newinfo)
|
||||
{
|
||||
unsigned int size = info->entries_size;
|
||||
const void *entries = info->entries;
|
||||
int ret;
|
||||
|
||||
newinfo->entries_size = size;
|
||||
if (info->nentries) {
|
||||
int ret = xt_compat_init_offsets(NFPROTO_BRIDGE,
|
||||
info->nentries);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = ebt_compat_init_offsets(info->nentries);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return EBT_ENTRY_ITERATE(entries, size, compat_calc_entry, info,
|
||||
entries, newinfo);
|
||||
@@ -2234,11 +2242,9 @@ static int compat_do_replace(struct net *net, void __user *user,
|
||||
|
||||
xt_compat_lock(NFPROTO_BRIDGE);
|
||||
|
||||
if (tmp.nentries) {
|
||||
ret = xt_compat_init_offsets(NFPROTO_BRIDGE, tmp.nentries);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
}
|
||||
ret = ebt_compat_init_offsets(tmp.nentries);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
|
||||
if (ret < 0)
|
||||
@@ -2261,8 +2267,10 @@ static int compat_do_replace(struct net *net, void __user *user,
|
||||
state.buf_kern_len = size64;
|
||||
|
||||
ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
|
||||
if (WARN_ON(ret < 0))
|
||||
if (WARN_ON(ret < 0)) {
|
||||
vfree(entries_tmp);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
vfree(entries_tmp);
|
||||
tmp.entries_size = size64;
|
||||
|
@@ -30,13 +30,9 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
|
||||
switch (priv->key) {
|
||||
case NFT_META_BRI_IIFNAME:
|
||||
br_dev = nft_meta_get_bridge(in);
|
||||
if (!br_dev)
|
||||
goto err;
|
||||
break;
|
||||
case NFT_META_BRI_OIFNAME:
|
||||
br_dev = nft_meta_get_bridge(out);
|
||||
if (!br_dev)
|
||||
goto err;
|
||||
break;
|
||||
case NFT_META_BRI_IIFPVID: {
|
||||
u16 p_pvid;
|
||||
@@ -61,13 +57,11 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
|
||||
return;
|
||||
}
|
||||
default:
|
||||
goto out;
|
||||
return nft_meta_get_eval(expr, regs, pkt);
|
||||
}
|
||||
|
||||
strncpy((char *)dest, br_dev->name, IFNAMSIZ);
|
||||
strncpy((char *)dest, br_dev ? br_dev->name : "", IFNAMSIZ);
|
||||
return;
|
||||
out:
|
||||
return nft_meta_get_eval(expr, regs, pkt);
|
||||
err:
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
}
|
||||
|
Reference in New Issue
Block a user