Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Aug 2014 08:28:18 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r269371 - projects/ipfw/sys/netpfil/ipfw
Message-ID:  <201408010828.s718SINn054348@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Fri Aug  1 08:28:18 2014
New Revision: 269371
URL: http://svnweb.freebsd.org/changeset/base/269371

Log:
  Simplify radix operations: use unified tei_to_sockaddr_ent() to generate
    keys for add/delete calls.

Modified:
  projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c

Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c
==============================================================================
--- projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c	Fri Aug  1 07:35:17 2014	(r269370)
+++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c	Fri Aug  1 08:28:18 2014	(r269371)
@@ -293,6 +293,53 @@ ipv6_writemask(struct in6_addr *addr6, u
 }
 #endif
 
+static void
+tei_to_sockaddr_ent(struct tentry_info *tei, struct sockaddr *sa,
+    struct sockaddr *ma, int *set_mask)
+{
+	int mlen;
+	struct sockaddr_in *addr, *mask;
+	struct sockaddr_in6 *addr6, *mask6;
+	in_addr_t a4;
+
+	mlen = tei->masklen;
+
+	if (tei->subtype == AF_INET) {
+#ifdef INET
+		addr = (struct sockaddr_in *)sa;
+		mask = (struct sockaddr_in *)ma;
+		/* Set 'total' structure length */
+		KEY_LEN(*addr) = KEY_LEN_INET;
+		KEY_LEN(*mask) = KEY_LEN_INET;
+		addr->sin_family = AF_INET;
+		mask->sin_addr.s_addr =
+		    htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0);
+		a4 = *((in_addr_t *)tei->paddr);
+		addr->sin_addr.s_addr = a4 & mask->sin_addr.s_addr;
+		if (mlen != 32)
+			*set_mask = 1;
+		else
+			*set_mask = 0;
+#endif
+#ifdef INET6
+	} else if (tei->subtype == AF_INET6) {
+		/* IPv6 case */
+		addr6 = (struct sockaddr_in6 *)sa;
+		mask6 = (struct sockaddr_in6 *)ma;
+		/* Set 'total' structure length */
+		KEY_LEN(*addr6) = KEY_LEN_INET6;
+		KEY_LEN(*mask6) = KEY_LEN_INET6;
+		addr6->sin6_family = AF_INET6;
+		ipv6_writemask(&mask6->sin6_addr, mlen);
+		memcpy(&addr6->sin6_addr, tei->paddr, sizeof(struct in6_addr));
+		APPLY_MASK(&addr6->sin6_addr, &mask6->sin6_addr);
+		if (mlen != 128)
+			*set_mask = 1;
+		else
+			*set_mask = 0;
+	}
+#endif
+}
 
 static int
 ta_prepare_add_cidr(struct ip_fw_chain *ch, struct tentry_info *tei,
@@ -301,15 +348,14 @@ ta_prepare_add_cidr(struct ip_fw_chain *
 	struct ta_buf_cidr *tb;
 	struct radix_cidr_entry *ent;
 	struct radix_cidr_xentry *xent;
-	in_addr_t addr;
-	struct sockaddr_in *mask;
-	struct sa_in6 *mask6;
-	int mlen;
+	struct sockaddr *addr, *mask;
+	int mlen, set_mask;
 
 	tb = (struct ta_buf_cidr *)ta_buf;
 	memset(tb, 0, sizeof(struct ta_buf_cidr));
 
 	mlen = tei->masklen;
+	set_mask = 0;
 	
 	if (tei->subtype == AF_INET) {
 #ifdef INET
@@ -317,21 +363,11 @@ ta_prepare_add_cidr(struct ip_fw_chain *
 			return (EINVAL);
 		ent = malloc(sizeof(*ent), M_IPFW_TBL, M_WAITOK | M_ZERO);
 		ent->value = tei->value;
-		mask = &tb->addr.a4.ma;
-		/* Set 'total' structure length */
-		KEY_LEN(ent->addr) = KEY_LEN_INET;
-		KEY_LEN(*mask) = KEY_LEN_INET;
-		ent->addr.sin_family = AF_INET;
-		mask->sin_addr.s_addr =
-		    htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0);
-		addr = *((in_addr_t *)tei->paddr);
-		ent->addr.sin_addr.s_addr = addr & mask->sin_addr.s_addr;
 		ent->masklen = mlen;
-		/* Set pointers */
+
+		addr = (struct sockaddr *)&ent->addr;
+		mask = (struct sockaddr *)&tb->addr.a4.ma;
 		tb->ent_ptr = ent;
-		tb->addr_ptr = (struct sockaddr *)&ent->addr;
-		if (mlen != 32)
-			tb->mask_ptr = (struct sockaddr *)mask;
 #endif
 #ifdef INET6
 	} else if (tei->subtype == AF_INET6) {
@@ -340,27 +376,23 @@ ta_prepare_add_cidr(struct ip_fw_chain *
 			return (EINVAL);
 		xent = malloc(sizeof(*xent), M_IPFW_TBL, M_WAITOK | M_ZERO);
 		xent->value = tei->value;
-		mask6 = &tb->addr.a6.ma;
-		/* Set 'total' structure length */
-		KEY_LEN(xent->addr6) = KEY_LEN_INET6;
-		KEY_LEN(*mask6) = KEY_LEN_INET6;
-		xent->addr6.sin6_family = AF_INET6;
-		ipv6_writemask(&mask6->sin6_addr, mlen);
-		memcpy(&xent->addr6.sin6_addr, tei->paddr,
-		    sizeof(struct in6_addr));
-		APPLY_MASK(&xent->addr6.sin6_addr, &mask6->sin6_addr);
 		xent->masklen = mlen;
-		/* Set pointers */
+
+		addr = (struct sockaddr *)&xent->addr6;
+		mask = (struct sockaddr *)&tb->addr.a6.ma;
 		tb->ent_ptr = xent;
-		tb->addr_ptr = (struct sockaddr *)&xent->addr6;
-		if (mlen != 128)
-			tb->mask_ptr = (struct sockaddr *)mask6;
 #endif
 	} else {
 		/* Unknown CIDR type */
 		return (EINVAL);
 	}
 
+	tei_to_sockaddr_ent(tei, addr, mask, &set_mask);
+	/* Set pointers */
+	tb->addr_ptr = addr;
+	if (set_mask != 0)
+		tb->mask_ptr = mask;
+
 	return (0);
 }
 
@@ -424,54 +456,37 @@ ta_prepare_del_cidr(struct ip_fw_chain *
     void *ta_buf)
 {
 	struct ta_buf_cidr *tb;
-	struct sockaddr_in sa, mask;
-	struct sa_in6 sa6, mask6;
-	in_addr_t addr;
-	int mlen;
+	struct sockaddr *addr, *mask;
+	int mlen, set_mask;
 
 	tb = (struct ta_buf_cidr *)ta_buf;
 	memset(tb, 0, sizeof(struct ta_buf_cidr));
 
 	mlen = tei->masklen;
+	set_mask = 0;
 
 	if (tei->subtype == AF_INET) {
 		if (mlen > 32)
 			return (EINVAL);
-		memset(&sa, 0, sizeof(struct sockaddr_in));
-		memset(&mask, 0, sizeof(struct sockaddr_in));
-		/* Set 'total' structure length */
-		KEY_LEN(sa) = KEY_LEN_INET;
-		KEY_LEN(mask) = KEY_LEN_INET;
-		mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0);
-		addr = *((in_addr_t *)tei->paddr);
-		sa.sin_addr.s_addr = addr & mask.sin_addr.s_addr;
-		tb->addr.a4.sa = sa;
-		tb->addr.a4.ma = mask;
-		tb->addr_ptr = (struct sockaddr *)&tb->addr.a4.sa;
-		if (mlen != 32)
-			tb->mask_ptr = (struct sockaddr *)&tb->addr.a4.ma;
+
+		addr = (struct sockaddr *)&tb->addr.a4.sa;
+		mask = (struct sockaddr *)&tb->addr.a4.ma;
 #ifdef INET6
 	} else if (tei->subtype == AF_INET6) {
 		if (mlen > 128)
 			return (EINVAL);
-		memset(&sa6, 0, sizeof(struct sa_in6));
-		memset(&mask6, 0, sizeof(struct sa_in6));
-		/* Set 'total' structure length */
-		KEY_LEN(sa6) = KEY_LEN_INET6;
-		KEY_LEN(mask6) = KEY_LEN_INET6;
-		ipv6_writemask(&mask6.sin6_addr, mlen);
-		memcpy(&sa6.sin6_addr, tei->paddr,
-		    sizeof(struct in6_addr));
-		APPLY_MASK(&sa6.sin6_addr, &mask6.sin6_addr);
-		tb->addr.a6.sa = sa6;
-		tb->addr.a6.ma = mask6;
-		tb->addr_ptr = (struct sockaddr *)&tb->addr.a6.sa;
-		if (mlen != 128)
-			tb->mask_ptr = (struct sockaddr *)&tb->addr.a6.ma;
+
+		addr = (struct sockaddr *)&tb->addr.a6.sa;
+		mask = (struct sockaddr *)&tb->addr.a6.ma;
 #endif
 	} else
 		return (EINVAL);
 
+	tei_to_sockaddr_ent(tei, addr, mask, &set_mask);
+	tb->addr_ptr = addr;
+	if (set_mask != 0)
+		tb->mask_ptr = mask;
+
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408010828.s718SINn054348>