diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2014-05-18 11:42:26 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2014-05-18 11:42:26 +0200 |
commit | 05476c4d04a24bdb26fa64e05ab31bc36118f34e (patch) | |
tree | e775f059cfb4bb027c444bb53eb9356e643082c8 /sysdep/unix/unix.h | |
parent | 1149aa977d906a6400f998d5f6600871584395d0 (diff) |
IPv4/IPv6 integrated socket code.
Diffstat (limited to 'sysdep/unix/unix.h')
-rw-r--r-- | sysdep/unix/unix.h | 75 |
1 files changed, 61 insertions, 14 deletions
diff --git a/sysdep/unix/unix.h b/sysdep/unix/unix.h index 346adcf2..518713bc 100644 --- a/sysdep/unix/unix.h +++ b/sysdep/unix/unix.h @@ -12,6 +12,8 @@ #include <sys/socket.h> struct pool; +struct iface; +struct birdsock; /* main.c */ @@ -27,36 +29,81 @@ void cmd_shutdown(void); #define UNIX_DEFAULT_CONFIGURE_TIMEOUT 300 + /* io.c */ -volatile int async_config_flag; -volatile int async_dump_flag; -volatile int async_shutdown_flag; +#define ERR(c) do { s->err = c; return -1; } while (0) +#define ERR2(c) do { s->err = c; goto err; } while (0) +#define ERR_MSG(c) do { errno = 0; s->err = c; return -1; } while (0) + + +#define SOCKADDR_SIZE 32 + +typedef struct sockaddr_bird { + struct sockaddr sa; + char padding[SOCKADDR_SIZE - sizeof(struct sockaddr)]; +} sockaddr; + #ifdef IPV6 -#define BIRD_PF PF_INET6 #define BIRD_AF AF_INET6 -typedef struct sockaddr_in6 sockaddr; -static inline int sa_family_check(sockaddr *sa) { return sa->sin6_family == AF_INET6; } +#define _MI6(x1,x2,x3,x4) _MI(x1, x2, x3, x4) +#define ipa_is_link_local(x) ipa_has_link_scope(x) +#define ipa_from_sa(x) ipa_from_sa6(x) +#define ipa_from_u32(x) _MI6(0,0,0xffff,x) +#define ipa_to_u32(x) _I3(x) #else -#define BIRD_PF PF_INET #define BIRD_AF AF_INET -typedef struct sockaddr_in sockaddr; -static inline int sa_family_check(sockaddr *sa) { return sa->sin_family == AF_INET; } +#define _I0(X) 0 +#define _I1(X) 0 +#define _I2(X) 0 +#define _I3(X) 0 +#define _MI6(x1,x2,x3,x4) IPA_NONE +#define ipa_is_link_local(x) 0 +#define ipa_from_sa(x) ipa_from_sa4(x) #endif + +/* This is sloppy hack, it should be detected by configure script */ +/* Linux systems have it defined so this is definition for BSD systems */ +#ifndef s6_addr32 +#define s6_addr32 __u6_addr.__u6_addr32 +#endif + + +static inline ip_addr ipa_from_in4(struct in_addr a) +{ return ipa_from_u32(ntohl(a.s_addr)); } + +static inline ip_addr ipa_from_in6(struct in6_addr a) +{ return _MI6(ntohl(a.s6_addr32[0]), ntohl(a.s6_addr32[1]), ntohl(a.s6_addr32[2]), ntohl(a.s6_addr32[3])); } + +static inline ip_addr ipa_from_sa4(sockaddr *sa) +{ return ipa_from_in4(((struct sockaddr_in *) sa)->sin_addr); } + +static inline ip_addr ipa_from_sa6(sockaddr *sa) +{ return ipa_from_in6(((struct sockaddr_in6 *) sa)->sin6_addr); } + +static inline struct in_addr ipa_to_in4(ip_addr a) +{ return (struct in_addr) { htonl(ipa_to_u32(a)) }; } + +static inline struct in6_addr ipa_to_in6(ip_addr a) +{ return (struct in6_addr) { .s6_addr32 = { htonl(_I0(a)), htonl(_I1(a)), htonl(_I2(a)), htonl(_I3(a)) } }; } + +void sockaddr_fill(sockaddr *sa, int af, ip_addr a, struct iface *ifa, uint port); +int sockaddr_read(sockaddr *sa, int af, ip_addr *a, struct iface **ifa, uint *port); + + #ifndef SUN_LEN #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen ((ptr)->sun_path)) #endif -struct birdsock; -struct iface; +volatile int async_config_flag; +volatile int async_dump_flag; +volatile int async_shutdown_flag; void io_init(void); void io_loop(void); -void fill_in_sockaddr(sockaddr *sa, ip_addr a, struct iface *ifa, unsigned port); -void get_sockaddr(sockaddr *sa, ip_addr *a, struct iface **ifa, unsigned *port, int check); -void sk_open_unix(struct birdsock *s, char *name); +int sk_open_unix(struct birdsock *s, char *name); void *tracked_fopen(struct pool *, char *name, char *mode); void test_old_bird(char *path); |