241 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
    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.
 | 
						|
 | 
						|
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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 _HAWK_SKAD_H_
 | 
						|
#define _HAWK_SKAD_H_
 | 
						|
 | 
						|
#include <hawk-cmn.h>
 | 
						|
 | 
						|
#define HAWK_SIZEOF_SKAD_T 1
 | 
						|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > HAWK_SIZEOF_SKAD_T)
 | 
						|
#	undef HAWK_SIZEOF_SKAD_T
 | 
						|
#	define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN
 | 
						|
#endif
 | 
						|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > HAWK_SIZEOF_SKAD_T)
 | 
						|
#	undef HAWK_SIZEOF_SKAD_T
 | 
						|
#	define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN6
 | 
						|
#endif
 | 
						|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > HAWK_SIZEOF_SKAD_T)
 | 
						|
#	undef HAWK_SIZEOF_SKAD_T
 | 
						|
#	define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_LL
 | 
						|
#endif
 | 
						|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_DL > HAWK_SIZEOF_SKAD_T)
 | 
						|
#	undef HAWK_SIZEOF_SKAD_T
 | 
						|
#	define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_DL
 | 
						|
#endif
 | 
						|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > HAWK_SIZEOF_SKAD_T)
 | 
						|
#	undef HAWK_SIZEOF_SKAD_T
 | 
						|
#	define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_UN
 | 
						|
#endif
 | 
						|
 | 
						|
#if (HAWK_SIZEOF_SA_FAMILY_T == 1) && !defined(HAWK_SA_FAMILY_T_IS_SIGNED)
 | 
						|
#	if !defined(HAWK_AF_UNIX)
 | 
						|
#		define HAWK_AF_UNIX (254)
 | 
						|
#	endif
 | 
						|
#elif (HAWK_SIZEOF_SA_FAMILY_T == 1) && defined(HAWK_SA_FAMILY_T_IS_SIGNED)
 | 
						|
#	if !defined(HAWK_AF_UNIX)
 | 
						|
#		define HAWK_AF_UNIX (-2)
 | 
						|
#	endif
 | 
						|
#else
 | 
						|
#	if !defined(HAWK_AF_UNIX)
 | 
						|
		/* this is a fake value */
 | 
						|
#		define HAWK_AF_UNIX (65534)
 | 
						|
#	endif
 | 
						|
#endif
 | 
						|
 | 
						|
struct hawk_skad_t
 | 
						|
{
 | 
						|
	hawk_uint8_t data[HAWK_SIZEOF_SKAD_T];
 | 
						|
};
 | 
						|
typedef struct hawk_skad_t hawk_skad_t;
 | 
						|
 | 
						|
#define HAWK_IP4AD_STRLEN (15) /* not including the terminating '\0' */
 | 
						|
#define HAWK_IP6AD_STRLEN (45) /* not including the terminating '\0'. pure IPv6 address, not including the scope(e.g. %10, %eth0) */
 | 
						|
 | 
						|
/* size large enough to hold the ip address plus port number.
 | 
						|
 * [IPV6ADDR%SCOPE]:PORT -> 9 for [] % : and PORT
 | 
						|
 * Let's reserve 16 for SCOPE and not include the terminting '\0'
 | 
						|
 */
 | 
						|
#define HAWK_SKAD_IP_STRLEN (HAWK_IP6AD_STRLEN + 25)
 | 
						|
 | 
						|
/* -------------------------------------------------------------------- */
 | 
						|
 | 
						|
#define HAWK_ETHAD_LEN (6)
 | 
						|
#define HAWK_IP4AD_LEN (4)
 | 
						|
#define HAWK_IP6AD_LEN (16)
 | 
						|
 | 
						|
#include <hawk-pac1.h>
 | 
						|
struct HAWK_PACKED hawk_ethad_t
 | 
						|
{
 | 
						|
	hawk_uint8_t v[HAWK_ETHAD_LEN];
 | 
						|
};
 | 
						|
typedef struct hawk_ethad_t hawk_ethad_t;
 | 
						|
 | 
						|
struct HAWK_PACKED hawk_ip4ad_t
 | 
						|
{
 | 
						|
	hawk_uint8_t v[HAWK_IP4AD_LEN];
 | 
						|
};
 | 
						|
typedef struct hawk_ip4ad_t hawk_ip4ad_t;
 | 
						|
 | 
						|
struct HAWK_PACKED hawk_ip6ad_t
 | 
						|
{
 | 
						|
	hawk_uint8_t v[HAWK_IP6AD_LEN];
 | 
						|
};
 | 
						|
typedef struct hawk_ip6ad_t hawk_ip6ad_t;
 | 
						|
#include <hawk-upac.h>
 | 
						|
 | 
						|
#if defined(__cplusplus)
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_skad_init_for_ip4 (
 | 
						|
	hawk_skad_t*        skad,
 | 
						|
	hawk_uint16_t       port,
 | 
						|
	hawk_ip4ad_t*       ip4ad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_skad_init_for_ip6 (
 | 
						|
	hawk_skad_t*        skad,
 | 
						|
	hawk_uint16_t       port,
 | 
						|
	hawk_ip6ad_t*       ip6ad,
 | 
						|
	int                scope_id
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_skad_init_for_ip_with_bytes (
 | 
						|
	hawk_skad_t*        skad,
 | 
						|
	hawk_uint16_t       port,
 | 
						|
	const hawk_uint8_t* bytes,
 | 
						|
	hawk_oow_t          len
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_skad_init_for_eth (
 | 
						|
	hawk_skad_t*        skad,
 | 
						|
	int                ifindex,
 | 
						|
	hawk_ethad_t*       ethad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_skad_get_family (
 | 
						|
	const hawk_skad_t* skad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_skad_get_size (
 | 
						|
	const hawk_skad_t* skad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_skad_get_port (
 | 
						|
	const hawk_skad_t* skad
 | 
						|
);
 | 
						|
 | 
						|
/* for link-level addresses */
 | 
						|
HAWK_EXPORT int hawk_skad_get_ifindex (
 | 
						|
	const hawk_skad_t* skad
 | 
						|
);
 | 
						|
 | 
						|
/* for ipv6 */
 | 
						|
HAWK_EXPORT int hawk_skad_get_scope_id (
 | 
						|
	const hawk_skad_t* skad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_skad_set_scope_id (
 | 
						|
	hawk_skad_t*       skad,
 | 
						|
	int               scope_id
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT hawk_oow_t hawk_skad_get_ipad_bytes (
 | 
						|
	hawk_skad_t*       skad,
 | 
						|
	void*              buf,
 | 
						|
	hawk_oow_t         len
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT void hawk_clear_skad (
 | 
						|
	hawk_skad_t*       skad
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_equal_skads (
 | 
						|
	const hawk_skad_t* addr1,
 | 
						|
	const hawk_skad_t* addr2,
 | 
						|
	int                strict
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT hawk_oow_t hawk_ipad_bytes_to_ucstr (
 | 
						|
	const hawk_uint8_t* iptr,
 | 
						|
	hawk_oow_t          ilen,
 | 
						|
	hawk_uch_t*         buf,
 | 
						|
	hawk_oow_t          blen
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT hawk_oow_t hawk_ipad_bytes_to_bcstr (
 | 
						|
	const hawk_uint8_t* iptr,
 | 
						|
	hawk_oow_t          ilen,
 | 
						|
	hawk_bch_t*         buf,
 | 
						|
	hawk_oow_t          blen
 | 
						|
);
 | 
						|
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_uchars_to_ipad_bytes (
 | 
						|
	const hawk_uch_t*   str,
 | 
						|
	hawk_oow_t          slen,
 | 
						|
	hawk_uint8_t*       buf,
 | 
						|
	hawk_oow_t          blen
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_bchars_to_ipad_bytes (
 | 
						|
	const hawk_bch_t*   str,
 | 
						|
	hawk_oow_t          slen,
 | 
						|
	hawk_uint8_t*       buf,
 | 
						|
	hawk_oow_t          blen
 | 
						|
);
 | 
						|
 | 
						|
#define hawk_ucstr_to_ipad_bytes(str,buf,blen) hawk_uchars_to_ipad_bytes(str, hawk_count_ucstr(str,buf,len)
 | 
						|
#define hawk_bcstr_to_ipad_bytes(str,buf,blen) hawk_bchars_to_ipad_bytes(str, hawk_count_bcstr(str,buf,len)
 | 
						|
 | 
						|
#if defined(HAWK_OOCH_IS_UCH)
 | 
						|
#	define hawk_ipad_bytes_to_oocstr hawk_ipad_bytes_to_ucstr
 | 
						|
#	define hawk_oochars_to_ipad_bytes hawk_uchars_to_ipad_bytes
 | 
						|
#	define hawk_oocstr_to_ipad_bytes hawk_ucstr_to_ipad_bytes
 | 
						|
#else
 | 
						|
#	define hawk_ipad_bytes_to_oocstr hawk_ipad_bytes_to_bcstr
 | 
						|
#	define hawk_oochars_to_ipad_bytes hawk_bchars_to_ipad_bytes
 | 
						|
#	define hawk_oocstr_to_ipad_bytes hawk_bcstr_to_ipad_bytes
 | 
						|
#endif
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_ipad_bytes_is_v4_mapped (
 | 
						|
	const hawk_uint8_t* iptr,
 | 
						|
	hawk_oow_t          ilen
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_ipad_bytes_is_loop_back (
 | 
						|
	const hawk_uint8_t* iptr,
 | 
						|
	hawk_oow_t          ilen
 | 
						|
);
 | 
						|
 | 
						|
HAWK_EXPORT int hawk_ipad_bytes_is_link_local (
 | 
						|
	const hawk_uint8_t* iptr,
 | 
						|
	hawk_oow_t          ilen
 | 
						|
);
 | 
						|
 | 
						|
#if defined(__cplusplus)
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |