1 | /*************************************** 2 | $Revision: 1.6 $ 3 | 4 | IP handling (ip). iproutines.h - header file for conversions routines. 5 | defines data structures for IP module. 6 | 7 | Status: NOT REVUED, TESTED 8 | 9 | Design and implementation by: Marek Bukowy 10 | 11 | ******************/ /****************** 12 | Copyright (c) 1999 RIPE NCC 13 | 14 | All Rights Reserved 15 | 16 | Permission to use, copy, modify, and distribute this software and its 17 | documentation for any purpose and without fee is hereby granted, 18 | provided that the above copyright notice appear in all copies and that 19 | both that copyright notice and this permission notice appear in 20 | supporting documentation, and that the name of the author not be 21 | used in advertising or publicity pertaining to distribution of the 22 | software without specific, written prior permission. 23 | 24 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 25 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 26 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 27 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 28 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 29 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 30 | ***************************************/ 31 | 32 | 33 | #ifndef _IP_H 34 | #define _IP_H 35 | 36 | #include <glib.h> 37 | #include <erroutines.h> 38 | 39 | /*+ the space type +*/ 40 | typedef enum { 41 | IP_V4 = 1, 42 | IP_V6, 43 | } ip_space_t; 44 | 45 | /*+ address structure +*/ 46 | typedef struct { 47 | unsigned int words[4]; /*+ 32/128 bit ip addr. SUBJECT TO CHANGE +*/ 48 | char space; /*+ char is shorter than ip_space_t but still compatible +*/ 49 | } ip_addr_t; 50 | 51 | /*+ prefix structure +*/ 52 | typedef struct { 53 | unsigned bits; /*+ length in bits. +*/ 54 | ip_addr_t ip; /*+ the IP of the prefix +*/ 55 | } ip_prefix_t; 56 | 57 | /*+ range structure +*/ 58 | typedef struct { 59 | ip_addr_t begin; /*+ IP where the range begins. +*/ 60 | ip_addr_t end; /*+ IP where it ends +*/ 61 | } ip_range_t; 62 | 63 | /*+ 64 | stores size/span of an allocation 65 | SUBJECT TO CHANGE: will be bigger for IPv6 66 | +*/ 67 | typedef unsigned int ip_rangesize_t; 68 | 69 | /*+ the length of a string that should be able to hold a prefix / range 70 | when used with b2a functions. 71 | +*/ 72 | #define IP_ADDRSTR_MAX 20 /* XXX watch out for IPv6 !! */ 73 | #define IP_PREFSTR_MAX 24 74 | #define IP_RANGSTR_MAX 48 75 | 76 | /*+ 77 | IP expansion mode - for use with t2b functions, they control 78 | whether the input is supposed to be fully expanded or contain shortcuts 79 | (eg. enabling saying 0/0 instead 0.0.0.0/0) 80 | +*/ 81 | typedef enum { 82 | IP_PLAIN = 1, 83 | IP_EXPN 84 | } ip_exp_t; 85 | 86 | /* prototypes */ 87 | 88 | er_ret_t IP_addr_t2b(ip_addr_t *ipptr, char *addr, ip_exp_t expf); 89 | er_ret_t IP_pref_t2b(ip_prefix_t *prefptr, char *prefstr, ip_exp_t expf); 90 | er_ret_t IP_rang_t2b(ip_range_t *rangptr, char *rangstr, ip_exp_t expf); 91 | 92 | /* convenience (or call it backward compatibility) macros */ 93 | 94 | #define IP_addr_e2b(a,b) IP_addr_t2b(a,b,IP_PLAIN) 95 | #define IP_pref_e2b(a,b) IP_pref_t2b(a,b,IP_PLAIN) 96 | #define IP_rang_e2b(a,b) IP_rang_t2b(a,b,IP_PLAIN) 97 | 98 | #define IP_addr_a2b(a,b) IP_addr_t2b(a,b,IP_EXPN) 99 | #define IP_pref_a2b(a,b) IP_pref_t2b(a,b,IP_EXPN) 100 | #define IP_rang_a2b(a,b) IP_rang_t2b(a,b,IP_EXPN) 101 | 102 | er_ret_t IP_addr_b2a(ip_addr_t *binaddr, char *ascaddr, int strmax ); 103 | er_ret_t IP_pref_b2a(ip_prefix_t *prefptr, char *ascaddr, int strmax); 104 | er_ret_t IP_rang_b2a(ip_range_t *rangptr, char *ascaddr, int strmax); 105 | 106 | int IP_addr_bit_get(ip_addr_t *binaddr, int bitnum); 107 | void IP_addr_bit_set(ip_addr_t *binaddr, int bitnum, int bitval); 108 | int IP_addr_cmp(ip_addr_t *ptra, ip_addr_t *ptrb, int len); 109 | int IP_sizebits(ip_space_t spc_id); 110 | void IP_pref_bit_fix( ip_prefix_t *prefix ); 111 | 112 | er_ret_t IP_smart_conv(char *key, int justcheck, int encomp, 113 | GList **preflist, ip_exp_t expf); 114 | 115 | ip_rangesize_t IP_rang_span( ip_range_t *rangptr ); 116 | 117 | /* 118 | this is to define a constant struct for comparisons. 119 | */ 120 | #ifdef IP_IMPL 121 | const ip_addr_t IP_ADDR_UNSPEC={{0,0,0,0},0}; /* unlikely to be real :-) 122 | as there is no space 0 123 | and natural state after 124 | initializing to 0 */ 125 | #else 126 | extern ip_addr_t IP_ADDR_UNSPEC; 127 | #endif 128 | 129 | #endif /* _IP_H */