Looks Good. Ethan
On Mon, Jun 6, 2011 at 14:28, Ben Pfaff <b...@nicira.com> wrote: > This makes it possible to add flows that match on the Ethernet multicast > bit with ovs-ofctl. > > CC: Paul Ingram <p...@nicira.com> > CC: Amar Padmanabhan <a...@nicira.com> > --- > lib/ofp-parse.c | 27 ++++++++++++++++++++++++--- > tests/ovs-ofctl.at | 8 ++++++++ > utilities/ovs-ofctl.8.in | 20 ++++++++++++++++++++ > 3 files changed, 52 insertions(+), 3 deletions(-) > > diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c > index 5e488a6..3f3ce62 100644 > --- a/lib/ofp-parse.c > +++ b/lib/ofp-parse.c > @@ -84,6 +84,27 @@ str_to_mac(const char *str, uint8_t mac[6]) > } > > static void > +str_to_eth_dst(const char *str, > + uint8_t mac[ETH_ADDR_LEN], uint8_t mask[ETH_ADDR_LEN]) > +{ > + if (sscanf(str, ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT, > + ETH_ADDR_SCAN_ARGS(mac), ETH_ADDR_SCAN_ARGS(mask)) > + == ETH_ADDR_SCAN_COUNT * 2) { > + if (!flow_wildcards_is_dl_dst_mask_valid(mask)) { > + ovs_fatal(0, "%s: invalid Ethernet destination mask (only " > + "00:00:00:00:00:00, 01:00:00:00:00:00, " > + "fe:ff:ff:ff:ff:ff, and ff:ff:ff:ff:ff:ff are > allowed)", > + str); > + } > + } else if (sscanf(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac)) > + == ETH_ADDR_SCAN_COUNT) { > + memset(mask, 0xff, ETH_ADDR_LEN); > + } else { > + ovs_fatal(0, "invalid mac address %s", str); > + } > +} > + > +static void > str_to_ip(const char *str_, ovs_be32 *ip, ovs_be32 *maskp) > { > char *str = xstrdup(str_); > @@ -592,7 +613,7 @@ static void > parse_field_value(struct cls_rule *rule, enum field_index index, > const char *value) > { > - uint8_t mac[ETH_ADDR_LEN]; > + uint8_t mac[ETH_ADDR_LEN], mac_mask[ETH_ADDR_LEN]; > ovs_be64 tun_id, tun_mask; > ovs_be32 ip, mask; > struct in6_addr ipv6, ipv6_mask; > @@ -625,8 +646,8 @@ parse_field_value(struct cls_rule *rule, enum field_index > index, > break; > > case F_DL_DST: > - str_to_mac(value, mac); > - cls_rule_set_dl_dst(rule, mac); > + str_to_eth_dst(value, mac, mac_mask); > + cls_rule_set_dl_dst_masked(rule, mac, mac_mask); > break; > > case F_DL_TYPE: > diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at > index 6d636c1..a7d3b84 100644 > --- a/tests/ovs-ofctl.at > +++ b/tests/ovs-ofctl.at > @@ -62,6 +62,10 @@ actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note > tun_id=0x1234,cookie=0x5678,actions=flood > actions=drop > tun_id=0x1234000056780000/0xffff0000ffff0000,actions=drop > +dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,actions=drop > +dl_dst=00:00:00:00:00:00/01:00:00:00:00:00,actions=drop > +dl_dst=aa:bb:cc:dd:ee:ff/fe:ff:ff:ff:ff:ff,actions=drop > +dl_dst=aa:bb:cc:dd:ee:ff/00:00:00:00:00:00,actions=drop > ]) > AT_CHECK([ovs-ofctl -F nxm parse-flows flows.txt], [0], [stdout]) > AT_CHECK([[sed 's/ (xid=0x[0-9a-fA-F]*)//' stdout]], [0], [dnl > @@ -86,6 +90,10 @@ NXT_FLOW_MOD: ADD > actions=note:41.42.43.00.00.00,note:00.01.02.03.04.05.06.07.00 > NXT_FLOW_MOD: ADD tun_id=0x1234 cookie:0x5678 actions=FLOOD > NXT_FLOW_MOD: ADD actions=drop > NXT_FLOW_MOD: ADD tun_id=0x1234000056780000/0xffff0000ffff0000 actions=drop > +NXT_FLOW_MOD: ADD dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=drop > +NXT_FLOW_MOD: ADD dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=drop > +NXT_FLOW_MOD: ADD dl_dst=aa:bb:cc:dd:ee:ff/fe:ff:ff:ff:ff:ff actions=drop > +NXT_FLOW_MOD: ADD actions=drop > ]) > AT_CLEANUP > > diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in > index 06d61de..dd51227 100644 > --- a/utilities/ovs-ofctl.8.in > +++ b/utilities/ovs-ofctl.8.in > @@ -291,6 +291,26 @@ Matches an Ethernet source (or destination) address > specified as 6 > pairs of hexadecimal digits delimited by colons > (e.g. \fB00:0A:E4:25:6B:B0\fR). > . > +.IP > \fBdl_dst=\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB/\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fB:\fIxx\fR > +Matches an Ethernet destination address specified as 6 pairs of > +hexadecimal digits delimited by colons (e.g. \fB00:0A:E4:25:6B:B0\fR), > +with a wildcard mask following the slash. Only > +the following masks are allowed: > +.RS > +.IP \fB01:00:00:00:00:00\fR > +Match only the multicast bit. Thus, > +\fBdl_dst=01:00:00:00:00:00/01:00:00:00:00:00\fR matches all multicast > +(including broadcast) Ethernet packets, and > +\fBdl_dst=00:00:00:00:00:00/01:00:00:00:00:00\fR matches all unicast > +Ethernet packets. > +.IP \fBfe:ff:ff:ff:ff:ff\fR > +Match all bits except the multicast bit. This is probably not useful. > +.IP \fBff:ff:ff:ff:ff:ff\fR > +Exact match (equivalent to omitting the mask). > +.IP \fB00:00:00:00:00:00\fR > +Wildcard all bits (equivalent to \fBdl_dst=*\fR.) > +.RE > +. > .IP \fBdl_type=\fIethertype\fR > Matches Ethernet protocol type \fIethertype\fR, which is specified as an > integer between 0 and 65535, inclusive, either in decimal or as a > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev