diff options
| -rw-r--r-- | include/net/switchdev.h | 2 | ||||
| -rw-r--r-- | net/bridge/br_fdb.c | 1 | ||||
| -rw-r--r-- | net/bridge/br_stp.c | 2 | ||||
| -rw-r--r-- | net/bridge/br_stp_if.c | 1 | ||||
| -rw-r--r-- | net/bridge/br_vlan.c | 2 | ||||
| -rw-r--r-- | net/core/net-sysfs.c | 1 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 1 | ||||
| -rw-r--r-- | net/switchdev/switchdev.c | 12 |
8 files changed, 22 insertions, 0 deletions
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index 1d22ce9f352e..6612946167fe 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h | |||
| @@ -50,6 +50,7 @@ enum switchdev_attr_id { | |||
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | struct switchdev_attr { | 52 | struct switchdev_attr { |
| 53 | struct net_device *orig_dev; | ||
| 53 | enum switchdev_attr_id id; | 54 | enum switchdev_attr_id id; |
| 54 | u32 flags; | 55 | u32 flags; |
| 55 | union { | 56 | union { |
| @@ -68,6 +69,7 @@ enum switchdev_obj_id { | |||
| 68 | }; | 69 | }; |
| 69 | 70 | ||
| 70 | struct switchdev_obj { | 71 | struct switchdev_obj { |
| 72 | struct net_device *orig_dev; | ||
| 71 | enum switchdev_obj_id id; | 73 | enum switchdev_obj_id id; |
| 72 | u32 flags; | 74 | u32 flags; |
| 73 | }; | 75 | }; |
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index a642bb829d09..82e3e9705017 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
| @@ -135,6 +135,7 @@ static void fdb_del_external_learn(struct net_bridge_fdb_entry *f) | |||
| 135 | { | 135 | { |
| 136 | struct switchdev_obj_port_fdb fdb = { | 136 | struct switchdev_obj_port_fdb fdb = { |
| 137 | .obj = { | 137 | .obj = { |
| 138 | .orig_dev = f->dst->dev, | ||
| 138 | .id = SWITCHDEV_OBJ_ID_PORT_FDB, | 139 | .id = SWITCHDEV_OBJ_ID_PORT_FDB, |
| 139 | .flags = SWITCHDEV_F_DEFER, | 140 | .flags = SWITCHDEV_F_DEFER, |
| 140 | }, | 141 | }, |
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index 5f3f64553179..b3cca126b103 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
| @@ -40,6 +40,7 @@ void br_log_state(const struct net_bridge_port *p) | |||
| 40 | void br_set_state(struct net_bridge_port *p, unsigned int state) | 40 | void br_set_state(struct net_bridge_port *p, unsigned int state) |
| 41 | { | 41 | { |
| 42 | struct switchdev_attr attr = { | 42 | struct switchdev_attr attr = { |
| 43 | .orig_dev = p->dev, | ||
| 43 | .id = SWITCHDEV_ATTR_ID_PORT_STP_STATE, | 44 | .id = SWITCHDEV_ATTR_ID_PORT_STP_STATE, |
| 44 | .flags = SWITCHDEV_F_DEFER, | 45 | .flags = SWITCHDEV_F_DEFER, |
| 45 | .u.stp_state = state, | 46 | .u.stp_state = state, |
| @@ -570,6 +571,7 @@ int br_set_max_age(struct net_bridge *br, unsigned long val) | |||
| 570 | int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) | 571 | int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) |
| 571 | { | 572 | { |
| 572 | struct switchdev_attr attr = { | 573 | struct switchdev_attr attr = { |
| 574 | .orig_dev = br->dev, | ||
| 573 | .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, | 575 | .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, |
| 574 | .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP, | 576 | .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP, |
| 575 | .u.ageing_time = ageing_time, | 577 | .u.ageing_time = ageing_time, |
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 5396ff08af32..775e00fbeb1e 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c | |||
| @@ -37,6 +37,7 @@ static inline port_id br_make_port_id(__u8 priority, __u16 port_no) | |||
| 37 | void br_init_port(struct net_bridge_port *p) | 37 | void br_init_port(struct net_bridge_port *p) |
| 38 | { | 38 | { |
| 39 | struct switchdev_attr attr = { | 39 | struct switchdev_attr attr = { |
| 40 | .orig_dev = p->dev, | ||
| 40 | .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, | 41 | .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, |
| 41 | .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP | SWITCHDEV_F_DEFER, | 42 | .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP | SWITCHDEV_F_DEFER, |
| 42 | .u.ageing_time = p->br->ageing_time, | 43 | .u.ageing_time = p->br->ageing_time, |
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 1394da63614a..66c4549efbbb 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
| @@ -73,6 +73,7 @@ static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br, | |||
| 73 | u16 vid, u16 flags) | 73 | u16 vid, u16 flags) |
| 74 | { | 74 | { |
| 75 | struct switchdev_obj_port_vlan v = { | 75 | struct switchdev_obj_port_vlan v = { |
| 76 | .obj.orig_dev = dev, | ||
| 76 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, | 77 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, |
| 77 | .flags = flags, | 78 | .flags = flags, |
| 78 | .vid_begin = vid, | 79 | .vid_begin = vid, |
| @@ -120,6 +121,7 @@ static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br, | |||
| 120 | u16 vid) | 121 | u16 vid) |
| 121 | { | 122 | { |
| 122 | struct switchdev_obj_port_vlan v = { | 123 | struct switchdev_obj_port_vlan v = { |
| 124 | .obj.orig_dev = dev, | ||
| 123 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, | 125 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, |
| 124 | .vid_begin = vid, | 126 | .vid_begin = vid, |
| 125 | .vid_end = vid, | 127 | .vid_end = vid, |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index f88a62ab019d..bca8c350e7f3 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -471,6 +471,7 @@ static ssize_t phys_switch_id_show(struct device *dev, | |||
| 471 | 471 | ||
| 472 | if (dev_isalive(netdev)) { | 472 | if (dev_isalive(netdev)) { |
| 473 | struct switchdev_attr attr = { | 473 | struct switchdev_attr attr = { |
| 474 | .orig_dev = netdev, | ||
| 474 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, | 475 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, |
| 475 | .flags = SWITCHDEV_F_NO_RECURSE, | 476 | .flags = SWITCHDEV_F_NO_RECURSE, |
| 476 | }; | 477 | }; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 34ba7a08876d..d8b0113d3eec 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1027,6 +1027,7 @@ static int rtnl_phys_switch_id_fill(struct sk_buff *skb, struct net_device *dev) | |||
| 1027 | { | 1027 | { |
| 1028 | int err; | 1028 | int err; |
| 1029 | struct switchdev_attr attr = { | 1029 | struct switchdev_attr attr = { |
| 1030 | .orig_dev = dev, | ||
| 1030 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, | 1031 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, |
| 1031 | .flags = SWITCHDEV_F_NO_RECURSE, | 1032 | .flags = SWITCHDEV_F_NO_RECURSE, |
| 1032 | }; | 1033 | }; |
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index f34e535e93bd..df790d3385a2 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
| @@ -723,6 +723,7 @@ static int switchdev_port_vlan_fill(struct sk_buff *skb, struct net_device *dev, | |||
| 723 | u32 filter_mask) | 723 | u32 filter_mask) |
| 724 | { | 724 | { |
| 725 | struct switchdev_vlan_dump dump = { | 725 | struct switchdev_vlan_dump dump = { |
| 726 | .vlan.obj.orig_dev = dev, | ||
| 726 | .vlan.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, | 727 | .vlan.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, |
| 727 | .skb = skb, | 728 | .skb = skb, |
| 728 | .filter_mask = filter_mask, | 729 | .filter_mask = filter_mask, |
| @@ -757,6 +758,7 @@ int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
| 757 | int nlflags) | 758 | int nlflags) |
| 758 | { | 759 | { |
| 759 | struct switchdev_attr attr = { | 760 | struct switchdev_attr attr = { |
| 761 | .orig_dev = dev, | ||
| 760 | .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, | 762 | .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, |
| 761 | }; | 763 | }; |
| 762 | u16 mode = BRIDGE_MODE_UNDEF; | 764 | u16 mode = BRIDGE_MODE_UNDEF; |
| @@ -778,6 +780,7 @@ static int switchdev_port_br_setflag(struct net_device *dev, | |||
| 778 | unsigned long brport_flag) | 780 | unsigned long brport_flag) |
| 779 | { | 781 | { |
| 780 | struct switchdev_attr attr = { | 782 | struct switchdev_attr attr = { |
| 783 | .orig_dev = dev, | ||
| 781 | .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, | 784 | .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, |
| 782 | }; | 785 | }; |
| 783 | u8 flag = nla_get_u8(nlattr); | 786 | u8 flag = nla_get_u8(nlattr); |
| @@ -853,6 +856,7 @@ static int switchdev_port_br_afspec(struct net_device *dev, | |||
| 853 | struct nlattr *attr; | 856 | struct nlattr *attr; |
| 854 | struct bridge_vlan_info *vinfo; | 857 | struct bridge_vlan_info *vinfo; |
| 855 | struct switchdev_obj_port_vlan vlan = { | 858 | struct switchdev_obj_port_vlan vlan = { |
| 859 | .obj.orig_dev = dev, | ||
| 856 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, | 860 | .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, |
| 857 | }; | 861 | }; |
| 858 | int rem; | 862 | int rem; |
| @@ -975,6 +979,7 @@ int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | |||
| 975 | u16 vid, u16 nlm_flags) | 979 | u16 vid, u16 nlm_flags) |
| 976 | { | 980 | { |
| 977 | struct switchdev_obj_port_fdb fdb = { | 981 | struct switchdev_obj_port_fdb fdb = { |
| 982 | .obj.orig_dev = dev, | ||
| 978 | .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, | 983 | .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, |
| 979 | .vid = vid, | 984 | .vid = vid, |
| 980 | }; | 985 | }; |
| @@ -1000,6 +1005,7 @@ int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], | |||
| 1000 | u16 vid) | 1005 | u16 vid) |
| 1001 | { | 1006 | { |
| 1002 | struct switchdev_obj_port_fdb fdb = { | 1007 | struct switchdev_obj_port_fdb fdb = { |
| 1008 | .obj.orig_dev = dev, | ||
| 1003 | .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, | 1009 | .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, |
| 1004 | .vid = vid, | 1010 | .vid = vid, |
| 1005 | }; | 1011 | }; |
| @@ -1077,6 +1083,7 @@ int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, | |||
| 1077 | struct net_device *filter_dev, int idx) | 1083 | struct net_device *filter_dev, int idx) |
| 1078 | { | 1084 | { |
| 1079 | struct switchdev_fdb_dump dump = { | 1085 | struct switchdev_fdb_dump dump = { |
| 1086 | .fdb.obj.orig_dev = dev, | ||
| 1080 | .fdb.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, | 1087 | .fdb.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, |
| 1081 | .dev = dev, | 1088 | .dev = dev, |
| 1082 | .skb = skb, | 1089 | .skb = skb, |
| @@ -1135,6 +1142,7 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi) | |||
| 1135 | if (!dev) | 1142 | if (!dev) |
| 1136 | return NULL; | 1143 | return NULL; |
| 1137 | 1144 | ||
| 1145 | attr.orig_dev = dev; | ||
| 1138 | if (switchdev_port_attr_get(dev, &attr)) | 1146 | if (switchdev_port_attr_get(dev, &attr)) |
| 1139 | return NULL; | 1147 | return NULL; |
| 1140 | 1148 | ||
| @@ -1194,6 +1202,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, | |||
| 1194 | if (!dev) | 1202 | if (!dev) |
| 1195 | return 0; | 1203 | return 0; |
| 1196 | 1204 | ||
| 1205 | ipv4_fib.obj.orig_dev = dev; | ||
| 1197 | err = switchdev_port_obj_add(dev, &ipv4_fib.obj); | 1206 | err = switchdev_port_obj_add(dev, &ipv4_fib.obj); |
| 1198 | if (!err) | 1207 | if (!err) |
| 1199 | fi->fib_flags |= RTNH_F_OFFLOAD; | 1208 | fi->fib_flags |= RTNH_F_OFFLOAD; |
| @@ -1238,6 +1247,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi, | |||
| 1238 | if (!dev) | 1247 | if (!dev) |
| 1239 | return 0; | 1248 | return 0; |
| 1240 | 1249 | ||
| 1250 | ipv4_fib.obj.orig_dev = dev; | ||
| 1241 | err = switchdev_port_obj_del(dev, &ipv4_fib.obj); | 1251 | err = switchdev_port_obj_del(dev, &ipv4_fib.obj); |
| 1242 | if (!err) | 1252 | if (!err) |
| 1243 | fi->fib_flags &= ~RTNH_F_OFFLOAD; | 1253 | fi->fib_flags &= ~RTNH_F_OFFLOAD; |
| @@ -1270,10 +1280,12 @@ static bool switchdev_port_same_parent_id(struct net_device *a, | |||
| 1270 | struct net_device *b) | 1280 | struct net_device *b) |
| 1271 | { | 1281 | { |
| 1272 | struct switchdev_attr a_attr = { | 1282 | struct switchdev_attr a_attr = { |
| 1283 | .orig_dev = a, | ||
| 1273 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, | 1284 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, |
| 1274 | .flags = SWITCHDEV_F_NO_RECURSE, | 1285 | .flags = SWITCHDEV_F_NO_RECURSE, |
| 1275 | }; | 1286 | }; |
| 1276 | struct switchdev_attr b_attr = { | 1287 | struct switchdev_attr b_attr = { |
| 1288 | .orig_dev = b, | ||
| 1277 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, | 1289 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, |
| 1278 | .flags = SWITCHDEV_F_NO_RECURSE, | 1290 | .flags = SWITCHDEV_F_NO_RECURSE, |
| 1279 | }; | 1291 | }; |
