[ovs-dev] [PATCH 1/3] ofp-parse: Add support for vlan_tci field.
Ethan Jackson
ethan at nicira.com
Thu Jun 9 00:47:43 UTC 2011
Looks Good.
Ethan
On Wed, Jun 8, 2011 at 13:41, Ben Pfaff <blp at nicira.com> wrote:
> Until now, the flow parser has supported dl_vlan and dl_vlan_pcp but not
> the fully maskable vlan_tci that NXM allows. This adds that support.
> ---
> lib/ofp-parse.c | 36 ++++++++++++++++++++++++++++++++++++
> tests/ovs-ofctl.at | 2 ++
> utilities/ovs-ofctl.8.in | 37 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 75 insertions(+), 0 deletions(-)
>
> diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
> index 3f3ce62..956f1c2 100644
> --- a/lib/ofp-parse.c
> +++ b/lib/ofp-parse.c
> @@ -184,6 +184,35 @@ error:
> }
>
> static void
> +str_to_vlan_tci(const char *str, ovs_be16 *vlan_tcip, ovs_be16 *maskp)
> +{
> + uint16_t vlan_tci, mask;
> + char *tail;
> +
> + errno = 0;
> + vlan_tci = strtol(str, &tail, 0);
> + if (errno || (*tail != '\0' && *tail != '/')) {
> + goto error;
> + }
> +
> + if (*tail == '/') {
> + mask = strtol(tail + 1, &tail, 0);
> + if (errno || *tail != '\0') {
> + goto error;
> + }
> + } else {
> + mask = UINT16_MAX;
> + }
> +
> + *vlan_tcip = htons(vlan_tci);
> + *maskp = htons(mask);
> + return;
> +
> +error:
> + ovs_fatal(0, "%s: bad syntax for vlan_tci", str);
> +}
> +
> +static void
> str_to_ipv6(const char *str_, struct in6_addr *addrp, struct in6_addr *maskp)
> {
> char *str = xstrdup(str_);
> @@ -557,6 +586,7 @@ parse_protocol(const char *name, const struct protocol **p_out)
> FIELD(F_IN_PORT, "in_port", FWW_IN_PORT) \
> FIELD(F_DL_VLAN, "dl_vlan", 0) \
> FIELD(F_DL_VLAN_PCP, "dl_vlan_pcp", 0) \
> + FIELD(F_VLAN_TCI, "vlan_tci", 0) \
> FIELD(F_DL_SRC, "dl_src", FWW_DL_SRC) \
> FIELD(F_DL_DST, "dl_dst", FWW_DL_DST | FWW_ETH_MCAST) \
> FIELD(F_DL_TYPE, "dl_type", FWW_DL_TYPE) \
> @@ -616,6 +646,7 @@ parse_field_value(struct cls_rule *rule, enum field_index index,
> uint8_t mac[ETH_ADDR_LEN], mac_mask[ETH_ADDR_LEN];
> ovs_be64 tun_id, tun_mask;
> ovs_be32 ip, mask;
> + ovs_be16 tci, tci_mask;
> struct in6_addr ipv6, ipv6_mask;
> uint16_t port_no;
>
> @@ -640,6 +671,11 @@ parse_field_value(struct cls_rule *rule, enum field_index index,
> cls_rule_set_dl_vlan_pcp(rule, str_to_u32(value));
> break;
>
> + case F_VLAN_TCI:
> + str_to_vlan_tci(value, &tci, &tci_mask);
> + cls_rule_set_dl_tci_masked(rule, tci, tci_mask);
> + break;
> +
> case F_DL_SRC:
> str_to_mac(value, mac);
> cls_rule_set_dl_src(rule, mac);
> diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
> index a7d3b84..a3a8c44 100644
> --- a/tests/ovs-ofctl.at
> +++ b/tests/ovs-ofctl.at
> @@ -121,6 +121,7 @@ actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note
> tun_id=0x1234,cookie=0x5678,actions=flood
> actions=drop
> reg0=123,actions=move:NXM_NX_REG0[0..5]->NXM_NX_REG1[26..31],load:55->NXM_NX_REG2[0..31],move:NXM_NX_REG0[0..31]->NXM_NX_TUN_ID[0..31],move:NXM_NX_REG0[0..15]->NXM_OF_VLAN_TCI[]
> +vlan_tci=0x1123/0x1fff,actions=drop
> ]])
> AT_CHECK([ovs-ofctl -F nxm -mmm parse-flows flows.txt], [0], [stdout])
> AT_CHECK([[sed 's/ (xid=0x[0-9a-fA-F]*)//' stdout]], [0],
> @@ -145,6 +146,7 @@ NXT_FLOW_MOD: ADD <any> actions=note:41.42.43.00.00.00,note:00.01.02.03.04.05.06
> NXT_FLOW_MOD: ADD NXM_NX_TUN_ID(0000000000001234) cookie:0x5678 actions=FLOOD
> NXT_FLOW_MOD: ADD <any> actions=drop
> NXT_FLOW_MOD: ADD NXM_NX_REG0(0000007b) actions=move:NXM_NX_REG0[0..5]->NXM_NX_REG1[26..31],load:0x37->NXM_NX_REG2[],move:NXM_NX_REG0[]->NXM_NX_TUN_ID[0..31],move:NXM_NX_REG0[0..15]->NXM_OF_VLAN_TCI[]
> +NXT_FLOW_MOD: ADD NXM_OF_VLAN_TCI_W(1123/1fff) actions=drop
> ]])
> AT_CLEANUP
>
> diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
> index 2e866dc..2d17d20 100644
> --- a/utilities/ovs-ofctl.8.in
> +++ b/utilities/ovs-ofctl.8.in
> @@ -428,6 +428,43 @@ Extended Match) extension to OpenFlow. When one of these is specified,
> extension. If the switch does not support NXM, then \fBovs\-ofctl\fR
> will report a fatal error.
> .
> +.IP \fBvlan_tci=\fItci\fR[\fB/\fImask\fR]
> +Matches modified VLAN TCI \fItci\fR. If \fImask\fR is omitted,
> +\fItci\fR is the exact VLAN TCI to match; if \fImask\fR is specified,
> +then a 1-bit in \fItci\fR indicates that the corresponding bit in
> +\fItci\fR must match exactly, and a 0-bit wildcards that bit. Both
> +\fItci\fR and \fImask\fR are 16-bit values that are decimal by
> +default; use a \fB0x\fR prefix to specify them in hexadecimal.
> +.
> +.IP
> +The value that \fBvlan_tci\fR matches against is 0 for a packet that
> +has no 802.1Q header. Otherwise, it is the TCI value from the 802.1Q
> +header with the CFI bit (with value \fB0x1000\fR) forced to 1.
> +.IP
> +Examples:
> +.RS
> +.IP \fBvlan_tci=0\fR
> +Match only packets without an 802.1Q header.
> +.IP \fBvlan_tci=0xf123\fR
> +Match packets tagged with priority 7 in VLAN 0x123.
> +.IP \fBvlan_tci=0x1123/0x1fff\fR
> +Match packets tagged with VLAN 0x123 (and any priority).
> +.IP \fBvlan_tci=0x5000/0xf000\fR
> +Match packets tagged with priority 2 (in any VLAN).
> +.IP \fBvlan_tci=0/0xfff\fR
> +Match packets with no 802.1Q header or tagged with VLAN 0 (and any
> +priority).
> +.IP \fBvlan_tci=0x5000/0xe000\fR
> +Match packets with no 802.1Q header or tagged with priority 2 (in any
> +VLAN).
> +.IP \fBvlan_tci=0/0xefff\fR
> +Match packets with no 802.1Q header or tagged with VLAN 0 and priority
> +0.
> +.RE
> +.IP
> +Some of these matching possibilities can also be achieved with
> +\fBdl_vlan\fR and \fBdl_vlan_pcp\fR.
> +.
> .IP \fBarp_sha=\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fR
> .IQ \fBarp_tha=\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fR
> When \fBdl_type\fR specifies ARP, \fBarp_sha\fR and \fBarp_tha\fR match
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list