diff options
Diffstat (limited to 'net/openvswitch/datapath.c')
-rw-r--r-- | net/openvswitch/datapath.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 72e63726efa0..ec0f8d9cee73 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -599,8 +599,8 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) | |||
599 | if (IS_ERR(flow)) | 599 | if (IS_ERR(flow)) |
600 | goto err_kfree_skb; | 600 | goto err_kfree_skb; |
601 | 601 | ||
602 | err = ovs_flow_key_extract_userspace(a[OVS_PACKET_ATTR_KEY], packet, | 602 | err = ovs_flow_key_extract_userspace(net, a[OVS_PACKET_ATTR_KEY], |
603 | &flow->key, log); | 603 | packet, &flow->key, log); |
604 | if (err) | 604 | if (err) |
605 | goto err_flow_free; | 605 | goto err_flow_free; |
606 | 606 | ||
@@ -947,7 +947,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
947 | 947 | ||
948 | /* Extract key. */ | 948 | /* Extract key. */ |
949 | ovs_match_init(&match, &key, &mask); | 949 | ovs_match_init(&match, &key, &mask); |
950 | error = ovs_nla_get_match(&match, a[OVS_FLOW_ATTR_KEY], | 950 | error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], |
951 | a[OVS_FLOW_ATTR_MASK], log); | 951 | a[OVS_FLOW_ATTR_MASK], log); |
952 | if (error) | 952 | if (error) |
953 | goto err_kfree_flow; | 953 | goto err_kfree_flow; |
@@ -1118,7 +1118,7 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1118 | 1118 | ||
1119 | ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log); | 1119 | ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log); |
1120 | ovs_match_init(&match, &key, &mask); | 1120 | ovs_match_init(&match, &key, &mask); |
1121 | error = ovs_nla_get_match(&match, a[OVS_FLOW_ATTR_KEY], | 1121 | error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], |
1122 | a[OVS_FLOW_ATTR_MASK], log); | 1122 | a[OVS_FLOW_ATTR_MASK], log); |
1123 | if (error) | 1123 | if (error) |
1124 | goto error; | 1124 | goto error; |
@@ -1208,6 +1208,7 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info) | |||
1208 | { | 1208 | { |
1209 | struct nlattr **a = info->attrs; | 1209 | struct nlattr **a = info->attrs; |
1210 | struct ovs_header *ovs_header = info->userhdr; | 1210 | struct ovs_header *ovs_header = info->userhdr; |
1211 | struct net *net = sock_net(skb->sk); | ||
1211 | struct sw_flow_key key; | 1212 | struct sw_flow_key key; |
1212 | struct sk_buff *reply; | 1213 | struct sk_buff *reply; |
1213 | struct sw_flow *flow; | 1214 | struct sw_flow *flow; |
@@ -1222,7 +1223,7 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info) | |||
1222 | ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log); | 1223 | ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log); |
1223 | if (a[OVS_FLOW_ATTR_KEY]) { | 1224 | if (a[OVS_FLOW_ATTR_KEY]) { |
1224 | ovs_match_init(&match, &key, NULL); | 1225 | ovs_match_init(&match, &key, NULL); |
1225 | err = ovs_nla_get_match(&match, a[OVS_FLOW_ATTR_KEY], NULL, | 1226 | err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], NULL, |
1226 | log); | 1227 | log); |
1227 | } else if (!ufid_present) { | 1228 | } else if (!ufid_present) { |
1228 | OVS_NLERR(log, | 1229 | OVS_NLERR(log, |
@@ -1266,6 +1267,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
1266 | { | 1267 | { |
1267 | struct nlattr **a = info->attrs; | 1268 | struct nlattr **a = info->attrs; |
1268 | struct ovs_header *ovs_header = info->userhdr; | 1269 | struct ovs_header *ovs_header = info->userhdr; |
1270 | struct net *net = sock_net(skb->sk); | ||
1269 | struct sw_flow_key key; | 1271 | struct sw_flow_key key; |
1270 | struct sk_buff *reply; | 1272 | struct sk_buff *reply; |
1271 | struct sw_flow *flow = NULL; | 1273 | struct sw_flow *flow = NULL; |
@@ -1280,8 +1282,8 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
1280 | ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log); | 1282 | ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log); |
1281 | if (a[OVS_FLOW_ATTR_KEY]) { | 1283 | if (a[OVS_FLOW_ATTR_KEY]) { |
1282 | ovs_match_init(&match, &key, NULL); | 1284 | ovs_match_init(&match, &key, NULL); |
1283 | err = ovs_nla_get_match(&match, a[OVS_FLOW_ATTR_KEY], NULL, | 1285 | err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], |
1284 | log); | 1286 | NULL, log); |
1285 | if (unlikely(err)) | 1287 | if (unlikely(err)) |
1286 | return err; | 1288 | return err; |
1287 | } | 1289 | } |
@@ -2237,6 +2239,7 @@ static int __net_init ovs_init_net(struct net *net) | |||
2237 | 2239 | ||
2238 | INIT_LIST_HEAD(&ovs_net->dps); | 2240 | INIT_LIST_HEAD(&ovs_net->dps); |
2239 | INIT_WORK(&ovs_net->dp_notify_work, ovs_dp_notify_wq); | 2241 | INIT_WORK(&ovs_net->dp_notify_work, ovs_dp_notify_wq); |
2242 | ovs_ct_init(net); | ||
2240 | return 0; | 2243 | return 0; |
2241 | } | 2244 | } |
2242 | 2245 | ||
@@ -2271,6 +2274,7 @@ static void __net_exit ovs_exit_net(struct net *dnet) | |||
2271 | struct net *net; | 2274 | struct net *net; |
2272 | LIST_HEAD(head); | 2275 | LIST_HEAD(head); |
2273 | 2276 | ||
2277 | ovs_ct_exit(dnet); | ||
2274 | ovs_lock(); | 2278 | ovs_lock(); |
2275 | list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) | 2279 | list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) |
2276 | __dp_destroy(dp); | 2280 | __dp_destroy(dp); |