diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-09-11 20:22:31 +0000 | 
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-09-12 21:39:43 +0000 | 
| commit | b0584ad3c6f76f1b3859493d3a287859d0c5284f (patch) | |
| tree | fb0cb7348d321f80aa0330de3d0256f43b0aab79 /lib/yang_wrappers.c | |
| parent | 90316c973f541412a23995894b80621a421bed33 (diff) | |
yang: add user type for ip-address
Convert ietf-inet-types:ip-address to struct ipaddr.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib/yang_wrappers.c')
| -rw-r--r-- | lib/yang_wrappers.c | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/yang_wrappers.c b/lib/yang_wrappers.c index 0558383823..cd776f333d 100644 --- a/lib/yang_wrappers.c +++ b/lib/yang_wrappers.c @@ -1000,3 +1000,56 @@ void yang_get_default_ipv6p(union prefixptr var, const char *xpath_fmt, ...)  	value = yang_get_default_value(xpath);  	yang_str2ipv6p(value, var);  } + +/* + * Derived type: ip. + */ +void yang_str2ip(const char *value, struct ipaddr *ip) +{ +	(void)str2ipaddr(value, ip); +} + +struct yang_data *yang_data_new_ip(const char *xpath, const struct ipaddr *addr) +{ +	size_t sz = IS_IPADDR_V4(addr) ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN; +	char value_str[sz]; + +	ipaddr2str(addr, value_str, sizeof(value_str)); +	return yang_data_new(xpath, value_str); +} + +void yang_dnode_get_ip(struct ipaddr *addr, const struct lyd_node *dnode, +		       const char *xpath_fmt, ...) +{ +	const struct lyd_node_leaf_list *dleaf; + +	assert(dnode); +	if (xpath_fmt) { +		va_list ap; +		char xpath[XPATH_MAXLEN]; + +		va_start(ap, xpath_fmt); +		vsnprintf(xpath, sizeof(xpath), xpath_fmt, ap); +		va_end(ap); +		dnode = yang_dnode_get(dnode, xpath); +		YANG_DNODE_GET_ASSERT(dnode, xpath); +	} + +	dleaf = (const struct lyd_node_leaf_list *)dnode; +	assert(dleaf->value_type == LY_TYPE_STRING); +	(void)str2ipaddr(dleaf->value_str, addr); +} + +void yang_get_default_ip(struct ipaddr *var, const char *xpath_fmt, ...) +{ +	char xpath[XPATH_MAXLEN]; +	const char *value; +	va_list ap; + +	va_start(ap, xpath_fmt); +	vsnprintf(xpath, sizeof(xpath), xpath_fmt, ap); +	va_end(ap); + +	value = yang_get_default_value(xpath); +	yang_str2ip(value, var); +}  | 
