00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef ip_addr_h
00036 #define ip_addr_h
00037
00038 #include <string.h>
00039 #include <sys/types.h>
00040 #include <sys/socket.h>
00041 #include <netinet/in.h>
00042 #include <netdb.h>
00043 #include "str.h"
00044
00045
00046 #include "dprint.h"
00047
00048 #define MAX_RECV_BUFFER_SIZE 256*1024
00049 #define BUFFER_INCREMENT 2048
00050
00051 enum sip_protos { PROTO_NONE, PROTO_UDP, PROTO_TCP, PROTO_TLS, PROTO_SCTP };
00052
00053
00054 struct ip_addr{
00055 unsigned int af;
00056 unsigned int len;
00057
00058
00059 union {
00060 unsigned long addrl[16/sizeof(long)];
00061 unsigned int addr32[4];
00062 unsigned short addr16[8];
00063 unsigned char addr[16];
00064 }u;
00065 };
00066
00067
00068
00069 struct net{
00070 struct ip_addr ip;
00071 struct ip_addr mask;
00072 };
00073
00074 union sockaddr_union{
00075 struct sockaddr s;
00076 struct sockaddr_in sin;
00077 #ifdef USE_IPV6
00078 struct sockaddr_in6 sin6;
00079 #endif
00080 };
00081
00082
00083
00084 enum si_flags { SI_NONE=0, SI_IS_IP=1, SI_IS_LO=2, SI_IS_MCAST=4 };
00085
00086 struct socket_info {
00087 int socket;
00088 str name;
00089 struct ip_addr address;
00090 str address_str;
00091 unsigned short port_no;
00092 str port_no_str;
00093 enum si_flags flags;
00094 union sockaddr_union su;
00095 int proto;
00096 str sock_str;
00097 struct socket_info* next;
00098 struct socket_info* prev;
00099 };
00100
00101
00102 struct receive_info {
00103 struct ip_addr src_ip;
00104 struct ip_addr dst_ip;
00105 unsigned short src_port;
00106 unsigned short dst_port;
00107 int proto;
00108 int proto_reserved1;
00109 int proto_reserved2;
00110 union sockaddr_union src_su;
00111 struct socket_info* bind_address;
00112
00113 };
00114
00115
00116 struct dest_info {
00117 int proto;
00118 int proto_reserved1;
00119 union sockaddr_union to;
00120 struct socket_info* send_sock;
00121 };
00122
00123
00124 struct socket_id {
00125 char* name;
00126 int proto;
00127 int port;
00128 struct socket_id* next;
00129 };
00130
00131
00132
00133
00134 #ifdef HAVE_SOCKADDR_SA_LEN
00135 #define sockaddru_len(su) ((su).s.sa_len)
00136 #else
00137 #ifdef USE_IPV6
00138 #define sockaddru_len(su) \
00139 (((su).s.sa_family==AF_INET6)?sizeof(struct sockaddr_in6):\
00140 sizeof(struct sockaddr_in))
00141 #else
00142 #define sockaddru_len(su) sizeof(struct sockaddr_in)
00143 #endif
00144 #endif
00145
00146
00147
00148
00149
00150 #define hostent2ip_addr(ip, he, addr_no) \
00151 do{ \
00152 (ip)->af=(he)->h_addrtype; \
00153 (ip)->len=(he)->h_length; \
00154 memcpy((ip)->u.addr, (he)->h_addr_list[(addr_no)], (ip)->len); \
00155 }while(0)
00156
00157
00158
00159
00160
00161
00162
00163 #ifdef USE_IPV6
00164 #define AF2PF(af) (((af)==AF_INET)?PF_INET:((af)==AF_INET6)?PF_INET6:(af))
00165 #else
00166 #define AF2PF(af) (((af)==AF_INET)?PF_INET:(af))
00167 #endif
00168
00169
00170
00171
00172 struct net* mk_net(struct ip_addr* ip, struct ip_addr* mask);
00173 struct net* mk_net_bitlen(struct ip_addr* ip, unsigned int bitlen);
00174
00175 void print_ip(char* prefix, struct ip_addr* ip, char* suffix);
00176 void stdout_print_ip(struct ip_addr* ip);
00177 void print_net(struct net* net);
00178
00179 #ifdef USE_MCAST
00180
00181 int is_mcast(struct ip_addr* ip);
00182 #endif
00183
00184
00185
00186 inline static int matchnet(struct ip_addr* ip, struct net* net)
00187 {
00188 unsigned int r;
00189 int ret;
00190
00191 ret=-1;
00192 if (ip->af == net->ip.af){
00193 for(r=0; r<ip->len/4; r++){
00194
00195 if ((ip->u.addr32[r]&net->mask.u.addr32[r])!=
00196 net->ip.u.addr32[r]){
00197 return 0;
00198 }
00199 }
00200 return 1;
00201 };
00202 return -1;
00203 }
00204
00205
00206
00207
00208
00209 static inline void sockaddr2ip_addr(struct ip_addr* ip, struct sockaddr* sa)
00210 {
00211 switch(sa->sa_family){
00212 case AF_INET:
00213 ip->af=AF_INET;
00214 ip->len=4;
00215 memcpy(ip->u.addr, &((struct sockaddr_in*)sa)->sin_addr, 4);
00216 break;
00217 #ifdef USE_IPV6
00218 case AF_INET6:
00219 ip->af=AF_INET6;
00220 ip->len=16;
00221 memcpy(ip->u.addr, &((struct sockaddr_in6*)sa)->sin6_addr, 16);
00222 break;
00223 #endif
00224 default:
00225 LM_CRIT("unknown address family %d\n", sa->sa_family);
00226 }
00227 }
00228
00229
00230
00231
00232 #define ip_addr_cmp(ip1, ip2) \
00233 (((ip1)->af==(ip2)->af)&& \
00234 (memcmp((ip1)->u.addr, (ip2)->u.addr, (ip1)->len)==0))
00235
00236
00237
00238
00239 static inline int su_cmp(union sockaddr_union* s1, union sockaddr_union* s2)
00240 {
00241 if (s1->s.sa_family!=s2->s.sa_family) return 0;
00242 switch(s1->s.sa_family){
00243 case AF_INET:
00244 return (s1->sin.sin_port==s2->sin.sin_port)&&
00245 (memcmp(&s1->sin.sin_addr, &s2->sin.sin_addr, 4)==0);
00246 #ifdef USE_IPV6
00247 case AF_INET6:
00248 return (s1->sin6.sin6_port==s2->sin6.sin6_port)&&
00249 (memcmp(&s1->sin6.sin6_addr, &s2->sin6.sin6_addr, 16)==0);
00250 #endif
00251 default:
00252 LM_CRIT("unknown address family %d\n",
00253 s1->s.sa_family);
00254 return 0;
00255 }
00256 }
00257
00258
00259
00260
00261 static inline unsigned short su_getport(union sockaddr_union* su)
00262 {
00263 if(su==0)
00264 return 0;
00265
00266 switch(su->s.sa_family){
00267 case AF_INET:
00268 return ntohs(su->sin.sin_port);
00269 #ifdef USE_IPV6
00270 case AF_INET6:
00271 return ntohs(su->sin6.sin6_port);
00272 #endif
00273 default:
00274 LM_CRIT("unknown address family %d\n", su->s.sa_family);
00275 return 0;
00276 }
00277 }
00278
00279
00280 static inline void su_setport(union sockaddr_union* su, unsigned short port)
00281 {
00282 switch(su->s.sa_family){
00283 case AF_INET:
00284 su->sin.sin_port=htons(port);
00285 break;
00286 #ifdef USE_IPV6
00287 case AF_INET6:
00288 su->sin6.sin6_port=htons(port);
00289 break;
00290 #endif
00291 default:
00292 LM_CRIT("unknown address family %d\n", su->s.sa_family);
00293 }
00294 }
00295
00296
00297 static inline void su2ip_addr(struct ip_addr* ip, union sockaddr_union* su)
00298 {
00299 switch(su->s.sa_family){
00300 case AF_INET:
00301 ip->af=AF_INET;
00302 ip->len=4;
00303 memcpy(ip->u.addr, &su->sin.sin_addr, 4);
00304 break;
00305 #ifdef USE_IPV6
00306 case AF_INET6:
00307 ip->af=AF_INET6;
00308 ip->len=16;
00309 memcpy(ip->u.addr, &su->sin6.sin6_addr, 16);
00310 break;
00311 #endif
00312 default:
00313 LM_CRIT("Unknown address family %d\n", su->s.sa_family);
00314 }
00315 }
00316
00317
00318
00319 #define ip_addr2su init_su
00320
00321
00322
00323
00324 static inline int init_su( union sockaddr_union* su,
00325 struct ip_addr* ip,
00326 unsigned short port )
00327 {
00328 memset(su, 0, sizeof(union sockaddr_union));
00329 su->s.sa_family=ip->af;
00330 switch(ip->af){
00331 #ifdef USE_IPV6
00332 case AF_INET6:
00333 memcpy(&su->sin6.sin6_addr, ip->u.addr, ip->len);
00334 #ifdef HAVE_SOCKADDR_SA_LEN
00335 su->sin6.sin6_len=sizeof(struct sockaddr_in6);
00336 #endif
00337 su->sin6.sin6_port=htons(port);
00338 break;
00339 #endif
00340 case AF_INET:
00341 memcpy(&su->sin.sin_addr, ip->u.addr, ip->len);
00342 #ifdef HAVE_SOCKADDR_SA_LEN
00343 su->sin.sin_len=sizeof(struct sockaddr_in);
00344 #endif
00345 su->sin.sin_port=htons(port);
00346 break;
00347 default:
00348 LM_CRIT("unknown address family %d\n", ip->af);
00349 return -1;
00350 }
00351 return 0;
00352 }
00353
00354
00355
00356
00357
00358
00359
00360 static inline int hostent2su( union sockaddr_union* su,
00361 struct hostent* he,
00362 unsigned int idx,
00363 unsigned short port )
00364 {
00365 memset(su, 0, sizeof(union sockaddr_union));
00366 su->s.sa_family=he->h_addrtype;
00367 switch(he->h_addrtype){
00368 #ifdef USE_IPV6
00369 case AF_INET6:
00370 memcpy(&su->sin6.sin6_addr, he->h_addr_list[idx], he->h_length);
00371 #ifdef HAVE_SOCKADDR_SA_LEN
00372 su->sin6.sin6_len=sizeof(struct sockaddr_in6);
00373 #endif
00374 su->sin6.sin6_port=htons(port);
00375 break;
00376 #endif
00377 case AF_INET:
00378 memcpy(&su->sin.sin_addr, he->h_addr_list[idx], he->h_length);
00379 #ifdef HAVE_SOCKADDR_SA_LEN
00380 su->sin.sin_len=sizeof(struct sockaddr_in);
00381 #endif
00382 su->sin.sin_port=htons(port);
00383 break;
00384 default:
00385 LM_CRIT("unknown address family %d\n", he->h_addrtype);
00386 return -1;
00387 }
00388 return 0;
00389 }
00390
00391
00392 #define IP_ADDR_MAX_STR_SIZE 40
00393
00394
00395
00396
00397 static inline char* ip_addr2a(struct ip_addr* ip)
00398 {
00399
00400 static char buff[IP_ADDR_MAX_STR_SIZE];
00401 int offset;
00402 register unsigned char a,b,c;
00403 #ifdef USE_IPV6
00404 register unsigned char d;
00405 register unsigned short hex4;
00406 #endif
00407 int r;
00408 #define HEXDIG(x) (((x)>=10)?(x)-10+'A':(x)+'0')
00409
00410
00411 offset=0;
00412 switch(ip->af){
00413 #ifdef USE_IPV6
00414 case AF_INET6:
00415 for(r=0;r<7;r++){
00416 hex4=ntohs(ip->u.addr16[r]);
00417 a=hex4>>12;
00418 b=(hex4>>8)&0xf;
00419 c=(hex4>>4)&0xf;
00420 d=hex4&0xf;
00421 if (a){
00422 buff[offset]=HEXDIG(a);
00423 buff[offset+1]=HEXDIG(b);
00424 buff[offset+2]=HEXDIG(c);
00425 buff[offset+3]=HEXDIG(d);
00426 buff[offset+4]=':';
00427 offset+=5;
00428 }else if(b){
00429 buff[offset]=HEXDIG(b);
00430 buff[offset+1]=HEXDIG(c);
00431 buff[offset+2]=HEXDIG(d);
00432 buff[offset+3]=':';
00433 offset+=4;
00434 }else if(c){
00435 buff[offset]=HEXDIG(c);
00436 buff[offset+1]=HEXDIG(d);
00437 buff[offset+2]=':';
00438 offset+=3;
00439 }else{
00440 buff[offset]=HEXDIG(d);
00441 buff[offset+1]=':';
00442 offset+=2;
00443 }
00444 }
00445
00446 hex4=ntohs(ip->u.addr16[r]);
00447 a=hex4>>12;
00448 b=(hex4>>8)&0xf;
00449 c=(hex4>>4)&0xf;
00450 d=hex4&0xf;
00451 if (a){
00452 buff[offset]=HEXDIG(a);
00453 buff[offset+1]=HEXDIG(b);
00454 buff[offset+2]=HEXDIG(c);
00455 buff[offset+3]=HEXDIG(d);
00456 buff[offset+4]=0;
00457 }else if(b){
00458 buff[offset]=HEXDIG(b);
00459 buff[offset+1]=HEXDIG(c);
00460 buff[offset+2]=HEXDIG(d);
00461 buff[offset+3]=0;
00462 }else if(c){
00463 buff[offset]=HEXDIG(c);
00464 buff[offset+1]=HEXDIG(d);
00465 buff[offset+2]=0;
00466 }else{
00467 buff[offset]=HEXDIG(d);
00468 buff[offset+1]=0;
00469 }
00470 break;
00471 #endif
00472 case AF_INET:
00473 for(r=0;r<3;r++){
00474 a=ip->u.addr[r]/100;
00475 c=ip->u.addr[r]%10;
00476 b=ip->u.addr[r]%100/10;
00477 if (a){
00478 buff[offset]=a+'0';
00479 buff[offset+1]=b+'0';
00480 buff[offset+2]=c+'0';
00481 buff[offset+3]='.';
00482 offset+=4;
00483 }else if (b){
00484 buff[offset]=b+'0';
00485 buff[offset+1]=c+'0';
00486 buff[offset+2]='.';
00487 offset+=3;
00488 }else{
00489 buff[offset]=c+'0';
00490 buff[offset+1]='.';
00491 offset+=2;
00492 }
00493 }
00494
00495 a=ip->u.addr[r]/100;
00496 c=ip->u.addr[r]%10;
00497 b=ip->u.addr[r]%100/10;
00498 if (a){
00499 buff[offset]=a+'0';
00500 buff[offset+1]=b+'0';
00501 buff[offset+2]=c+'0';
00502 buff[offset+3]=0;
00503 }else if (b){
00504 buff[offset]=b+'0';
00505 buff[offset+1]=c+'0';
00506 buff[offset+2]=0;
00507 }else{
00508 buff[offset]=c+'0';
00509 buff[offset+1]=0;
00510 }
00511 break;
00512
00513 default:
00514 LM_CRIT("unknown address family %d\n", ip->af);
00515 return 0;
00516 }
00517
00518 return buff;
00519 }
00520
00521
00522
00523
00524
00525 static inline struct hostent* ip_addr2he(str* name, struct ip_addr* ip)
00526 {
00527 static struct hostent he;
00528 static char hostname[256];
00529 static char* p_aliases[1];
00530 static char* p_addr[2];
00531 static char address[16];
00532 int len;
00533
00534 p_aliases[0]=0;
00535 p_addr[1]=0;
00536 p_addr[0]=address;
00537 len = (name->len < 256) ? name->len : 256;
00538 strncpy(hostname, name->s, len);
00539 hostname[len] = 0;
00540 if (ip->len>16) return 0;
00541 memcpy(address, ip->u.addr, ip->len);
00542
00543 he.h_addrtype=ip->af;
00544 he.h_length=ip->len;
00545 he.h_addr_list=p_addr;
00546 he.h_aliases=p_aliases;
00547 he.h_name=hostname;
00548 return &he;
00549 }
00550 #endif