Module: sip-router Branch: master Commit: e28a06a7a8f5558bb81cfc09d5cb70b9c6938328 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e28a06a7...
Author: Olle E. Johansson oej@edvina.net Committer: Olle E. Johansson oej@edvina.net Date: Sat Apr 6 21:56:59 2013 +0200
lib/kcore Fix IPv6 support in interface list
Added a new function that takes family as an argument. In order to list both IPv4 and IPv6 you need to call that function once per address family. Keep the old IPv4-only function for backwards compatibility.
---
lib/kcore/statistics.c | 55 ++++++++++++++++++++++++++++++++++++----------- lib/kcore/statistics.h | 10 +++++++- 2 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/lib/kcore/statistics.c b/lib/kcore/statistics.c index c94bde0..22fed2d 100644 --- a/lib/kcore/statistics.c +++ b/lib/kcore/statistics.c @@ -113,11 +113,37 @@ stat_var *get_stat_var_from_num_code(unsigned int numerical_code, int out_codes) * contents, to avoid a nasty memory leak. */ int get_socket_list_from_proto(int **ipList, int protocol) { + return get_socket_list_from_proto_and_family(ipList, protocol, AF_INET); +} + + +/*! + * This function will retrieve a list of all ip addresses and ports that Kamailio + * is listening on, with respect to the transport protocol specified with + * 'protocol'. This function supports both IPv4 and IPv6 + * + * The first parameter, ipList, is a pointer to a pointer. It will be assigned a + * new block of memory holding the IP Addresses and ports being listened to with + * respect to 'protocol'. The array maps a 2D array into a 1 dimensional space, + * and is layed out as follows: + * + * The first NUM_IP_OCTETS indices will be the IP address, and the next index + * the port. So if NUM_IP_OCTETS is equal to 4 and there are two IP addresses + * found, then: + * + * - ipList[0] will be the first octet of the first ip address + * - ipList[3] will be the last octet of the first ip address. + * - iplist[4] will be the port of the first ip address + * - + * - iplist[5] will be the first octet of the first ip address, + * - and so on. + */ +int get_socket_list_from_proto_and_family(int **ipList, int protocol, int family) {
struct socket_info *si; struct socket_info** list;
- int num_ip_octets = 4; + int num_ip_octets = family == AF_INET ? NUM_IP_OCTETS : NUM_IPV6_OCTETS; int numberOfSockets = 0; int currentRow = 0;
@@ -136,6 +162,13 @@ int get_socket_list_from_proto(int **ipList, int protocol) { return 0; } #endif +#ifndef USE_SCTP + if (protocol == PROTO_SCTP) + { + return 0; + } +#endif + /* We have no "interfaces" for websockets */ if (protocol == PROTO_WS || protocol == PROTO_WSS) return 0;
@@ -145,8 +178,7 @@ int get_socket_list_from_proto(int **ipList, int protocol) { /* Find out how many sockets are in the list. We need to know this so * we can malloc an array to assign to ipList. */ for(si=list?*list:0; si; si=si->next){ - /* We only support IPV4 at this point. */ - if (si->address.af == AF_INET) { + if (si->address.af == family) { numberOfSockets++; } } @@ -172,21 +204,18 @@ int get_socket_list_from_proto(int **ipList, int protocol) {
/* Extract out the IP Addresses and ports. */ for(si=list?*list:0; si; si=si->next){ + int i;
/* We currently only support IPV4. */ - if (si->address.af != AF_INET) { + if (si->address.af != family) { continue; }
- (*ipList)[currentRow*(num_ip_octets + 1) ] = - si->address.u.addr[0]; - (*ipList)[currentRow*(num_ip_octets + 1)+1] = - si->address.u.addr[1]; - (*ipList)[currentRow*(num_ip_octets + 1)+2] = - si->address.u.addr[2]; - (*ipList)[currentRow*(num_ip_octets + 1)+3] = - si->address.u.addr[3]; - (*ipList)[currentRow*(num_ip_octets + 1)+4] = + for (i = 0; i < num_ip_octets; i++) { + (*ipList)[currentRow*(num_ip_octets + 1) + i ] = + si->address.u.addr[i]; + } + (*ipList)[currentRow*(num_ip_octets + 1) + i] = si->port_no; currentRow++; diff --git a/lib/kcore/statistics.h b/lib/kcore/statistics.h index 08bf20d..110f02c 100644 --- a/lib/kcore/statistics.h +++ b/lib/kcore/statistics.h @@ -40,6 +40,7 @@
#define NUM_IP_OCTETS 4 +#define NUM_IPV6_OCTETS 16
#ifdef STATISTICS @@ -63,7 +64,7 @@ stat_var *get_stat_var_from_num_code(unsigned int numerical_code, int in_codes); /*! * This function will retrieve a list of all ip addresses and ports that Kamailio * is listening on, with respect to the transport protocol specified with - * 'protocol'. + * 'protocol'. This function only returns IPv4 addresses. * * The first parameter, ipList, is a pointer to a pointer. It will be assigned a * new block of memory holding the IP Addresses and ports being listened to with @@ -93,6 +94,13 @@ stat_var *get_stat_var_from_num_code(unsigned int numerical_code, int in_codes); */ int get_socket_list_from_proto(int **ipList, int protocol);
+/*! \brief Function to get a list of all IP addresses and ports in a specific + * family, like AF_INET or AF_INET6 + * + * For documentation see \ref get_socket_list_from_proto() + */ +int get_socket_list_from_proto_and_family(int **ipList, int protocol, int family); +
/*! * Returns the sum of the number of bytes waiting to be consumed on all network