@@ -947,6 +947,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
947947 struct sw_flow_mask mask ;
948948 struct sk_buff * reply ;
949949 struct datapath * dp ;
950+ struct sw_flow_key * key ;
950951 struct sw_flow_actions * acts ;
951952 struct sw_flow_match match ;
952953 u32 ufid_flags = ovs_nla_get_ufid_flags (a [OVS_FLOW_ATTR_UFID_FLAGS ]);
@@ -974,24 +975,26 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
974975 }
975976
976977 /* Extract key. */
977- ovs_match_init (& match , & new_flow -> key , false, & mask );
978+ key = kzalloc (sizeof (* key ), GFP_KERNEL );
979+ if (!key ) {
980+ error = - ENOMEM ;
981+ goto err_kfree_key ;
982+ }
983+
984+ ovs_match_init (& match , key , false, & mask );
978985 error = ovs_nla_get_match (net , & match , a [OVS_FLOW_ATTR_KEY ],
979986 a [OVS_FLOW_ATTR_MASK ], log );
980987 if (error )
981988 goto err_kfree_flow ;
982989
990+ ovs_flow_mask_key (& new_flow -> key , key , true, & mask );
991+
983992 /* Extract flow identifier. */
984993 error = ovs_nla_get_identifier (& new_flow -> id , a [OVS_FLOW_ATTR_UFID ],
985- & new_flow -> key , log );
994+ key , log );
986995 if (error )
987996 goto err_kfree_flow ;
988997
989- /* unmasked key is needed to match when ufid is not used. */
990- if (ovs_identifier_is_key (& new_flow -> id ))
991- match .key = new_flow -> id .unmasked_key ;
992-
993- ovs_flow_mask_key (& new_flow -> key , & new_flow -> key , true, & mask );
994-
995998 /* Validate actions. */
996999 error = ovs_nla_copy_actions (net , a [OVS_FLOW_ATTR_ACTIONS ],
9971000 & new_flow -> key , & acts , log );
@@ -1018,7 +1021,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
10181021 if (ovs_identifier_is_ufid (& new_flow -> id ))
10191022 flow = ovs_flow_tbl_lookup_ufid (& dp -> table , & new_flow -> id );
10201023 if (!flow )
1021- flow = ovs_flow_tbl_lookup (& dp -> table , & new_flow -> key );
1024+ flow = ovs_flow_tbl_lookup (& dp -> table , key );
10221025 if (likely (!flow )) {
10231026 rcu_assign_pointer (new_flow -> sf_acts , acts );
10241027
@@ -1088,6 +1091,8 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
10881091
10891092 if (reply )
10901093 ovs_notify (& dp_flow_genl_family , reply , info );
1094+
1095+ kfree (key );
10911096 return 0 ;
10921097
10931098err_unlock_ovs :
@@ -1097,6 +1102,8 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
10971102 ovs_nla_free_flow_actions (acts );
10981103err_kfree_flow :
10991104 ovs_flow_free (new_flow , false);
1105+ err_kfree_key :
1106+ kfree (key );
11001107error :
11011108 return error ;
11021109}
@@ -1614,7 +1621,8 @@ static void ovs_dp_reset_user_features(struct sk_buff *skb,
16141621 if (IS_ERR (dp ))
16151622 return ;
16161623
1617- WARN (dp -> user_features , "Dropping previously announced user features\n" );
1624+ pr_warn ("%s: Dropping previously announced user features\n" ,
1625+ ovs_dp_name (dp ));
16181626 dp -> user_features = 0 ;
16191627}
16201628
0 commit comments