diff options
author | 2016-11-07 16:34:33 +0200 | |
---|---|---|
committer | 2016-11-21 12:56:28 +0200 | |
commit | c39cdf89bee7999ba714eb31e8ec4bc8b5d52a60 (patch) | |
tree | 09d354ec63d1e38cb06ab157c217ad336ee70ffd | |
parent | c9ec3b818df3dceb78c0535b6e962291d21a1619 (diff) |
Added IPv6 field to yaml config
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
-rwxr-xr-x | src/utl_yaml.cpp | 75 | ||||
-rwxr-xr-x | src/utl_yaml.h | 1 |
2 files changed, 51 insertions, 25 deletions
diff --git a/src/utl_yaml.cpp b/src/utl_yaml.cpp index 094a3de8..a4fd6404 100755 --- a/src/utl_yaml.cpp +++ b/src/utl_yaml.cpp @@ -1,12 +1,10 @@ -#include "utl_yaml.h" -#include <common/Network/Packet/CPktCmn.h> /* Hanoh Haim Cisco Systems, Inc. */ /* -Copyright (c) 2015-2015 Cisco Systems, Inc. +Copyright (c) 2015-2016 Cisco Systems, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,13 +22,15 @@ limitations under the License. #include <istream> #include <fstream> #include "common/basic_utils.h" +#include <common/Network/Packet/CPktCmn.h> +#include "utl_yaml.h" #define INADDRSZ 4 extern int my_inet_pton4(const char *src, unsigned char *dst); extern int my_inet_pton6(const char *src, unsigned char *dst); -bool utl_yaml_read_ip_addr(const YAML::Node& node, +bool utl_yaml_read_ip_addr(const YAML::Node& node, const std::string &name, uint32_t & val){ std::string tmp; @@ -42,16 +42,14 @@ bool utl_yaml_read_ip_addr(const YAML::Node& node, val=PKT_NTOHL(ip); res=true; }else{ - printf(" ERROR not a valid ip %s \n",(char *)tmp.c_str()); + printf(" Error: non valid ip %s \n",(char *)tmp.c_str()); exit(-1); } } return (res); } - - -bool utl_yaml_read_uint32(const YAML::Node& node, +bool utl_yaml_read_uint32(const YAML::Node& node, const std::string &name, uint32_t & val){ bool res=false; @@ -62,7 +60,7 @@ bool utl_yaml_read_uint32(const YAML::Node& node, return (res); } -bool utl_yaml_read_uint16(const YAML::Node& node, +bool utl_yaml_read_uint16(const YAML::Node& node, const std::string &name, uint16_t & val){ uint32_t val_tmp; @@ -183,10 +181,10 @@ YAMLParserWrapper::parse_bool(const YAML::Node &node, const std::string &name) { return (val); } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting true/false for field '" + name + "'", node[name]); + parse_err("Expecting true/false for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); @@ -203,10 +201,10 @@ YAMLParserWrapper::parse_list(const YAML::Node &node, const std::string &name) { return val; } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting sequence/list for field '" + name + "'", node[name]); + parse_err("Expecting sequence or list for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); @@ -223,10 +221,10 @@ YAMLParserWrapper::parse_map(const YAML::Node &node, const std::string &name) { return val; } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting map for field '" + name + "'", node[name]); + parse_err("Expecting map for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); @@ -241,16 +239,43 @@ YAMLParserWrapper::parse_ip(const YAML::Node &node, const std::string &name) { node[name] >> ip_str; int rc = my_inet_pton4((char *)ip_str.c_str(), (unsigned char *)&ip_num); if (!rc) { - parse_err("invalid IP address: " + ip_str, node[name]); + parse_err("Invalid IP address: " + ip_str, node[name]); } return PKT_NTOHL(ip_num); } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting valid IP address for field '" + name + "'", node[name]); + parse_err("Expecting valid IP address for field '" + name + "'", node[name]); + + } catch (const YAML::KeyNotFound &ex) { + parse_err("Can not locate mandatory field '" + name + "'", node); + } + + assert(0); +} + +void +YAMLParserWrapper::parse_ipv6(const YAML::Node &node, const std::string &name, unsigned char *ip_num) { + try { + std::string ip_str; + + node[name] >> ip_str; + int rc = my_inet_pton6((char *)ip_str.c_str(), ip_num); + if (!rc) { + parse_err("Invalid IPv6 address: " + ip_str, node[name]); + } + + // we want host order + for (int i = 0; i < 8; i++) { + ((uint16_t *) ip_num)[i] = PKT_NTOHS(((uint16_t *) ip_num)[i]); + } + return; + + } catch (const YAML::InvalidScalar &ex) { + parse_err("Expecting valid IPv6 address for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); @@ -276,21 +301,21 @@ YAMLParserWrapper::parse_mac_addr(const YAML::Node &node, const std::string &nam node[name] >> mac_str; bool rc = mac2uint64(mac_str, mac_num); if (!rc) { - parse_err("invalid MAC address: " + mac_str, node[name]); + parse_err("Invalid MAC address: " + mac_str, node[name]); } return mac_num; } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting true/false for field '" + name + "'", node[name]); + parse_err("Expecting true/false for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); } -uint64_t +uint64_t YAMLParserWrapper::parse_uint(const YAML::Node &node, const std::string &name, uint64_t low, uint64_t high, uint64_t def) { if (!node.FindValue(name)) { return def; @@ -299,7 +324,7 @@ YAMLParserWrapper::parse_uint(const YAML::Node &node, const std::string &name, u return parse_uint(node, name, low, high); } -uint64_t +uint64_t YAMLParserWrapper::parse_uint(const YAML::Node &node, const std::string &name, uint64_t low, uint64_t high) { try { @@ -316,10 +341,10 @@ YAMLParserWrapper::parse_uint(const YAML::Node &node, const std::string &name, u return (val); } catch (const YAML::InvalidScalar &ex) { - parse_err("expecting true/false for field '" + name + "'", node[name]); + parse_err("Expecting true/false for field '" + name + "'", node[name]); } catch (const YAML::KeyNotFound &ex) { - parse_err("cannot locate mandatory field '" + name + "'", node); + parse_err("Can not locate mandatory field '" + name + "'", node); } assert(0); diff --git a/src/utl_yaml.h b/src/utl_yaml.h index ed7d66d6..004e82db 100755 --- a/src/utl_yaml.h +++ b/src/utl_yaml.h @@ -63,6 +63,7 @@ public: const YAML::Node & parse_map(const YAML::Node &node, const std::string &name); uint32_t parse_ip(const YAML::Node &node, const std::string &name); + void parse_ipv6(const YAML::Node &node, const std::string &name, unsigned char *ip); uint64_t parse_mac_addr(const YAML::Node &node, const std::string &name); uint64_t parse_mac_addr(const YAML::Node &node, const std::string &name, uint64_t def); |