X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-parse.c;h=73c3ebc4bab661873a244aee78c10a5a39685366;hb=16472256190e083258bfcf6a4ba4f74cb412fcd4;hp=e77453e06b11f7ecbb365509c0f1b856734fc5d1;hpb=d31f1109f10e5ffb9bf266306b913ebf23781666;p=openvswitch diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index e77453e0..73c3ebc4 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -43,7 +43,7 @@ str_to_u32(const char *str) char *tail; uint32_t value; - if (!str) { + if (!str[0]) { ovs_fatal(0, "missing required numeric argument"); } @@ -61,6 +61,10 @@ str_to_u64(const char *str) char *tail; uint64_t value; + if (!str[0]) { + ovs_fatal(0, "missing required numeric argument"); + } + errno = 0; value = strtoull(str, &tail, 0); if (errno == EINVAL || errno == ERANGE || *tail) { @@ -271,6 +275,7 @@ str_to_action(char *str, struct ofpbuf *b) pos = str; n_actions = 0; for (;;) { + char empty_string[] = ""; char *act, *arg; size_t actlen; uint16_t port; @@ -320,7 +325,7 @@ str_to_action(char *str, struct ofpbuf *b) pos = arg + arglen; } else { /* There might be no argument at all. */ - arg = NULL; + arg = empty_string; pos = act + actlen + (act[actlen] != '\0'); } act[actlen] = '\0'; @@ -410,7 +415,7 @@ str_to_action(char *str, struct ofpbuf *b) nan->subtype = htons(NXAST_NOTE); b->size -= sizeof nan->note; - while (arg && *arg != '\0') { + while (*arg != '\0') { uint8_t byte; bool ok; @@ -472,7 +477,7 @@ str_to_action(char *str, struct ofpbuf *b) /* Unless a numeric argument is specified, we send the whole * packet to the controller. */ - if (arg && (strspn(arg, "0123456789") == strlen(arg))) { + if (arg[0] && (strspn(arg, "0123456789") == strlen(arg))) { oao->max_len = htons(str_to_u32(arg)); } else { oao->max_len = htons(UINT16_MAX); @@ -540,7 +545,10 @@ parse_protocol(const char *name, const struct protocol **p_out) FIELD(F_ARP_SHA, "arp_sha", FWW_ARP_SHA) \ FIELD(F_ARP_THA, "arp_tha", FWW_ARP_THA) \ FIELD(F_IPV6_SRC, "ipv6_src", 0) \ - FIELD(F_IPV6_DST, "ipv6_dst", 0) + FIELD(F_IPV6_DST, "ipv6_dst", 0) \ + FIELD(F_ND_TARGET, "nd_target", FWW_ND_TARGET) \ + FIELD(F_ND_SLL, "nd_sll", FWW_ARP_SHA) \ + FIELD(F_ND_TLL, "nd_tll", FWW_ARP_THA) enum field_index { #define FIELD(ENUM, NAME, WILDCARD) ENUM, @@ -677,6 +685,21 @@ parse_field_value(struct cls_rule *rule, enum field_index index, cls_rule_set_ipv6_dst_masked(rule, &ipv6, &ipv6_mask); break; + case F_ND_TARGET: + str_to_ipv6(value, &ipv6, NULL); + cls_rule_set_nd_target(rule, ipv6); + break; + + case F_ND_SLL: + str_to_mac(value, mac); + cls_rule_set_arp_sha(rule, mac); + break; + + case F_ND_TLL: + str_to_mac(value, mac); + cls_rule_set_arp_tha(rule, mac); + break; + case N_FIELDS: NOT_REACHED(); } @@ -891,4 +914,3 @@ parse_ofp_flow_stats_request_str(struct flow_stats_request *fsr, fsr->out_port = fm.out_port; fsr->table_id = table_id; } -