summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2016-11-07 16:34:33 +0200
committerIdo Barnea <ibarnea@cisco.com>2016-11-21 12:56:28 +0200
commitc39cdf89bee7999ba714eb31e8ec4bc8b5d52a60 (patch)
tree09d354ec63d1e38cb06ab157c217ad336ee70ffd
parentc9ec3b818df3dceb78c0535b6e962291d21a1619 (diff)
Added IPv6 field to yaml config
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
-rwxr-xr-xsrc/utl_yaml.cpp75
-rwxr-xr-xsrc/utl_yaml.h1
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);