aboutsummaryrefslogtreecommitdiffstats
path: root/net/openvswitch/flow_netlink.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-10-20 09:08:27 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-20 09:08:27 -0400
commit26440c835f8b1a491e2704118ac55bf87334366c (patch)
tree3c2d23b59fd49b252fdbf6c09efc41b354933fc6 /net/openvswitch/flow_netlink.c
parent371f1c7e0d854796adc622cc3bacfcc5fc638db1 (diff)
parent1099f86044111e9a7807f09523e42d4c9d0fb781 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/usb/asix_common.c net/ipv4/inet_connection_sock.c net/switchdev/switchdev.c In the inet_connection_sock.c case the request socket hashing scheme is completely different in net-next. The other two conflicts were overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch/flow_netlink.c')
-rw-r--r--net/openvswitch/flow_netlink.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
index 77850f177a47..6799c8d470c6 100644
--- a/net/openvswitch/flow_netlink.c
+++ b/net/openvswitch/flow_netlink.c
@@ -291,10 +291,10 @@ size_t ovs_key_attr_size(void)
291 + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */ 291 + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */
292 + nla_total_size(4) /* OVS_KEY_ATTR_DP_HASH */ 292 + nla_total_size(4) /* OVS_KEY_ATTR_DP_HASH */
293 + nla_total_size(4) /* OVS_KEY_ATTR_RECIRC_ID */ 293 + nla_total_size(4) /* OVS_KEY_ATTR_RECIRC_ID */
294 + nla_total_size(1) /* OVS_KEY_ATTR_CT_STATE */ 294 + nla_total_size(4) /* OVS_KEY_ATTR_CT_STATE */
295 + nla_total_size(2) /* OVS_KEY_ATTR_CT_ZONE */ 295 + nla_total_size(2) /* OVS_KEY_ATTR_CT_ZONE */
296 + nla_total_size(4) /* OVS_KEY_ATTR_CT_MARK */ 296 + nla_total_size(4) /* OVS_KEY_ATTR_CT_MARK */
297 + nla_total_size(16) /* OVS_KEY_ATTR_CT_LABEL */ 297 + nla_total_size(16) /* OVS_KEY_ATTR_CT_LABELS */
298 + nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */ 298 + nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */
299 + nla_total_size(2) /* OVS_KEY_ATTR_ETHERTYPE */ 299 + nla_total_size(2) /* OVS_KEY_ATTR_ETHERTYPE */
300 + nla_total_size(4) /* OVS_KEY_ATTR_VLAN */ 300 + nla_total_size(4) /* OVS_KEY_ATTR_VLAN */
@@ -351,10 +351,10 @@ static const struct ovs_len_tbl ovs_key_lens[OVS_KEY_ATTR_MAX + 1] = {
351 [OVS_KEY_ATTR_TUNNEL] = { .len = OVS_ATTR_NESTED, 351 [OVS_KEY_ATTR_TUNNEL] = { .len = OVS_ATTR_NESTED,
352 .next = ovs_tunnel_key_lens, }, 352 .next = ovs_tunnel_key_lens, },
353 [OVS_KEY_ATTR_MPLS] = { .len = sizeof(struct ovs_key_mpls) }, 353 [OVS_KEY_ATTR_MPLS] = { .len = sizeof(struct ovs_key_mpls) },
354 [OVS_KEY_ATTR_CT_STATE] = { .len = sizeof(u8) }, 354 [OVS_KEY_ATTR_CT_STATE] = { .len = sizeof(u32) },
355 [OVS_KEY_ATTR_CT_ZONE] = { .len = sizeof(u16) }, 355 [OVS_KEY_ATTR_CT_ZONE] = { .len = sizeof(u16) },
356 [OVS_KEY_ATTR_CT_MARK] = { .len = sizeof(u32) }, 356 [OVS_KEY_ATTR_CT_MARK] = { .len = sizeof(u32) },
357 [OVS_KEY_ATTR_CT_LABEL] = { .len = sizeof(struct ovs_key_ct_label) }, 357 [OVS_KEY_ATTR_CT_LABELS] = { .len = sizeof(struct ovs_key_ct_labels) },
358}; 358};
359 359
360static bool check_attr_len(unsigned int attr_len, unsigned int expected_len) 360static bool check_attr_len(unsigned int attr_len, unsigned int expected_len)
@@ -864,7 +864,13 @@ static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match,
864 864
865 if (*attrs & (1 << OVS_KEY_ATTR_CT_STATE) && 865 if (*attrs & (1 << OVS_KEY_ATTR_CT_STATE) &&
866 ovs_ct_verify(net, OVS_KEY_ATTR_CT_STATE)) { 866 ovs_ct_verify(net, OVS_KEY_ATTR_CT_STATE)) {
867 u8 ct_state = nla_get_u8(a[OVS_KEY_ATTR_CT_STATE]); 867 u32 ct_state = nla_get_u32(a[OVS_KEY_ATTR_CT_STATE]);
868
869 if (!is_mask && !ovs_ct_state_supported(ct_state)) {
870 OVS_NLERR(log, "ct_state flags %08x unsupported",
871 ct_state);
872 return -EINVAL;
873 }
868 874
869 SW_FLOW_KEY_PUT(match, ct.state, ct_state, is_mask); 875 SW_FLOW_KEY_PUT(match, ct.state, ct_state, is_mask);
870 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_STATE); 876 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_STATE);
@@ -883,14 +889,14 @@ static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match,
883 SW_FLOW_KEY_PUT(match, ct.mark, mark, is_mask); 889 SW_FLOW_KEY_PUT(match, ct.mark, mark, is_mask);
884 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_MARK); 890 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_MARK);
885 } 891 }
886 if (*attrs & (1 << OVS_KEY_ATTR_CT_LABEL) && 892 if (*attrs & (1 << OVS_KEY_ATTR_CT_LABELS) &&
887 ovs_ct_verify(net, OVS_KEY_ATTR_CT_LABEL)) { 893 ovs_ct_verify(net, OVS_KEY_ATTR_CT_LABELS)) {
888 const struct ovs_key_ct_label *cl; 894 const struct ovs_key_ct_labels *cl;
889 895
890 cl = nla_data(a[OVS_KEY_ATTR_CT_LABEL]); 896 cl = nla_data(a[OVS_KEY_ATTR_CT_LABELS]);
891 SW_FLOW_KEY_MEMCPY(match, ct.label, cl->ct_label, 897 SW_FLOW_KEY_MEMCPY(match, ct.labels, cl->ct_labels,
892 sizeof(*cl), is_mask); 898 sizeof(*cl), is_mask);
893 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_LABEL); 899 *attrs &= ~(1ULL << OVS_KEY_ATTR_CT_LABELS);
894 } 900 }
895 return 0; 901 return 0;
896} 902}
@@ -2025,7 +2031,7 @@ static int validate_set(const struct nlattr *a,
2025 case OVS_KEY_ATTR_PRIORITY: 2031 case OVS_KEY_ATTR_PRIORITY:
2026 case OVS_KEY_ATTR_SKB_MARK: 2032 case OVS_KEY_ATTR_SKB_MARK:
2027 case OVS_KEY_ATTR_CT_MARK: 2033 case OVS_KEY_ATTR_CT_MARK:
2028 case OVS_KEY_ATTR_CT_LABEL: 2034 case OVS_KEY_ATTR_CT_LABELS:
2029 case OVS_KEY_ATTR_ETHERNET: 2035 case OVS_KEY_ATTR_ETHERNET:
2030 break; 2036 break;
2031 2037