[ovs-dev] [#8024v2 2/5] Don't overload IP TOS with the frag matching bits.
Justin Pettit
jpettit at nicira.com
Wed Nov 9 07:56:21 UTC 2011
On Nov 8, 2011, at 8:12 PM, Jesse Gross wrote:
> On Tue, Nov 8, 2011 at 3:57 PM, Justin Pettit <jpettit at nicira.com> wrote:
>> diff --git a/datapath/flow.h b/datapath/flow.h
>> index ba8c66a..f12b11a 100644
>> --- a/datapath/flow.h
>> +++ b/datapath/flow.h
>> @@ -147,7 +143,7 @@ u64 flow_used_time(unsigned long flow_jiffies);
>> * OVS_KEY_ATTR_ETHERNET 12 -- 4 16
>> * OVS_KEY_ATTR_8021Q 4 -- 4 8
>> * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8
>> - * OVS_KEY_ATTR_IPV6 38 2 4 44
>> + * OVS_KEY_ATTR_IPV6 39 1 4 44
>
> I think this is just a mistake since this patch has nothing IPv6
> specific in it but this list is for the userspace interface, which
> this doesn't change.
I don't understand this or your follow-up about it being incorrect before this patch. Both the IPv4 and IPv6 "ipvX_tos" fields that expand the struct size by one. Are you stating that it's inconsistent with "lib/odp-util.h"? If so, then I've updated them to be in sync.
> In userspace there's a fair amount of masking with IP_DSCP_MASK even
> though it is unnecessary because the userspace flow shouldn't contain
> the ECN bits. I'm guessing that it all gets resolved (or becomes
> necessary) in the patch where ECN support is added, so it doesn't
> really matter.
Correct. Or, at least, that's the hope. :-)
> I don't have any further comments beyond Ben's
At the end of the message, I've included an incremental that includes Ben's suggestions.
--Justin
diff --git a/datapath/flow.c b/datapath/flow.c
index 285006d..5080ee9 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -693,12 +693,12 @@ int flow_extract(struct sk_buff *skb, u16 in_port, struct
offset = nh->frag_off & htons(IP_OFFSET);
if (offset) {
- key->ip.frag |= OVS_FRAG_TYPE_LATER;
+ key->ip.frag = OVS_FRAG_TYPE_LATER;
goto out;
}
if (nh->frag_off & htons(IP_MF) ||
skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
- key->ip.frag |= OVS_FRAG_TYPE_FIRST;
+ key->ip.frag = OVS_FRAG_TYPE_FIRST;
/* Transport layer. */
if (key->ip.proto == IPPROTO_TCP) {
@@ -765,7 +765,7 @@ int flow_extract(struct sk_buff *skb, u16 in_port, struct sw
if (key->ip.frag == OVS_FRAG_TYPE_LATER)
goto out;
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
- key->ip.frag |= OVS_FRAG_TYPE_FIRST;
+ key->ip.frag = OVS_FRAG_TYPE_FIRST;
/* Transport layer. */
if (key->ip.proto == NEXTHDR_TCP) {
diff --git a/datapath/flow.h b/datapath/flow.h
index 7e3dcf9..77a955f 100644
--- a/datapath/flow.h
+++ b/datapath/flow.h
@@ -45,7 +45,7 @@ struct sw_flow_key {
struct {
u8 proto; /* IP protocol or lower 8 bits of ARP op
u8 tos; /* IP ToS DSCP in high 6 bits. */
- u8 frag; /* OVS_FRAG_TYPE_* in low 2 bits. */
+ u8 frag; /* OVS_FRAG_TYPE_* flags. */
} ip;
union {
struct {
diff --git a/lib/flow.c b/lib/flow.c
index bc53bd8..99cef1e 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -371,7 +371,7 @@ flow_extract(struct ofpbuf *packet, uint32_t priority, ovs_b
flow->tos = nh->ip_tos & IP_DSCP_MASK;
if (IP_IS_FRAGMENT(nh->ip_frag_off)) {
- flow->frag |= FLOW_FRAG_ANY;
+ flow->frag = FLOW_FRAG_ANY;
if (nh->ip_frag_off & htons(IP_FRAG_OFF_MASK)) {
flow->frag |= FLOW_FRAG_LATER;
}
diff --git a/lib/flow.h b/lib/flow.h
index 248233e..af634fb 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -71,9 +71,9 @@ struct flow {
uint8_t dl_dst[6]; /* Ethernet destination address. */
uint8_t nw_proto; /* IP protocol or low 8 bits of ARP opcode. */
uint8_t tos; /* IP ToS. */
- uint8_t frag; /* FLOW_FRAG_*. */
uint8_t arp_sha[6]; /* ARP/ND source hardware address. */
uint8_t arp_tha[6]; /* ARP/ND target hardware address. */
+ uint8_t frag; /* FLOW_FRAG_* flags. */
uint8_t reserved[7]; /* Reserved for 64-bit packing. */
};
@@ -81,8 +81,8 @@ struct flow {
* flow", followed by FLOW_PAD_SIZE bytes of padding. */
#define FLOW_SIG_SIZE (109 + FLOW_N_REGS * 4)
#define FLOW_PAD_SIZE 7
-BUILD_ASSERT_DECL(offsetof(struct flow, arp_tha) == FLOW_SIG_SIZE - 6);
-BUILD_ASSERT_DECL(sizeof(((struct flow *)0)->arp_tha) == 6);
+BUILD_ASSERT_DECL(offsetof(struct flow, frag) == FLOW_SIG_SIZE - 1);
+BUILD_ASSERT_DECL(sizeof(((struct flow *)0)->frag) == 1);
BUILD_ASSERT_DECL(sizeof(struct flow) == FLOW_SIG_SIZE + FLOW_PAD_SIZE);
/* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
diff --git a/lib/odp-util.h b/lib/odp-util.h
index 8a7fbc6..73c3362 100644
--- a/lib/odp-util.h
+++ b/lib/odp-util.h
@@ -72,7 +72,7 @@ void format_odp_actions(struct ds *, const struct nlattr *odp_
* OVS_KEY_ATTR_ETHERNET 12 -- 4 16
* OVS_KEY_ATTR_8021Q 4 -- 4 8
* OVS_KEY_ATTR_ETHERTYPE 2 2 4 8
- * OVS_KEY_ATTR_IPV6 38 2 4 44
+ * OVS_KEY_ATTR_IPV6 39 1 4 44
* OVS_KEY_ATTR_ICMPV6 2 2 4 8
* OVS_KEY_ATTR_ND 28 -- 4 32
* -------------------------------------------------
More information about the dev
mailing list