X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnx-match.c;h=f66c6556a8f12de051288df332755e3d470010f3;hb=e5b2afdbde9b7d6dc8d2f1bc641b6bcd3a1c7395;hp=abc3b210a9238a0ac468e6bb40d427f65e65b7fd;hpb=685a51a5b89750cead1b2934c2079d2bb9c52a4a;p=openvswitch diff --git a/lib/nx-match.c b/lib/nx-match.c index abc3b210..f66c6556 100644 --- a/lib/nx-match.c +++ b/lib/nx-match.c @@ -78,16 +78,6 @@ static struct nxm_field nxm_fields[N_NXM_FIELDS] = { /* Hash table of 'nxm_fields'. */ static struct hmap all_nxm_fields = HMAP_INITIALIZER(&all_nxm_fields); -/* Possible masks for NXM_OF_ETH_DST_W. */ -static const uint8_t eth_all_0s[ETH_ADDR_LEN] - = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -static const uint8_t eth_all_1s[ETH_ADDR_LEN] - = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -static const uint8_t eth_mcast_1[ETH_ADDR_LEN] - = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; -static const uint8_t eth_mcast_0[ETH_ADDR_LEN] - = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff}; - static void nxm_init(void) { @@ -176,9 +166,6 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, /* Metadata. */ case NFI_NXM_OF_IN_PORT: flow->in_port = ntohs(get_unaligned_be16(value)); - if (flow->in_port == OFPP_LOCAL) { - flow->in_port = ODPP_LOCAL; - } return 0; /* Ethernet header. */ @@ -195,18 +182,8 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, if ((wc->wildcards & (FWW_DL_DST | FWW_ETH_MCAST)) != (FWW_DL_DST | FWW_ETH_MCAST)) { return NXM_DUP_TYPE; - } else if (eth_addr_equals(mask, eth_mcast_1)) { - wc->wildcards &= ~FWW_ETH_MCAST; - flow->dl_dst[0] = *(uint8_t *) value & 0x01; - } else if (eth_addr_equals(mask, eth_mcast_0)) { - wc->wildcards &= ~FWW_DL_DST; - memcpy(flow->dl_dst, value, ETH_ADDR_LEN); - flow->dl_dst[0] &= 0xfe; - } else if (eth_addr_equals(mask, eth_all_0s)) { - return 0; - } else if (eth_addr_equals(mask, eth_all_1s)) { - wc->wildcards &= ~(FWW_DL_DST | FWW_ETH_MCAST); - memcpy(flow->dl_dst, value, ETH_ADDR_LEN); + } else if (flow_wildcards_is_dl_dst_mask_valid(mask)) { + cls_rule_set_dl_dst_masked(rule, value, mask); return 0; } else { return NXM_BAD_MASK; @@ -678,20 +655,15 @@ nxm_put_eth(struct ofpbuf *b, uint32_t header, static void nxm_put_eth_dst(struct ofpbuf *b, - uint32_t wc, const uint8_t value[ETH_ADDR_LEN]) + flow_wildcards_t wc, const uint8_t value[ETH_ADDR_LEN]) { switch (wc & (FWW_DL_DST | FWW_ETH_MCAST)) { case FWW_DL_DST | FWW_ETH_MCAST: break; - case FWW_DL_DST: - nxm_put_header(b, NXM_OF_ETH_DST_W); - ofpbuf_put(b, value, ETH_ADDR_LEN); - ofpbuf_put(b, eth_mcast_1, ETH_ADDR_LEN); - break; - case FWW_ETH_MCAST: + default: nxm_put_header(b, NXM_OF_ETH_DST_W); ofpbuf_put(b, value, ETH_ADDR_LEN); - ofpbuf_put(b, eth_mcast_0, ETH_ADDR_LEN); + ofpbuf_put(b, flow_wildcards_to_dl_dst_mask(wc), ETH_ADDR_LEN); break; case 0: nxm_put_eth(b, NXM_OF_ETH_DST, value); @@ -737,9 +709,6 @@ nx_put_match(struct ofpbuf *b, const struct cls_rule *cr) /* Metadata. */ if (!(wc & FWW_IN_PORT)) { uint16_t in_port = flow->in_port; - if (in_port == ODPP_LOCAL) { - in_port = OFPP_LOCAL; - } nxm_put_16(b, NXM_OF_IN_PORT, htons(in_port)); } @@ -837,20 +806,26 @@ nx_put_match(struct ofpbuf *b, const struct cls_rule *cr) case IPPROTO_ICMPV6: if (!(wc & FWW_TP_SRC)) { nxm_put_8(b, NXM_NX_ICMPV6_TYPE, ntohs(flow->tp_src)); + + if (flow->tp_src == htons(ND_NEIGHBOR_SOLICIT) || + flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) { + if (!(wc & FWW_ND_TARGET)) { + nxm_put_ipv6(b, NXM_NX_ND_TARGET, &flow->nd_target, + &in6addr_exact); + } + if (!(wc & FWW_ARP_SHA) + && flow->tp_src == htons(ND_NEIGHBOR_SOLICIT)) { + nxm_put_eth(b, NXM_NX_ND_SLL, flow->arp_sha); + } + if (!(wc & FWW_ARP_THA) + && flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) { + nxm_put_eth(b, NXM_NX_ND_TLL, flow->arp_tha); + } + } } if (!(wc & FWW_TP_DST)) { nxm_put_8(b, NXM_NX_ICMPV6_CODE, ntohs(flow->tp_dst)); } - if (!(wc & FWW_ND_TARGET)) { - nxm_put_ipv6(b, NXM_NX_ND_TARGET, &flow->nd_target, - &in6addr_exact); - } - if (!(wc & FWW_ARP_SHA)) { - nxm_put_eth(b, NXM_NX_ND_SLL, flow->arp_sha); - } - if (!(wc & FWW_ARP_THA)) { - nxm_put_eth(b, NXM_NX_ND_TLL, flow->arp_tha); - } break; } } @@ -1270,7 +1245,7 @@ nxm_read_field(const struct nxm_field *src, const struct flow *flow) { switch (src->index) { case NFI_NXM_OF_IN_PORT: - return flow->in_port == ODPP_LOCAL ? OFPP_LOCAL : flow->in_port; + return flow->in_port; case NFI_NXM_OF_ETH_DST: return eth_addr_to_uint64(flow->dl_dst);