From owner-svn-src-projects@FreeBSD.ORG Fri Aug 1 08:28:18 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D2B04D4F; Fri, 1 Aug 2014 08:28:18 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C04DC29E6; Fri, 1 Aug 2014 08:28:18 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s718SIZR054349; Fri, 1 Aug 2014 08:28:18 GMT (envelope-from melifaro@svn.freebsd.org) Received: (from melifaro@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s718SINn054348; Fri, 1 Aug 2014 08:28:18 GMT (envelope-from melifaro@svn.freebsd.org) Message-Id: <201408010828.s718SINn054348@svn.freebsd.org> From: "Alexander V. Chernikov" Date: Fri, 1 Aug 2014 08:28:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r269371 - projects/ipfw/sys/netpfil/ipfw X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Aug 2014 08:28:19 -0000 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); }