Thanks again Ben for the review. Please see inline <rk> -----Original Message----- From: dev-boun...@openvswitch.org [mailto:dev-boun...@openvswitch.org] On Behalf Of Ben Pfaff Sent: Friday, March 09, 2012 11:21 AM To: Kerur, Ravi Cc: dev@openvswitch.org Subject: [ovs-dev] MPLS less-important comments (was: Re: Patch for MPLS)
Here are my additional comments that point out less-important issues. include/openflow/nicira-ext.h ----------------------------- The "format' in the definition of mpls_label isn't entirely clear to me: +/* The mpls_label in MPLS shim header. + * + * Prereqs: NXM_OF_ETH_TYPE must be either 0x8847 or 0x8848. + * + * Format: 32-bit integer, higher 20 bits + * + * Masking: Not maskable. */ The "format" in OF1.2 looks clearer to me, can you use that instead? Here it is: * Format: 32-bit integer in network byte order with 12 most-significant * bits forced to 0. Only the lower 20 bits have meaning. Similarly for mpls_tc: * Format: 8-bit integer with 5 most-significant bits forced to 0. * Only the lower 3 bits have meaning. lib/flow.c ---------- parse_mpls() is unused. Please either use it or remove it. I wonder whether we really need separate L2.5 and L3 in struct ofpbuf, since if MPLS is present then we never parse past it. We could treat MPLS as L3, if that is appropriate. <rk> Traditinally MPLS is treated as a L2.5. Would like to leave it like that. This assignment is unnecessary because the top-level memset() will already have zeroed mpls_lse: } else { flow->mpls_lse = htonl(0); } <rk> Removed the code. You can drop the parentheses around the == here, and in practice we normally do: - if (eth->eth_type == htons(ETH_TYPE_VLAN)) { + if ((eth->eth_type == htons(ETH_TYPE_VLAN_8021q)) || + (eth->eth_type == htons(ETH_TYPE_VLAN_8021ad))) { <rk> Removed it. This code in flow_zero_wildcards() looks odd to me: if ((wc & FWW_MPLS_LABEL) || (wc & FWW_MPLS_TC)) { if (wc & FWW_MPLS_LABEL) { flow->mpls_lse &= ~htonl(MPLS_LABEL_MASK); } flow->mpls_lse &= ~htonl(MPLS_TTL_MASK); flow->mpls_lse &= ~htonl(MPLS_STACK_MASK); if (wc & FWW_MPLS_TC) { flow->mpls_lse &= ~htonl(MPLS_TC_MASK); } } else { flow->mpls_lse &= ~htonl(MPLS_TTL_MASK); flow->mpls_lse &= ~htonl(MPLS_STACK_MASK); } I think that you can write it as just: flow->mpls_lse &= ~htonl(MPLS_TTL_MASK | MPLS_STACK_MASK); if (wc & FWW_MPLS_LABEL) { flow->mpls_lse &= ~htonl(MPLS_LABEL_MASK); } if (wc & FWW_MPLS_TC) { flow->mpls_lse &= ~htonl(MPLS_TC_MASK); } <rk> Agreed and fixed it. lib/meta-flow.c --------------- Since each of the new fields has a width in bits less than its width in bytes, it would be good to add them to the comment titled "Size" within struct mf_field. Please fix the box. Instead of this: /* ## -- ## */ /* ## L2.5 ## */ /* ## -- ## */ write: /* ## ---- ## */ /* ## L2.5 ## */ /* ## ---- ## */ <rk> Fixed it. lib/nx-match.c -------------- I think that nx_put_match() can use mpls_lse_to_label() and mpls_lse_to_tc(). <rk> Agreed, fixed it. lib/odp-util.h -------------- I don't think that ODPUTIL_FLOW_KEY_BYTES or the comment above it needs an update, because MPLS is always the last header parsed; that is, it will never appear along with the IPv6, ICMPv6, and ND headers in the list. <rk> Agreed. It was added during debugging when things were not working. Fixed it now. In parse_odp_key_attr() the outer parentheses here are unnecessarily doubled: + if ((sscanf(s, "mpls(label=%"SCNi32",tc=%i,ttl=%i)%n", + &mpls_label, &mpls_tc, &mpls_ttl, &n) > 0 && n > 0)) { <rk> Fixed it. In parse_mpls_onward(), I think that the call to parse_l3_onward() can change to just check_expectations(), because none of the "if" statements in parse_l3_onward() will ever successfully match. <rk> Fixed it. In parse_mpls_onward(), the outer parentheses here are unnecessarily doubled: + expected_attrs |= ((UINT64_C(1) << OVS_KEY_ATTR_MPLS)); <rk> Fixed it. lib/ofp-parse.c --------------- In parse_named_action(), it would probably be a good idea to validate that the arguments to set_mpls_label, set_mpls_tc, and set_mpls_ttl are in the correct range. For push_mpls and pop_mpls, you can use str_to_u16(). lib/ofp-util.c -------------- A line is mis-indented in ofputil_normalize_rule(). <rk> Fixed it. lib/ofp-util.h -------------- The OFP_ACTION_* enum values are only used in ofproto-dpif.c, so I'd move them there. <rk> Mainly used for mpls delayed action. Removed it. lib/packets.c ------------- The comment on set_mpls_lse_ttl() is wrong. I think that the set_mpls_lse_ttl() code is only correct because MPLS_TTL_SHIFT is 0. dec_mpls_ttl() , copy_mpls_ttl_in(), and copy_mpls_ttl_out() could use mpls_lse_to_ttl(). The first and final cases in push_mpls() are identical except for the source of the TTL. I suggest using a helper function. In pop_mpls(), you can write: if ((ntohl(mh->mpls_lse) & MPLS_STACK_MASK) >> MPLS_STACK_SHIFT) { as if (mh->mpls_lse & htonl(MPLS_STACK_MASK)) <rk> Userspace code is tested now and comments incorporated. lib/packets.h ------------- Please don't use an OFP_ prefix for constants that aren't defined by OpenFlow. I don't see OFP_MPLS_ANY or OFP_MPLS_NONE in OpenFlow. I don't see any user of OFP_MPLS_ANY anywhere in the tree, either (where is it used?) If you do need them, please use #defines for these, because enum constants always have type "int" which means that these are actually negative values. <rk> Don't need them, removed. ofproto/ofproto-dpif.c ---------------------- The change to get_features() is a no-op, please drop it from the patch. I don't think the facet_account() changes actually have any visible effect. Why do all the "compose_*_mpls" functions check for null ctx or ofproto? Can either one ever happen? All of these functions are one-liners, and they only have a single caller, so I'd inline them into their caller. <rk> Mostly safer coding. Not needed now hence removed. utilities/ovs-ofctl.8.in ------------------------ I don't think the sentence that starts "If none specified" below is correct: +.IP \fBmpls_label=\fIlabel\fR +Matches MPLS Label when \fIethertype\fR is \fI0x8847\fR or \fI0x8848\fR. +Specify a number between 16 and 2^20-1, inclusive, as the 20-bit MPLS label +to match. If none specified, all packets which has \fIethertype\fR equal to +\fI0x8847\fR or \fI0x8848\fR are matched. The shorthand notation "mpls" (for dl_type=0x8847) should be mentioned in the list of shorthands. s/classe/class/ here: +Modifies the MPLS traffic-classe of a packet. <rk> I think it is true. If no label or tc is specified all packets which has ethertype=0x8847/0x8848 is matched. Thanks, Ravi Thanks, Ben. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev