mirror of https://gitee.com/openkylin/linux.git
vlan: Change vlan_dev_set_vlan_flag() to handle multiple flags at once
Change vlan_dev_set_vlan_flag() to handle multiple flags at once and rename to vlan_dev_change_flags(). This allows to to use it from the netlink interface, which in turn allows to handle necessary adjustments when changing flags centrally. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
eca9ebac65
commit
b3ce0325f2
|
@ -591,9 +591,9 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg)
|
|||
err = -EPERM;
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
break;
|
||||
err = vlan_dev_set_vlan_flag(dev,
|
||||
args.u.flag,
|
||||
args.vlan_qos);
|
||||
err = vlan_dev_change_flags(dev,
|
||||
args.vlan_qos ? args.u.flag : 0,
|
||||
args.u.flag);
|
||||
break;
|
||||
|
||||
case SET_VLAN_NAME_TYPE_CMD:
|
||||
|
|
|
@ -28,8 +28,7 @@ void vlan_dev_set_ingress_priority(const struct net_device *dev,
|
|||
u32 skb_prio, short vlan_prio);
|
||||
int vlan_dev_set_egress_priority(const struct net_device *dev,
|
||||
u32 skb_prio, short vlan_prio);
|
||||
int vlan_dev_set_vlan_flag(const struct net_device *dev,
|
||||
u32 flag, short flag_val);
|
||||
int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask);
|
||||
void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
|
||||
void vlan_dev_get_vid(const struct net_device *dev, unsigned short *result);
|
||||
|
||||
|
|
|
@ -507,18 +507,16 @@ int vlan_dev_set_egress_priority(const struct net_device *dev,
|
|||
}
|
||||
|
||||
/* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */
|
||||
int vlan_dev_set_vlan_flag(const struct net_device *dev,
|
||||
u32 flag, short flag_val)
|
||||
int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
|
||||
{
|
||||
/* verify flag is supported */
|
||||
if (flag == VLAN_FLAG_REORDER_HDR) {
|
||||
if (flag_val)
|
||||
vlan_dev_info(dev)->flags |= VLAN_FLAG_REORDER_HDR;
|
||||
else
|
||||
vlan_dev_info(dev)->flags &= ~VLAN_FLAG_REORDER_HDR;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
struct vlan_dev_info *vlan = vlan_dev_info(dev);
|
||||
u32 old_flags = vlan->flags;
|
||||
|
||||
if (mask & ~VLAN_FLAG_REORDER_HDR)
|
||||
return -EINVAL;
|
||||
|
||||
vlan->flags = (old_flags & ~mask) | (flags & mask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
|
||||
|
|
|
@ -75,7 +75,6 @@ static int vlan_validate(struct nlattr *tb[], struct nlattr *data[])
|
|||
static int vlan_changelink(struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[])
|
||||
{
|
||||
struct vlan_dev_info *vlan = vlan_dev_info(dev);
|
||||
struct ifla_vlan_flags *flags;
|
||||
struct ifla_vlan_qos_mapping *m;
|
||||
struct nlattr *attr;
|
||||
|
@ -83,8 +82,7 @@ static int vlan_changelink(struct net_device *dev,
|
|||
|
||||
if (data[IFLA_VLAN_FLAGS]) {
|
||||
flags = nla_data(data[IFLA_VLAN_FLAGS]);
|
||||
vlan->flags = (vlan->flags & ~flags->mask) |
|
||||
(flags->flags & flags->mask);
|
||||
vlan_dev_change_flags(dev, flags->flags, flags->mask);
|
||||
}
|
||||
if (data[IFLA_VLAN_INGRESS_QOS]) {
|
||||
nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) {
|
||||
|
|
Loading…
Reference in New Issue