.. | .. |
---|
933 | 933 | struct sw_flow_mask mask; |
---|
934 | 934 | struct sk_buff *reply; |
---|
935 | 935 | struct datapath *dp; |
---|
| 936 | + struct sw_flow_key *key; |
---|
936 | 937 | struct sw_flow_actions *acts; |
---|
937 | 938 | struct sw_flow_match match; |
---|
938 | 939 | u32 ufid_flags = ovs_nla_get_ufid_flags(a[OVS_FLOW_ATTR_UFID_FLAGS]); |
---|
.. | .. |
---|
960 | 961 | } |
---|
961 | 962 | |
---|
962 | 963 | /* Extract key. */ |
---|
963 | | - ovs_match_init(&match, &new_flow->key, false, &mask); |
---|
| 964 | + key = kzalloc(sizeof(*key), GFP_KERNEL); |
---|
| 965 | + if (!key) { |
---|
| 966 | + error = -ENOMEM; |
---|
| 967 | + goto err_kfree_flow; |
---|
| 968 | + } |
---|
| 969 | + |
---|
| 970 | + ovs_match_init(&match, key, false, &mask); |
---|
964 | 971 | error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], |
---|
965 | 972 | a[OVS_FLOW_ATTR_MASK], log); |
---|
966 | 973 | if (error) |
---|
967 | | - goto err_kfree_flow; |
---|
| 974 | + goto err_kfree_key; |
---|
| 975 | + |
---|
| 976 | + ovs_flow_mask_key(&new_flow->key, key, true, &mask); |
---|
968 | 977 | |
---|
969 | 978 | /* Extract flow identifier. */ |
---|
970 | 979 | error = ovs_nla_get_identifier(&new_flow->id, a[OVS_FLOW_ATTR_UFID], |
---|
971 | | - &new_flow->key, log); |
---|
| 980 | + key, log); |
---|
972 | 981 | if (error) |
---|
973 | | - goto err_kfree_flow; |
---|
974 | | - |
---|
975 | | - /* unmasked key is needed to match when ufid is not used. */ |
---|
976 | | - if (ovs_identifier_is_key(&new_flow->id)) |
---|
977 | | - match.key = new_flow->id.unmasked_key; |
---|
978 | | - |
---|
979 | | - ovs_flow_mask_key(&new_flow->key, &new_flow->key, true, &mask); |
---|
| 982 | + goto err_kfree_key; |
---|
980 | 983 | |
---|
981 | 984 | /* Validate actions. */ |
---|
982 | 985 | error = ovs_nla_copy_actions(net, a[OVS_FLOW_ATTR_ACTIONS], |
---|
983 | 986 | &new_flow->key, &acts, log); |
---|
984 | 987 | if (error) { |
---|
985 | 988 | OVS_NLERR(log, "Flow actions may not be safe on all matching packets."); |
---|
986 | | - goto err_kfree_flow; |
---|
| 989 | + goto err_kfree_key; |
---|
987 | 990 | } |
---|
988 | 991 | |
---|
989 | 992 | reply = ovs_flow_cmd_alloc_info(acts, &new_flow->id, info, false, |
---|
.. | .. |
---|
1004 | 1007 | if (ovs_identifier_is_ufid(&new_flow->id)) |
---|
1005 | 1008 | flow = ovs_flow_tbl_lookup_ufid(&dp->table, &new_flow->id); |
---|
1006 | 1009 | if (!flow) |
---|
1007 | | - flow = ovs_flow_tbl_lookup(&dp->table, &new_flow->key); |
---|
| 1010 | + flow = ovs_flow_tbl_lookup(&dp->table, key); |
---|
1008 | 1011 | if (likely(!flow)) { |
---|
1009 | 1012 | rcu_assign_pointer(new_flow->sf_acts, acts); |
---|
1010 | 1013 | |
---|
.. | .. |
---|
1074 | 1077 | |
---|
1075 | 1078 | if (reply) |
---|
1076 | 1079 | ovs_notify(&dp_flow_genl_family, reply, info); |
---|
| 1080 | + |
---|
| 1081 | + kfree(key); |
---|
1077 | 1082 | return 0; |
---|
1078 | 1083 | |
---|
1079 | 1084 | err_unlock_ovs: |
---|
.. | .. |
---|
1081 | 1086 | kfree_skb(reply); |
---|
1082 | 1087 | err_kfree_acts: |
---|
1083 | 1088 | ovs_nla_free_flow_actions(acts); |
---|
| 1089 | +err_kfree_key: |
---|
| 1090 | + kfree(key); |
---|
1084 | 1091 | err_kfree_flow: |
---|
1085 | 1092 | ovs_flow_free(new_flow, false); |
---|
1086 | 1093 | error: |
---|