From: vivek Date: Mon, 15 May 2017 05:19:43 +0000 (-0700) Subject: lib: Define generic IP address structure X-Git-Tag: reindent-master-before~23^2~1^2~7 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=482c0fb076b00a588f856a79d2c43b418ce23c57;p=mirror%2Ffrr.git lib: Define generic IP address structure Define an IP address structure which is a union of an IPv4 and IPv6 address. This is for subsequent use in EVPN. Signed-off-by: Vivek Venkatraman Reviewed-by: Donald Sharp --- diff --git a/lib/Makefile.am b/lib/Makefile.am index aa65f17ee3..3e32199866 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -83,6 +83,7 @@ pkginclude_HEADERS = \ vrf_int.h \ vlan.h \ vxlan.h \ + ipaddr.h \ # end noinst_HEADERS = \ diff --git a/lib/ipaddr.h b/lib/ipaddr.h new file mode 100644 index 0000000000..3425d73fd8 --- /dev/null +++ b/lib/ipaddr.h @@ -0,0 +1,94 @@ +/* + * IP address structure (for generic IPv4 or IPv6 address) + * Copyright (C) 2016, 2017 Cumulus Networks, Inc. + * + * This file is part of FRR. + * + * FRR is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * FRR is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FRR; see the file COPYING. If not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef __IPADDR_H__ +#define __IPADDR_H__ + +#include + +/* + * Generic IP address - union of IPv4 and IPv6 address. + */ +enum ipaddr_type_t +{ + IPADDR_NONE = 0, + IPADDR_V4 = 1, /* IPv4 */ + IPADDR_V6 = 2, /* IPv6 */ +}; + +typedef struct ipaddr +{ + enum ipaddr_type_t ipa_type; + union + { + u_char addr; + struct in_addr _v4_addr; + struct in6_addr _v6_addr; + } ip; +#define ipaddr_v4 ip._v4_addr +#define ipaddr_v6 ip._v6_addr +} ipaddr_t; + +#define IS_IPADDR_NONE(p) ((p)->ipa_type == IPADDR_NONE) +#define IS_IPADDR_V4(p) ((p)->ipa_type == IPADDR_V4) +#define IS_IPADDR_V6(p) ((p)->ipa_type == IPADDR_V6) + +#define SET_IPADDR_V4(p) (p)->ipa_type = IPADDR_V4 +#define SET_IPADDR_V6(p) (p)->ipa_type = IPADDR_V6 + +static inline int +str2ipaddr (const char *str, ipaddr_t *ip) +{ + int ret; + + memset (ip, 0, sizeof (ipaddr_t)); + + ret = inet_pton (AF_INET, str, &ip->ipaddr_v4); + if (ret > 0) /* Valid IPv4 address. */ + { + ip->ipa_type = IPADDR_V4; + return 0; + } + ret = inet_pton (AF_INET6, str, &ip->ipaddr_v6); + if (ret > 0) /* Valid IPv6 address. */ + { + ip->ipa_type = IPADDR_V6; + return 0; + } + + return -1; +} + +static inline char * +ipaddr2str (ipaddr_t *ip, char *buf, int size) +{ + buf[0] = '\0'; + if (ip) + { + if (IS_IPADDR_V4(ip)) + inet_ntop (AF_INET, &ip->ip.addr, buf, size); + else if (IS_IPADDR_V6(ip)) + inet_ntop (AF_INET6, &ip->ip.addr, buf, size); + } + return buf; +} +#endif /* __IPADDR_H__ */