diff options
author | Patrick McHardy <kaber@trash.net> | 2008-07-06 00:26:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-06 00:26:27 -0400 |
commit | b3ce0325f2bf1bb737cb8fc7c349ce8fefdd9e40 (patch) | |
tree | f2925e18555561b528b781c535c96bdbc0c809a9 | |
parent | eca9ebac651f774d8b10fce7c5d173c3c3d3394f (diff) |
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>
-rw-r--r-- | net/8021q/vlan.c | 6 | ||||
-rw-r--r-- | net/8021q/vlan.h | 3 | ||||
-rw-r--r-- | net/8021q/vlan_dev.c | 20 | ||||
-rw-r--r-- | net/8021q/vlan_netlink.c | 4 |
4 files changed, 14 insertions, 19 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index ab2225da0ee2..b591bfca1ab2 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -591,9 +591,9 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg) | |||
591 | err = -EPERM; | 591 | err = -EPERM; |
592 | if (!capable(CAP_NET_ADMIN)) | 592 | if (!capable(CAP_NET_ADMIN)) |
593 | break; | 593 | break; |
594 | err = vlan_dev_set_vlan_flag(dev, | 594 | err = vlan_dev_change_flags(dev, |
595 | args.u.flag, | 595 | args.vlan_qos ? args.u.flag : 0, |
596 | args.vlan_qos); | 596 | args.u.flag); |
597 | break; | 597 | break; |
598 | 598 | ||
599 | case SET_VLAN_NAME_TYPE_CMD: | 599 | case SET_VLAN_NAME_TYPE_CMD: |
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 5229a72c7ea1..639e2544a804 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
@@ -28,8 +28,7 @@ void vlan_dev_set_ingress_priority(const struct net_device *dev, | |||
28 | u32 skb_prio, short vlan_prio); | 28 | u32 skb_prio, short vlan_prio); |
29 | int vlan_dev_set_egress_priority(const struct net_device *dev, | 29 | int vlan_dev_set_egress_priority(const struct net_device *dev, |
30 | u32 skb_prio, short vlan_prio); | 30 | u32 skb_prio, short vlan_prio); |
31 | int vlan_dev_set_vlan_flag(const struct net_device *dev, | 31 | int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); |
32 | u32 flag, short flag_val); | ||
33 | void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); | 32 | void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); |
34 | void vlan_dev_get_vid(const struct net_device *dev, unsigned short *result); | 33 | void vlan_dev_get_vid(const struct net_device *dev, unsigned short *result); |
35 | 34 | ||
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 5d055c242ed8..76c665cdab66 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -507,18 +507,16 @@ int vlan_dev_set_egress_priority(const struct net_device *dev, | |||
507 | } | 507 | } |
508 | 508 | ||
509 | /* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */ | 509 | /* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */ |
510 | int vlan_dev_set_vlan_flag(const struct net_device *dev, | 510 | int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask) |
511 | u32 flag, short flag_val) | ||
512 | { | 511 | { |
513 | /* verify flag is supported */ | 512 | struct vlan_dev_info *vlan = vlan_dev_info(dev); |
514 | if (flag == VLAN_FLAG_REORDER_HDR) { | 513 | u32 old_flags = vlan->flags; |
515 | if (flag_val) | 514 | |
516 | vlan_dev_info(dev)->flags |= VLAN_FLAG_REORDER_HDR; | 515 | if (mask & ~VLAN_FLAG_REORDER_HDR) |
517 | else | 516 | return -EINVAL; |
518 | vlan_dev_info(dev)->flags &= ~VLAN_FLAG_REORDER_HDR; | 517 | |
519 | return 0; | 518 | vlan->flags = (old_flags & ~mask) | (flags & mask); |
520 | } | 519 | return 0; |
521 | return -EINVAL; | ||
522 | } | 520 | } |
523 | 521 | ||
524 | void vlan_dev_get_realdev_name(const struct net_device *dev, char *result) | 522 | void vlan_dev_get_realdev_name(const struct net_device *dev, char *result) |
diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c index c93e69ec28ed..fd7cb195d53f 100644 --- a/net/8021q/vlan_netlink.c +++ b/net/8021q/vlan_netlink.c | |||
@@ -75,7 +75,6 @@ static int vlan_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
75 | static int vlan_changelink(struct net_device *dev, | 75 | static int vlan_changelink(struct net_device *dev, |
76 | struct nlattr *tb[], struct nlattr *data[]) | 76 | struct nlattr *tb[], struct nlattr *data[]) |
77 | { | 77 | { |
78 | struct vlan_dev_info *vlan = vlan_dev_info(dev); | ||
79 | struct ifla_vlan_flags *flags; | 78 | struct ifla_vlan_flags *flags; |
80 | struct ifla_vlan_qos_mapping *m; | 79 | struct ifla_vlan_qos_mapping *m; |
81 | struct nlattr *attr; | 80 | struct nlattr *attr; |
@@ -83,8 +82,7 @@ static int vlan_changelink(struct net_device *dev, | |||
83 | 82 | ||
84 | if (data[IFLA_VLAN_FLAGS]) { | 83 | if (data[IFLA_VLAN_FLAGS]) { |
85 | flags = nla_data(data[IFLA_VLAN_FLAGS]); | 84 | flags = nla_data(data[IFLA_VLAN_FLAGS]); |
86 | vlan->flags = (vlan->flags & ~flags->mask) | | 85 | vlan_dev_change_flags(dev, flags->flags, flags->mask); |
87 | (flags->flags & flags->mask); | ||
88 | } | 86 | } |
89 | if (data[IFLA_VLAN_INGRESS_QOS]) { | 87 | if (data[IFLA_VLAN_INGRESS_QOS]) { |
90 | nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) { | 88 | nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) { |