On Tue, May 22, 2012 at 07:36:32PM +0200, [email protected] wrote:
> Attached MPLS and VLAN QinQ patch after rebasing to following commit
>
> commit 046f1f89e6d7716581de207dd0c54421926bc25b
> Author: Ethan Jackson <[email protected]<mailto:[email protected]>>
> Date: Mon May 21 13:20:18 2012 -0700
Here's some initial feedback for stuff I noticed in reading roughly
half of the MPLS patch. I'll send more later, but this should be
enough to get you going.
High-level comments
-------------------
OF1.3 adds the ability to match on the MPLS "BOS" bit. Should we add
that here too?
It occurs to me that we could drop the NXAST_SET_MPLS_LABEL and
NXAST_SET_MPLS_TC actions because these can be implemented through
"register load" actions. OpenFlow 1.2 also dropped the similar OFPAT_
actions, for the same reason, so maybe we shouldn't bother with NXAST_
actions for them as they don't have any additional benefit for
OpenFlow 1.0 with Nicira extensions.
I didn't read the datapath code.
include/linux/openvswitch.h
---------------------------
I'd indent the comments for the last three the same as for the first
three, below:
+ OVS_ACTION_ATTR_PUSH_MPLS, /* be16, ethertype */
+ OVS_ACTION_ATTR_POP_MPLS, /* be16, ethertype */
+ OVS_ACTION_ATTR_SET_MPLS_LSE, /* be32, mpls label stack entry */
+ OVS_ACTION_ATTR_DEC_MPLS_TTL, /* No argument */
+ OVS_ACTION_ATTR_COPY_TTL_OUT, /* No argument */
+ OVS_ACTION_ATTR_COPY_TTL_IN, /* No argument */
include/openflow/nicira-ext.h
-----------------------------
The comments should be slightly more explicit, e.g. change
ovs_be32 mpls_label; /* MPLS label */
to
ovs_be32 mpls_label; /* MPLS label in low 20 bits. */
and similarly for mpls_tc.
lib/flow.c
----------
Stray space here:
parse_remaining_mpls (struct ofpbuf *b)
and here:
parse_mpls (struct ofpbuf *b, struct flow *flow)
In parse_remaining_mpls(), this:
if (!(ntohl(flow->mpls_lse) & MPLS_STACK_MASK)) {
is better written as:
if (!(flow->mpls_lse & htonl(MPLS_STACK_MASK))) {
In parse_remaining_mpls() and parse_mpls(), there's an odd "+
sizeof(ovs_be16)" that I don't see any reason for. I think you must
have just copied that from parse_vlan(). It's in parse_vlan() because
the VLAN TCI must be followed by at least 16 bits (the Ethertype). I
don't think there's the same requirement following an MPLS header, so
I'd be inclined to drop it.
I think that you can greatly simplify parse_remaining_mpls() to just
this (not tested):
while (b->size >= sizeof(struct mpls_hdr)) {
struct mpls_hdr *mh = ofpbuf_pull(b, sizeof *mh);
if (mh->mpls_lse & htonl(MPLS_STACK_MASK)) {
break;
}
}
I don't think we should consider the MPLS label in
flow_hash_symmetric_l4(), because there's no assurance that the MPLS
labels would be the same in both directions. (Bruce Davie tells me
that in fact that's unlikely.)
The comment on flow_set_mpls_label() seems incomplete (it ends with a
colon).
lib/flow.h
----------
The comment should end with a period and a space:
ovs_be32 mpls_lse; /* MPLS label stack entry*/
lib/meta-flow.h
---------------
Please add mpls_label and mpls_tc to the list of exceptions in the
large comment inside struct mf_field.
lib/odp-util.c
--------------
In format_odp_action(), a few bits of code seem bigger than necessary, e.g.:
+ case OVS_ACTION_ATTR_PUSH_MPLS:
+ push_ethertype = nl_attr_get_be16(a);
+ ds_put_cstr(ds, "push_mpls(");
+ ds_put_format(ds, "eth_type=0x%04"PRIx16"", ntohs(push_ethertype));
+ ds_put_char(ds, ')');
+ break;
could be written as a single call to ds_put_format(), and that's what
I'd do. Similarly for OVS_ACTION_ATTR_POP_MPLS.
In parse_odp_action(), you write:
+ int etype = ETH_TYPE_MPLS;
in two places, but in each case the ETH_TYPE_MPLS value is always
overwritten, so I'd drop the initializers.
It looks to me that the changes to parse_8021q_onward() and
odp_flow_key_to_flow() are the same and that they could be integrated
into parse_l3_onward() to avoid code duplication.
In commit_mpls_push_action() and commit_mpls_pop_action(), I'm
surprised that we can possibly log errors at this late stage.
Shouldn't we catch these errors earlier?
lib/ofp-parse.c
---------------
In parse_named_action(), you can use the autogenerated action-specific
functions to put actions, instead of the generic ofputil_put_action(),
e.g. for OFPUTIL_NXAST_COPY_TTL_OUT, use
ofputil_put_NXAST_COPY_TTL_OUT(). Please follow the pattern in the
existing cases.
lib/packets.h
-------------
Drop the VLAN-related changes in this patch, please.
mpls_lse_to_stack() can be more simply written as:
return (mpls_lse & htonl(MPLS_STACK_MASK)) != 0;
tests/odp.at
------------
You should add tests for parsing and formatting the mpls keys and
actions here, following the existing pattern.
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev