aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/switchdev.h2
-rw-r--r--net/bridge/br_fdb.c1
-rw-r--r--net/bridge/br_stp.c2
-rw-r--r--net/bridge/br_stp_if.c1
-rw-r--r--net/bridge/br_vlan.c2
-rw-r--r--net/core/net-sysfs.c1
-rw-r--r--net/core/rtnetlink.c1
-rw-r--r--net/switchdev/switchdev.c12
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
52struct switchdev_attr { 52struct 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
70struct switchdev_obj { 71struct 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)
40void br_set_state(struct net_bridge_port *p, unsigned int state) 40void 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)
570int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) 571int 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)
37void br_init_port(struct net_bridge_port *p) 37void 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 };