summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/prefix.h8
-rw-r--r--lib/sockunion.c33
-rw-r--r--lib/sockunion.h4
3 files changed, 41 insertions, 4 deletions
diff --git a/lib/prefix.h b/lib/prefix.h
index 1ccd4dd6..9fd02ea6 100644
--- a/lib/prefix.h
+++ b/lib/prefix.h
@@ -29,6 +29,8 @@
#define Inline static inline
#endif
+typedef const union sockunion* const_sockunion ;
+
/*
* A struct prefix contains an address family, a prefix length, and an
* address. This can represent either a 'network prefix' as defined
@@ -163,9 +165,9 @@ extern int prefix_cmp (const struct prefix *, const struct prefix *);
extern void prefix_copy (struct prefix *dest, const struct prefix *src);
extern void apply_mask (struct prefix *);
-extern struct prefix *sockunion2prefix (const union sockunion *dest,
- const union sockunion *mask);
-extern struct prefix *sockunion2hostprefix (const union sockunion *);
+extern struct prefix *sockunion2prefix (const_sockunion dest,
+ const_sockunion mask);
+extern struct prefix *sockunion2hostprefix (const_sockunion src);
extern struct prefix_ipv4 *prefix_ipv4_new (void);
extern void prefix_ipv4_free (struct prefix_ipv4 *);
diff --git a/lib/sockunion.c b/lib/sockunion.c
index 700d539f..bfcadc96 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -735,6 +735,37 @@ sockunion_free (union sockunion *su)
* Sockunion reference utilities
*/
+extern sockunion
+sockunion_new(struct prefix* p)
+{
+ sockunion nsu = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)) ;
+
+ if (p == NULL)
+ return NULL ;
+
+ switch (p->family)
+ {
+ case AF_INET:
+ nsu->sin.sin_family = AF_INET ;
+ nsu->sin.sin_port = 0 ;
+ nsu->sin.sin_addr = p->u.prefix4 ;
+ break ;
+
+#ifdef HAVE_IPV6
+ case AF_INET6:
+ nsu->sin6.sin6_family = AF_INET ;
+ nsu->sin6.sin6_port = 0 ;
+ nsu->sin6.sin6_addr = p->u.prefix6 ;
+ break ;
+#endif
+
+ default:
+ break ;
+ } ;
+
+ return nsu ;
+} ;
+
/*------------------------------------------------------------------------------
* Unset pointer to sockunion -- free any sockunion referenced
*
@@ -744,7 +775,7 @@ extern void
sockunion_unset(sockunion* p_su)
{
if (*p_su != NULL)
- XFREE(MTYPE_BGP_NOTIFY, *p_su) ; /* sets *p_su NULL */
+ XFREE(MTYPE_SOCKUNION, *p_su) ; /* sets *p_su NULL */
} ;
/*------------------------------------------------------------------------------
diff --git a/lib/sockunion.h b/lib/sockunion.h
index c00c02e4..ea76a955 100644
--- a/lib/sockunion.h
+++ b/lib/sockunion.h
@@ -25,6 +25,7 @@
#include "zebra.h"
#include "symtab.h"
+#include "prefix.h"
#if 0
union sockunion {
@@ -41,6 +42,8 @@ union sockunion {
#define su_port su_si.si_port
#endif /* 0 */
+typedef struct prefix* prefix ;
+
typedef union sockunion* sockunion ;
union sockunion
{
@@ -120,6 +123,7 @@ extern int sockunion_getpeername (int, union sockunion*);
extern union sockunion *sockunion_dup (union sockunion *);
extern void sockunion_free (union sockunion *);
+extern sockunion sockunion_new(prefix p) ;
extern void sockunion_unset(sockunion* p_su) ;
extern void sockunion_set(sockunion* p_dst, sockunion su) ;
extern void sockunion_set_dup(sockunion* p_dst, sockunion su) ;