X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-parse.c;h=7fed553eadc0aa8fde0e434a11c8c21f8a7918b6;hb=b46ccdf582946f30d80735345c533c23a7f035c0;hp=e30c8a91a2ea1878629265109aaf01af5184774e;hpb=53ddd40ab56b6c31a2ced6b984c33ae27f458101;p=openvswitch diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index e30c8a91..7fed553e 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,6 +128,35 @@ str_to_ip(const char *str_, ovs_be32 *ip, ovs_be32 *maskp) free(str); } +static void +str_to_tun_id(const char *str, ovs_be64 *tun_idp, ovs_be64 *maskp) +{ + uint64_t tun_id, mask; + char *tail; + + errno = 0; + tun_id = strtoull(str, &tail, 0); + if (errno || (*tail != '\0' && *tail != '/')) { + goto error; + } + + if (*tail == '/') { + mask = strtoull(tail + 1, &tail, 0); + if (errno || *tail != '\0') { + goto error; + } + } else { + mask = UINT64_MAX; + } + + *tun_idp = htonll(tun_id); + *maskp = htonll(mask); + return; + +error: + ovs_fatal(0, "%s: bad syntax for tunnel id", str); +} + static void * put_action(struct ofpbuf *b, size_t size, uint16_t type) { @@ -200,6 +229,7 @@ str_to_action(char *str, struct ofpbuf *b) char *pos; pos = str; + n_actions = 0; for (;;) { char *act, *arg; size_t actlen; @@ -414,6 +444,7 @@ str_to_action(char *str, struct ofpbuf *b) } else { ovs_fatal(0, "Unknown action: %s", act); } + n_actions++; } } @@ -446,7 +477,7 @@ parse_protocol(const char *name, const struct protocol **p_out) } #define FIELDS \ - FIELD(F_TUN_ID, "tun_id", FWW_TUN_ID) \ + FIELD(F_TUN_ID, "tun_id", 0) \ FIELD(F_IN_PORT, "in_port", FWW_IN_PORT) \ FIELD(F_DL_VLAN, "dl_vlan", 0) \ FIELD(F_DL_VLAN_PCP, "dl_vlan_pcp", 0) \ @@ -500,12 +531,14 @@ parse_field_value(struct cls_rule *rule, enum field_index index, const char *value) { uint8_t mac[ETH_ADDR_LEN]; + ovs_be64 tun_id, tun_mask; ovs_be32 ip, mask; uint16_t port_no; switch (index) { case F_TUN_ID: - cls_rule_set_tun_id(rule, htonll(str_to_u64(value))); + str_to_tun_id(value, &tun_id, &tun_mask); + cls_rule_set_tun_id_masked(rule, tun_id, tun_mask); break; case F_IN_PORT: