#ifndef _ZEBRA_SOCKUNION_H
#define _ZEBRA_SOCKUNION_H
-#if 0
-union sockunion {
- struct sockinet {
- u_char si_len;
- u_char si_family;
- u_short si_port;
- } su_si;
- struct sockaddr_in su_sin;
- struct sockaddr_in6 su_sin6;
-};
-#define su_len su_si.si_len
-#define su_family su_si.si_family
-#define su_port su_si.si_port
-#endif /* 0 */
+#include "privs.h"
+#include "if.h"
+#ifdef __OpenBSD__
+#include <netmpls/mpls.h>
+#endif
union sockunion
{
struct sockaddr sa;
struct sockaddr_in sin;
-#ifdef HAVE_IPV6
struct sockaddr_in6 sin6;
-#endif /* HAVE_IPV6 */
+#ifdef __OpenBSD__
+ struct sockaddr_mpls smpls;
+#endif
};
enum connect_result
};
/* Default address family. */
-#ifdef HAVE_IPV6
#define AF_INET_UNION AF_INET6
-#else
-#define AF_INET_UNION AF_INET
-#endif
/* Sockunion address string length. Same as INET6_ADDRSTRLEN. */
#define SU_ADDRSTRLEN 46
#define SET_IN6_LINKLOCAL_IFINDEX(a, i)
#endif /* KAME */
-/* shortcut macro to specify address field of struct sockaddr */
-#define sock2ip(X) (((struct sockaddr_in *)(X))->sin_addr.s_addr)
-#ifdef HAVE_IPV6
-#define sock2ip6(X) (((struct sockaddr_in6 *)(X))->sin6_addr.s6_addr)
-#endif /* HAVE_IPV6 */
-
#define sockunion_family(X) (X)->sa.sa_family
-/* Prototypes. */
-int str2sockunion (const char *, union sockunion *);
-const char *sockunion2str (union sockunion *, char *, size_t);
-int sockunion_cmp (union sockunion *, union sockunion *);
-int sockunion_same (union sockunion *, union sockunion *);
-
-char *sockunion_su2str (union sockunion *su);
-union sockunion *sockunion_str2su (const char *str);
-struct in_addr sockunion_get_in_addr (union sockunion *su);
-int sockunion_accept (int sock, union sockunion *);
-int sockunion_stream_socket (union sockunion *);
-int sockopt_reuseaddr (int);
-int sockopt_reuseport (int);
-int sockunion_bind (int sock, union sockunion *, unsigned short, union sockunion *);
-int sockopt_ttl (int family, int sock, int ttl);
-int sockunion_socket (union sockunion *su);
-const char *inet_sutop (union sockunion *su, char *str);
-enum connect_result
-sockunion_connect (int fd, union sockunion *su, unsigned short port, unsigned int);
-union sockunion *sockunion_getsockname (int);
-union sockunion *sockunion_getpeername (int);
-union sockunion *sockunion_dup (union sockunion *);
-void sockunion_free (union sockunion *);
+#define sockunion2ip(X) (X)->sin.sin_addr.s_addr
-#ifndef HAVE_INET_NTOP
-const char *
-inet_ntop (int family, const void *addrptr, char *strptr, size_t len);
-#endif /* HAVE_INET_NTOP */
+/* Prototypes. */
+extern int str2sockunion (const char *, union sockunion *);
+extern const char *sockunion2str (const union sockunion *, char *, size_t);
+extern int sockunion_cmp (const union sockunion *, const union sockunion *);
+extern int sockunion_same (const union sockunion *, const union sockunion *);
+extern unsigned int sockunion_hash (const union sockunion *);
-#ifndef HAVE_INET_PTON
-int
-inet_pton (int family, const char *strptr, void *addrptr);
-#endif /* HAVE_INET_PTON */
+extern size_t family2addrsize(int family);
+extern size_t sockunion_get_addrlen(const union sockunion *);
+extern const u_char *sockunion_get_addr(const union sockunion *);
+extern void sockunion_set(union sockunion *, int family, const u_char *addr, size_t bytes);
-#ifndef HAVE_INET_ATON
-int
-inet_aton (const char *cp, struct in_addr *inaddr);
-#endif
+extern union sockunion *sockunion_str2su (const char *str);
+extern int sockunion_accept (int sock, union sockunion *);
+extern int sockunion_stream_socket (union sockunion *);
+extern int sockopt_reuseaddr (int);
+extern int sockopt_reuseport (int);
+extern int sockopt_v6only (int family, int sock);
+extern int sockunion_bind (int sock, union sockunion *,
+ unsigned short, union sockunion *);
+extern int sockopt_ttl (int family, int sock, int ttl);
+extern int sockopt_minttl (int family, int sock, int minttl);
+extern int sockopt_cork (int sock, int onoff);
+extern int sockopt_mark_default(int sock, int mark, struct zebra_privs_t *);
+extern int sockunion_socket (const union sockunion *su);
+extern const char *inet_sutop (const union sockunion *su, char *str);
+extern enum connect_result sockunion_connect (int fd, const union sockunion *su,
+ unsigned short port,
+ ifindex_t);
+extern union sockunion *sockunion_getsockname (int);
+extern union sockunion *sockunion_getpeername (int);
+extern union sockunion *sockunion_dup (const union sockunion *);
+extern void sockunion_free (union sockunion *);
+extern void sockunion_init (union sockunion *);
#endif /* _ZEBRA_SOCKUNION_H */