X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fclassifier.c;h=430c5994095d5c56d5378878b469ef7b7982810f;hb=0ff2282245a87f253843bf357988d7230139888f;hp=6d5faaabe3e58ed5e679096bc4c4f61b1873c7a9;hpb=57452fdcfb64aca9d110fca0736f6c9587d282f1;p=openvswitch diff --git a/lib/classifier.c b/lib/classifier.c index 6d5faaab..430c5994 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -390,10 +390,10 @@ cls_rule_set_ipv6_dst_masked(struct cls_rule *rule, const struct in6_addr *dst, } void -cls_rule_set_nd_target(struct cls_rule *rule, const struct in6_addr target) +cls_rule_set_nd_target(struct cls_rule *rule, const struct in6_addr *target) { rule->wc.wildcards &= ~FWW_ND_TARGET; - rule->flow.nd_target = target; + rule->flow.nd_target = *target; } /* Returns true if 'a' and 'b' have the same priority, wildcard the same @@ -421,15 +421,8 @@ format_ip_netmask(struct ds *s, const char *name, ovs_be32 ip, ovs_be32 netmask) { if (netmask) { - ds_put_format(s, "%s="IP_FMT, name, IP_ARGS(&ip)); - if (netmask != htonl(UINT32_MAX)) { - if (ip_is_cidr(netmask)) { - int wcbits = ofputil_netmask_to_wcbits(netmask); - ds_put_format(s, "/%d", 32 - wcbits); - } else { - ds_put_format(s, "/"IP_FMT, IP_ARGS(&netmask)); - } - } + ds_put_format(s, "%s=", name); + ip_format_masked(ip, netmask, s); ds_put_char(s, ','); } } @@ -441,16 +434,7 @@ format_ipv6_netmask(struct ds *s, const char *name, { if (!ipv6_mask_is_any(netmask)) { ds_put_format(s, "%s=", name); - print_ipv6_addr(s, addr); - if (!ipv6_mask_is_exact(netmask)) { - if (ipv6_is_cidr(netmask)) { - int cidr_bits = ipv6_count_cidr_bits(netmask); - ds_put_format(s, "/%d", cidr_bits); - } else { - ds_put_char(s, '/'); - print_ipv6_addr(s, netmask); - } - } + print_ipv6_masked(s, addr, netmask); ds_put_char(s, ','); } } @@ -467,6 +451,8 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s) int i; + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); + if (rule->priority != OFP_DEFAULT_PRIORITY) { ds_put_format(s, "priority=%d,", rule->priority); } @@ -592,7 +578,7 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s) } if (!skip_proto && !(w & FWW_NW_PROTO)) { if (f->dl_type == htons(ETH_TYPE_ARP)) { - ds_put_format(s, "opcode=%"PRIu8",", f->nw_proto); + ds_put_format(s, "arp_op=%"PRIu8",", f->nw_proto); } else { ds_put_format(s, "nw_proto=%"PRIu8",", f->nw_proto); } @@ -630,11 +616,11 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s) ds_put_char(s, ','); } if (!(w & FWW_ARP_SHA)) { - ds_put_format(s, "nd_sll="ETH_ADDR_FMT",", + ds_put_format(s, "nd_sll="ETH_ADDR_FMT",", ETH_ADDR_ARGS(f->arp_sha)); } if (!(w & FWW_ARP_THA)) { - ds_put_format(s, "nd_tll="ETH_ADDR_FMT",", + ds_put_format(s, "nd_tll="ETH_ADDR_FMT",", ETH_ADDR_ARGS(f->arp_tha)); } } else { @@ -1138,7 +1124,7 @@ flow_equal_except(const struct flow *a, const struct flow *b, const flow_wildcards_t wc = wildcards->wildcards; int i; - BUILD_ASSERT_DECL(FLOW_SIG_SIZE == 100 + FLOW_N_REGS * 4); + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); for (i = 0; i < FLOW_N_REGS; i++) { if ((a->regs[i] ^ b->regs[i]) & wildcards->reg_masks[i]) { @@ -1172,7 +1158,7 @@ flow_equal_except(const struct flow *a, const struct flow *b, &wildcards->ipv6_src_mask) && ipv6_equal_except(&a->ipv6_dst, &b->ipv6_dst, &wildcards->ipv6_dst_mask) - && (wc & FWW_ND_TARGET + && (wc & FWW_ND_TARGET || ipv6_addr_equals(&a->nd_target, &b->nd_target))); } @@ -1182,7 +1168,7 @@ zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards) const flow_wildcards_t wc = wildcards->wildcards; int i; - BUILD_ASSERT_DECL(FLOW_SIG_SIZE == 100 + 4 * FLOW_N_REGS); + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); for (i = 0; i < FLOW_N_REGS; i++) { flow->regs[i] &= wildcards->reg_masks[i];