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 #include <stdlib.h>
00036 #include <stdio.h>
00037
00038 #include "ip_addr.h"
00039 #include "dprint.h"
00040 #include "mem/mem.h"
00041
00042
00043 struct net* mk_net(struct ip_addr* ip, struct ip_addr* mask)
00044 {
00045 struct net* n;
00046 int warning;
00047 unsigned int r;
00048
00049 warning=0;
00050 if ((ip->af != mask->af) || (ip->len != mask->len)){
00051 LM_CRIT("trying to use a different mask family"
00052 " (eg. ipv4/ipv6mask or ipv6/ipv4mask)\n");
00053 goto error;
00054 }
00055 n=(struct net*)pkg_malloc(sizeof(struct net));
00056 if (n==0){
00057 LM_CRIT("memory allocation failure\n");
00058 goto error;
00059 }
00060 n->ip=*ip;
00061 n->mask=*mask;
00062 for (r=0; r<n->ip.len/4; r++) {
00063 n->ip.u.addr32[r] &= n->mask.u.addr32[r];
00064 if (n->ip.u.addr32[r]!=ip->u.addr32[r]) warning=1;
00065 };
00066 if (warning){
00067 LM_WARN("invalid network address/netmask "
00068 "combination fixed...\n");
00069 print_ip("original network address:", ip, "/");
00070 print_ip("", mask, "\n");
00071 print_ip("fixed network address:", &(n->ip), "/");
00072 print_ip("", &(n->mask), "\n");
00073 };
00074 return n;
00075 error:
00076 return 0;
00077 }
00078
00079
00080
00081 struct net* mk_net_bitlen(struct ip_addr* ip, unsigned int bitlen)
00082 {
00083 struct ip_addr mask;
00084 unsigned int r;
00085
00086 if (bitlen>ip->len*8){
00087 LM_CRIT("bad bitlen number %d\n", bitlen);
00088 goto error;
00089 }
00090 memset(&mask,0, sizeof(mask));
00091 for (r=0;r<bitlen/8;r++) mask.u.addr[r]=0xff;
00092 if (bitlen%8) mask.u.addr[r]= ~((1<<(8-(bitlen%8)))-1);
00093 mask.af=ip->af;
00094 mask.len=ip->len;
00095
00096 return mk_net(ip, &mask);
00097 error:
00098 return 0;
00099 }
00100
00101
00102
00103 void print_ip(char* p, struct ip_addr* ip, char *s)
00104 {
00105 switch(ip->af){
00106 case AF_INET:
00107 LM_DBG("%s%d.%d.%d.%d%s", (p)?p:"",
00108 ip->u.addr[0],
00109 ip->u.addr[1],
00110 ip->u.addr[2],
00111 ip->u.addr[3],
00112 (s)?s:""
00113 );
00114 break;
00115 case AF_INET6:
00116 LM_DBG("%s%x:%x:%x:%x:%x:%x:%x:%x%s", (p)?p:"",
00117 htons(ip->u.addr16[0]),
00118 htons(ip->u.addr16[1]),
00119 htons(ip->u.addr16[2]),
00120 htons(ip->u.addr16[3]),
00121 htons(ip->u.addr16[4]),
00122 htons(ip->u.addr16[5]),
00123 htons(ip->u.addr16[6]),
00124 htons(ip->u.addr16[7]),
00125 (s)?s:""
00126 );
00127 break;
00128 default:
00129 LM_DBG("warning unknown address family %d\n", ip->af);
00130 }
00131 }
00132
00133
00134
00135 void stdout_print_ip(struct ip_addr* ip)
00136 {
00137 switch(ip->af){
00138 case AF_INET:
00139 printf("%d.%d.%d.%d", ip->u.addr[0],
00140 ip->u.addr[1],
00141 ip->u.addr[2],
00142 ip->u.addr[3]);
00143 break;
00144 case AF_INET6:
00145 printf("%x:%x:%x:%x:%x:%x:%x:%x", htons(ip->u.addr16[0]),
00146 htons(ip->u.addr16[1]),
00147 htons(ip->u.addr16[2]),
00148 htons(ip->u.addr16[3]),
00149 htons(ip->u.addr16[4]),
00150 htons(ip->u.addr16[5]),
00151 htons(ip->u.addr16[6]),
00152 htons(ip->u.addr16[7])
00153 );
00154 break;
00155 default:
00156 LM_DBG("warning unknown address family %d\n", ip->af);
00157 }
00158 }
00159
00160
00161
00162 void print_net(struct net* net)
00163 {
00164 if (net==0){
00165 LM_WARN("null pointer\n");
00166 return;
00167 }
00168 print_ip("", &net->ip, "/"); print_ip("", &net->mask, "");
00169 }
00170
00171
00172 #ifdef USE_MCAST
00173
00174
00175 int is_mcast(struct ip_addr* ip)
00176 {
00177 if (!ip){
00178 LM_ERR("invalid parameter value\n");
00179 return -1;
00180 }
00181
00182 if (ip->af==AF_INET){
00183 return IN_MULTICAST(htonl(ip->u.addr32[0]));
00184 #ifdef USE_IPV6
00185 } else if (ip->af==AF_INET6){
00186 return IN6_IS_ADDR_MULTICAST((struct in6_addr *)ip->u.addr);
00187 #endif
00188 } else {
00189 LM_ERR("unsupported protocol family\n");
00190 return -1;
00191 }
00192 }
00193
00194 #endif