[sr-dev] git:master: core: function to match ip address to net address with bitmask

Daniel-Constantin Mierla miconda at gmail.com
Fri Dec 23 09:36:29 CET 2011


Module: sip-router
Branch: master
Commit: c1a4788cfd058e3eb52330eac04344be5fc93e35
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c1a4788cfd058e3eb52330eac04344be5fc93e35

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Dec 23 09:32:24 2011 +0100

core: function to match ip address to net address with bitmask

---

 ip_addr.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ip_addr.h |    7 ++++++-
 2 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/ip_addr.c b/ip_addr.c
index 06c57c3..1b15c96 100644
--- a/ip_addr.c
+++ b/ip_addr.c
@@ -354,3 +354,60 @@ char* get_proto_name(unsigned int proto)
 			return "unknown";
 	}
 }
+
+
+/**
+ * match ip address with net address and bitmask
+ * - return 0 on match, -1 otherwise
+ */
+int ip_addr_match_net(ip_addr_t *iaddr, ip_addr_t *naddr,
+		int mask)
+{
+	unsigned char c;
+	int i;
+	int mbytes;
+	int mbits;
+
+	if(mask==0)
+		return 0;
+	if(iaddr==NULL || naddr==NULL || mask<0)
+		return -1;
+	if(iaddr->af != naddr->af)
+		return -1;
+
+	if(iaddr->af == AF_INET)
+	{
+		if(mask>32)
+			return -1;
+		if(mask==32)
+		{
+			if(ip_addr_cmp(iaddr, naddr))
+				return 0;
+			return -1;
+		}
+	} else if(iaddr->af ==  AF_INET6) {
+		if(mask>128)
+			return -1;
+
+		if(mask==128)
+		{
+			if(ip_addr_cmp(iaddr, naddr))
+				return 0;
+			return -1;
+		}
+	}
+
+	mbytes = mask / 8;
+	for(i=0; i<mbytes; i++)
+	{
+		if(iaddr->u.addr[i] != naddr->u.addr[i])
+			return -1;
+	}
+	mbits = mask % 8;
+	if(mbits==0)
+		return 0;
+	c = naddr->u.addr[i] & (~((1 << (8 - mbits)) - 1));
+	if((iaddr->u.addr[i] & c) == c)
+		return 0;
+	return -1;
+}
diff --git a/ip_addr.h b/ip_addr.h
index 0c1a129..9bfe670 100644
--- a/ip_addr.h
+++ b/ip_addr.h
@@ -72,7 +72,7 @@ struct ip_addr{
 	}u;
 };
 
-
+typedef struct ip_addr ip_addr_t;
 
 struct net{
 	struct ip_addr ip;
@@ -825,5 +825,10 @@ inline static void init_dst_from_rcv(struct dest_info* dst,
 #endif
 }
 
+/**
+ * match ip address with net address and bitmask
+ * - return 0 on match, -1 otherwise
+ */
+int ip_addr_match_net(ip_addr_t *iaddr, ip_addr_t *naddr, int mask);
 
 #endif




More information about the sr-dev mailing list