You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			231 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
		
		
			
		
	
	
			231 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
|   
											2 months ago
										 | /******************************************************************************
 | ||
|  |  * 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 | ||
|  |  * | ||
|  |  * <h2><center>© COPYRIGHT(c) 2021 LandPower</center></h2> | ||
|  |  * | ||
|  |  * 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 ****************/ |