/****************************************************************************** * file include/sockunion.h * author YuLiang * version 1.0.0 * date 09-Oct-2021 * brief This file provides all the headers of the sockunion functions. ****************************************************************************** * Attention * *

© COPYRIGHT(c) 2021 LandPower

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of LandPower nor the names of its contributors may be used to * endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef _SOCKUNION_H_ #define _SOCKUNION_H_ /* Includes ------------------------------------------------------------------*/ /* Define --------------------------------------------------------------------*/ #define IPV4_MAX_BITLEN 32 #define IPV6_MAX_BITLEN 128 #define PNBBY 8 #define AFI_IP 1 #define AFI_IP6 2 #define AFI_MAX 3 #define SU_ADDRSTRLEN 46 /* Default address family. */ #ifdef HAVE_IPV6 #define AF_INET_UNION AF_INET6 #else #define AF_INET_UNION AF_INET #endif /* Exported types ------------------------------------------------------------*/ /* IPv4 and IPv6 unified prefix structure. */ typedef struct _prefix { uint8_t family; uint8_t prefixlen; union { uint8_t prefix; struct in_addr prefix4; #ifdef HAVE_IPV6 struct in6_addr prefix6; #endif /* HAVE_IPV6 */ struct { struct in_addr id; struct in_addr adv_router; } lp; uint8_t val[8]; } u __attribute__ ((aligned (8))); } prefix_t; /* IPv4 prefix structure. */ typedef struct _prefix_ipv4 { uint8_t family; uint8_t prefixlen; struct in_addr prefix __attribute__ ((aligned (8))); } prefix_ipv4_t; /* IPv6 prefix structure. */ #ifdef HAVE_IPV6 typedef struct _prefix_ipv6 { uint8_t family; uint8_t prefixlen; struct in6_addr prefix __attribute__ ((aligned (8))); } prefix_ipv6_t; #endif /* HAVE_IPV6 */ typedef enum { ACCESS_TYPE_STRING, ACCESS_TYPE_NUMBER } ACCESS_TYPE_E; /* Filter type is made by `permit', `deny' and `dynamic'. */ typedef enum { FILTER_DENY, FILTER_PERMIT, FILTER_DYNAMIC } FILTER_TYPE_E; /* List of access_list. */ typedef struct { struct _access_list *head; struct _access_list *tail; } access_list_list_t; /* Master structure of access_list. */ typedef struct { /* List of access_list which name is number. */ access_list_list_t num; /* List of access_list which name is string. */ access_list_list_t str; /* Hook function which is executed when new access_list is added. */ void (*add_hook)(struct _access_list *); /* Hook function which is executed when access_list is deleted. */ void (*delete_hook)(struct _access_list *); } access_master_t; typedef struct { /* Cisco access-list */ int extended; struct in_addr addr; struct in_addr addr_mask; struct in_addr mask; struct in_addr mask_mask; } filter_cisco_t; typedef struct { /* If this filter is "exact" match then this flag is set. */ int exact; /* Prefix information. */ prefix_t prefix; } filter_zebra_t; /* Filter element of access list */ typedef struct _filter { /* For doubly linked list. */ struct _filter *next; struct _filter *prev; /* Filter type information. */ FILTER_TYPE_E type; /* Cisco access-list */ int cisco; union { filter_cisco_t cfilter; filter_zebra_t zfilter; } u; } filter_t; /* Access list */ typedef struct _access_list { char *name; char *remark; access_master_t *master; ACCESS_TYPE_E type; struct _access_list *next; struct _access_list *prev; filter_t *head; filter_t *tail; } access_list_t; typedef union { struct sockaddr sa; struct sockaddr_in sin; #ifdef HAVE_IPV6 struct sockaddr_in6 sin6; #endif /* HAVE_IPV6 */ } SOCKUNION_U; /* Exported macro ------------------------------------------------------------*/ /* Extern global variables ---------------------------------------------------*/ /* Extern functions ----------------------------------------------------------*/ extern void prefix_free(prefix_t *p); extern prefix_ipv4_t *prefix_ipv4_new(void); #ifdef HAVE_IPV6 extern prefix_ipv6_t *prefix_ipv6_new(void); #endif /* HAVE_IPV6 */ extern access_list_t *access_list_lookup(uint16_t afi, const char *name); extern FILTER_TYPE_E access_list_apply(access_list_t *access, void *object); extern void masklen2ip(int masklen, struct in_addr *netmask); extern int prefix_match(const prefix_t *n, const prefix_t *p); extern int str2sockunion(const char *str, SOCKUNION_U *su); extern const char *sockunion2str(SOCKUNION_U *su, char *buf, size_t len); extern int sockunion_accept(int sock, SOCKUNION_U *su); extern int set_nonblocking(int fd); extern prefix_t *sockunion2hostprefix(const SOCKUNION_U *su); extern char *sockunion_su2str(SOCKUNION_U *su); extern int sockunion_stream_socket(SOCKUNION_U *su); extern int sockunion_reuseaddr(int sock); extern int sockunion_bind(int sock, SOCKUNION_U *su, unsigned short port, SOCKUNION_U *su_addr); extern int sockunion_ip_set(char *name, unsigned int addr); extern int sockunion_mask_set(char *name, unsigned int mask); extern int sockunion_gw_set(char *name, unsigned int gateway, unsigned int gateway_old); #endif /************************ (C) COPYRIGHT LandPower ***** END OF FILE ****************/