History

openvswitch: Extend ct_state match field to 32 bits

The ct_state field was initially added as an 8-bit field, however six of the bits are already being used and use cases are already starting to appear that may push the limits of this field. This patch extends the field to 32 bits while retaining the internal representation of 8 bits. This should cover forward compatibility of the ABI for the foreseeable future. This patch also reorders the OVS_CS_F_* bits to be sequential.

Joe Stringer committed 11 years ago

Commit fbccce51 parent 6f225954 files · +11 −11Browse files

Unified · Split

4 files
  1. include/uapi/linux/openvswitch.h +4 −4
  2. net/openvswitch/conntrack.c +1 −1
  3. net/openvswitch/conntrack.h +2 −2
  4. net/openvswitch/flow_netlink.c +4 −4
include/uapi/linux/openvswitch.h+4−4
@@ -323,7 +323,7 @@ enum ovs_key_attr { · 322 unmodified lines
323323 OVS_KEY_ATTR_MPLS, /* array of struct ovs_key_mpls.
324324 * The implementation may restrict
325325 * the accepted length of the array. */
326− OVS_KEY_ATTR_CT_STATE, /* u8 bitmask of OVS_CS_F_* */
326+ OVS_KEY_ATTR_CT_STATE, /* u32 bitmask of OVS_CS_F_* */
327327 OVS_KEY_ATTR_CT_ZONE, /* u16 connection tracking zone. */
328328 OVS_KEY_ATTR_CT_MARK, /* u32 connection tracking mark */
329329 OVS_KEY_ATTR_CT_LABELS, /* 16-octet connection tracking label */
@@ -449,9 +449,9 @@ struct ovs_key_ct_labels { · 119 unmodified lines
449449 #define OVS_CS_F_ESTABLISHED 0x02 /* Part of an existing connection. */
450450 #define OVS_CS_F_RELATED 0x04 /* Related to an established
451451 * connection. */
452−#define OVS_CS_F_INVALID 0x20 /* Could not track connection. */
453−#define OVS_CS_F_REPLY_DIR 0x40 /* Flow is in the reply direction. */
454−#define OVS_CS_F_TRACKED 0x80 /* Conntrack has occurred. */
452+#define OVS_CS_F_REPLY_DIR 0x08 /* Flow is in the reply direction. */
453+#define OVS_CS_F_INVALID 0x10 /* Could not track connection. */
454+#define OVS_CS_F_TRACKED 0x20 /* Conntrack has occurred. */
455455
456456 /**
457457 * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands.
net/openvswitch/conntrack.c+1−1
@@ -167,7 +167,7 @@ void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key) · 166 unmodified lines
167167
168168 int ovs_ct_put_key(const struct sw_flow_key *key, struct sk_buff *skb)
169169 {
170− if (nla_put_u8(skb, OVS_KEY_ATTR_CT_STATE, key->ct.state))
170+ if (nla_put_u32(skb, OVS_KEY_ATTR_CT_STATE, key->ct.state))
171171 return -EMSGSIZE;
172172
173173 if (IS_ENABLED(CONFIG_NF_CONNTRACK_ZONES) &&
net/openvswitch/conntrack.h+2−2
@@ -35,7 +35,7 @@ void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key); · 34 unmodified lines
3535 int ovs_ct_put_key(const struct sw_flow_key *key, struct sk_buff *skb);
3636 void ovs_ct_free_action(const struct nlattr *a);
3737
38−static inline bool ovs_ct_state_supported(u8 state)
38+static inline bool ovs_ct_state_supported(u32 state)
3939 {
4040 return !(state & ~(OVS_CS_F_NEW | OVS_CS_F_ESTABLISHED |
4141 OVS_CS_F_RELATED | OVS_CS_F_REPLY_DIR |
@@ -53,7 +53,7 @@ static inline bool ovs_ct_verify(struct net *net, int attr) · 11 unmodified lines
5353 return false;
5454 }
5555
56−static inline bool ovs_ct_state_supported(u8 state)
56+static inline bool ovs_ct_state_supported(u32 state)
5757 {
5858 return false;
5959 }
net/openvswitch/flow_netlink.c+4−4
@@ -291,7 +291,7 @@ size_t ovs_key_attr_size(void) · 290 unmodified lines
291291 + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */
292292 + nla_total_size(4) /* OVS_KEY_ATTR_DP_HASH */
293293 + 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 */
295295 + nla_total_size(2) /* OVS_KEY_ATTR_CT_ZONE */
296296 + nla_total_size(4) /* OVS_KEY_ATTR_CT_MARK */
297297 + nla_total_size(16) /* OVS_KEY_ATTR_CT_LABELS */
@@ -349,7 +349,7 @@ static const struct ovs_len_tbl ovs_key_lens[OVS_KEY_ATTR_MAX + 1] = { · 51 unmodified lines
349349 [OVS_KEY_ATTR_TUNNEL] = { .len = OVS_ATTR_NESTED,
350350 .next = ovs_tunnel_key_lens, },
351351 [OVS_KEY_ATTR_MPLS] = { .len = sizeof(struct ovs_key_mpls) },
352− [OVS_KEY_ATTR_CT_STATE] = { .len = sizeof(u8) },
352+ [OVS_KEY_ATTR_CT_STATE] = { .len = sizeof(u32) },
353353 [OVS_KEY_ATTR_CT_ZONE] = { .len = sizeof(u16) },
354354 [OVS_KEY_ATTR_CT_MARK] = { .len = sizeof(u32) },
355355 [OVS_KEY_ATTR_CT_LABELS] = { .len = sizeof(struct ovs_key_ct_labels) },
@@ -814,10 +814,10 @@ static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match, · 458 unmodified lines
814814
815815 if (*attrs & (1 << OVS_KEY_ATTR_CT_STATE) &&
816816 ovs_ct_verify(net, OVS_KEY_ATTR_CT_STATE)) {
817− u8 ct_state = nla_get_u8(a[OVS_KEY_ATTR_CT_STATE]);
817+ u32 ct_state = nla_get_u32(a[OVS_KEY_ATTR_CT_STATE]);
818818
819819 if (!is_mask && !ovs_ct_state_supported(ct_state)) {
820− OVS_NLERR(log, "ct_state flags %02x unsupported",
820+ OVS_NLERR(log, "ct_state flags %08x unsupported",
821821 ct_state);
822822 return -EINVAL;
823823 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t