X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fclassifier.c;h=02011e0cc01defbc7df9524dc6de1e471014165d;hb=c0896bdd20b2b4ac7f1183835e2d8c99d6bb29fe;hp=d1f9d5ddc0336a549786804226bbbe5b97237719;hpb=a877206f2f0ca10c625e311614d68a81bdc913ee;p=openvswitch diff --git a/lib/classifier.c b/lib/classifier.c index d1f9d5dd..02011e0c 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -45,7 +45,6 @@ static struct cls_rule *insert_rule(struct cls_table *, struct cls_rule *); static bool flow_equal_except(const struct flow *, const struct flow *, const struct flow_wildcards *); -static void zero_wildcards(struct flow *, const struct flow_wildcards *); /* Iterates RULE over HEAD and all of the cls_rules on HEAD->list. */ #define FOR_EACH_RULE_IN_LIST(RULE, HEAD) \ @@ -109,7 +108,7 @@ cls_rule_init_catchall(struct cls_rule *rule, unsigned int priority) void cls_rule_zero_wildcarded_fields(struct cls_rule *rule) { - zero_wildcards(&rule->flow, &rule->wc); + flow_zero_wildcards(&rule->flow, &rule->wc); } void @@ -390,10 +389,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 +420,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 +433,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, ','); } } @@ -1032,7 +1015,7 @@ find_match(const struct cls_table *table, const struct flow *flow) struct flow f; f = *flow; - zero_wildcards(&f, &table->wc); + flow_zero_wildcards(&f, &table->wc); HMAP_FOR_EACH_WITH_HASH (rule, hmap_node, flow_hash(&f, 0), &table->rules) { if (flow_equal(&f, &rule->flow)) { @@ -1177,61 +1160,3 @@ flow_equal_except(const struct flow *a, const struct flow *b, && (wc & FWW_ND_TARGET || ipv6_addr_equals(&a->nd_target, &b->nd_target))); } - -static void -zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards) -{ - const flow_wildcards_t wc = wildcards->wildcards; - int i; - - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1); - - for (i = 0; i < FLOW_N_REGS; i++) { - flow->regs[i] &= wildcards->reg_masks[i]; - } - flow->tun_id &= wildcards->tun_id_mask; - flow->nw_src &= wildcards->nw_src_mask; - flow->nw_dst &= wildcards->nw_dst_mask; - if (wc & FWW_IN_PORT) { - flow->in_port = 0; - } - flow->vlan_tci &= wildcards->vlan_tci_mask; - if (wc & FWW_DL_TYPE) { - flow->dl_type = 0; - } - if (wc & FWW_TP_SRC) { - flow->tp_src = 0; - } - if (wc & FWW_TP_DST) { - flow->tp_dst = 0; - } - if (wc & FWW_DL_SRC) { - memset(flow->dl_src, 0, sizeof flow->dl_src); - } - if (wc & FWW_DL_DST) { - flow->dl_dst[0] &= 0x01; - memset(&flow->dl_dst[1], 0, 5); - } - if (wc & FWW_ETH_MCAST) { - flow->dl_dst[0] &= 0xfe; - } - if (wc & FWW_NW_PROTO) { - flow->nw_proto = 0; - } - if (wc & FWW_NW_TOS) { - flow->nw_tos = 0; - } - if (wc & FWW_ARP_SHA) { - memset(flow->arp_sha, 0, sizeof flow->arp_sha); - } - if (wc & FWW_ARP_THA) { - memset(flow->arp_tha, 0, sizeof flow->arp_tha); - } - flow->ipv6_src = ipv6_addr_bitand(&flow->ipv6_src, - &wildcards->ipv6_src_mask); - flow->ipv6_dst = ipv6_addr_bitand(&flow->ipv6_dst, - &wildcards->ipv6_dst_mask); - if (wc & FWW_ND_TARGET) { - memset(&flow->nd_target, 0, sizeof flow->nd_target); - } -}