X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fmatch.c;h=81b717348b5305f9703920ebb06235fca14a2ce7;hb=6694e498efc445ec24ef1715ae03ebb43daa678f;hp=f5da97f542bac7b61b4d302ce93179573b0674e4;hpb=aa6c9932f2937fa9a2140ec1737668eb9105b0b5;p=openvswitch diff --git a/lib/match.c b/lib/match.c index f5da97f5..81b71734 100644 --- a/lib/match.c +++ b/lib/match.c @@ -81,12 +81,14 @@ match_wc_init(struct match *match, const struct flow *flow) memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); memset(&wc->masks.ipv6_label, 0xff, sizeof wc->masks.ipv6_label); } else if (flow->dl_type == htons(ETH_TYPE_IP) || - (flow->dl_type == htons(ETH_TYPE_ARP))) { + (flow->dl_type == htons(ETH_TYPE_ARP)) || + (flow->dl_type == htons(ETH_TYPE_RARP))) { memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); } - if (flow->dl_type == htons(ETH_TYPE_ARP)) { + if (flow->dl_type == htons(ETH_TYPE_ARP) || + flow->dl_type == htons(ETH_TYPE_RARP)) { memset(&wc->masks.arp_sha, 0xff, sizeof wc->masks.arp_sha); memset(&wc->masks.arp_tha, 0xff, sizeof wc->masks.arp_tha); } @@ -695,6 +697,8 @@ match_format(const struct match *match, struct ds *s, unsigned int priority) } } else if (f->dl_type == htons(ETH_TYPE_ARP)) { ds_put_cstr(s, "arp,"); + } else if (f->dl_type == htons(ETH_TYPE_RARP)) { + ds_put_cstr(s, "rarp,"); } else { skip_type = false; } @@ -780,18 +784,24 @@ match_format(const struct match *match, struct ds *s, unsigned int priority) ntohl(wc->masks.ipv6_label)); } } + } else if (f->dl_type == htons(ETH_TYPE_ARP) || + f->dl_type == htons(ETH_TYPE_RARP)) { + format_ip_netmask(s, "arp_spa", f->nw_src, wc->masks.nw_src); + format_ip_netmask(s, "arp_tpa", f->nw_dst, wc->masks.nw_dst); } else { format_ip_netmask(s, "nw_src", f->nw_src, wc->masks.nw_src); format_ip_netmask(s, "nw_dst", f->nw_dst, wc->masks.nw_dst); } if (!skip_proto && wc->masks.nw_proto) { - if (f->dl_type == htons(ETH_TYPE_ARP)) { + if (f->dl_type == htons(ETH_TYPE_ARP) || + f->dl_type == htons(ETH_TYPE_RARP)) { ds_put_format(s, "arp_op=%"PRIu8",", f->nw_proto); } else { ds_put_format(s, "nw_proto=%"PRIu8",", f->nw_proto); } } - if (f->dl_type == htons(ETH_TYPE_ARP)) { + if (f->dl_type == htons(ETH_TYPE_ARP) || + f->dl_type == htons(ETH_TYPE_RARP)) { format_eth_masked(s, "arp_sha", f->arp_sha, wc->masks.arp_sha); format_eth_masked(s, "arp_tha", f->arp_tha, wc->masks.arp_tha); } @@ -822,10 +832,12 @@ match_format(const struct match *match, struct ds *s, unsigned int priority) f->nw_frag & FLOW_NW_FRAG_LATER ? "later" : "not_later"); break; } - if (f->nw_proto == IPPROTO_ICMP) { + if (f->dl_type == htons(ETH_TYPE_IP) && + f->nw_proto == IPPROTO_ICMP) { format_be16_masked(s, "icmp_type", f->tp_src, wc->masks.tp_src); format_be16_masked(s, "icmp_code", f->tp_dst, wc->masks.tp_dst); - } else if (f->nw_proto == IPPROTO_ICMPV6) { + } else if (f->dl_type == htons(ETH_TYPE_IPV6) && + f->nw_proto == IPPROTO_ICMPV6) { format_be16_masked(s, "icmp_type", f->tp_src, wc->masks.tp_src); format_be16_masked(s, "icmp_code", f->tp_dst, wc->masks.tp_dst); format_ipv6_netmask(s, "nd_target", &f->nd_target,