Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys - centralize header align and pullup into a single inlin...



details:   https://anonhg.NetBSD.org/src/rev/4b8e998520a6
branches:  trunk
changeset: 959458:4b8e998520a6
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Feb 14 20:58:34 2021 +0000

description:
- centralize header align and pullup into a single inline function
- use a single macro to align pointers and expose the alignment, instead
  of hard-coding 3 in 1/2 the macros.
- fix an issue in the ipv6 lt2p where it was aligning for ipv4 and pulling
  for ipv6.

diffstat:

 sys/net/if_arp.h           |   3 ++-
 sys/net/if_bridge.c        |  40 +++++++++++-----------------------------
 sys/netinet/icmp_private.h |   8 ++------
 sys/netinet/if_arp.c       |   8 ++++----
 sys/netinet/igmp_var.h     |   8 ++------
 sys/netinet/in_l2tp.c      |  13 ++++---------
 sys/netinet/ip_flow.c      |  11 +++++------
 sys/netinet/ip_input.c     |  20 ++++++--------------
 sys/netinet/ip_private.h   |   8 ++------
 sys/netinet/tcp_input.c    |  10 +++++-----
 sys/netinet/tcp_private.h  |   8 ++------
 sys/netinet/udp_private.h  |   8 ++------
 sys/netinet/udp_usrreq.c   |   8 ++++----
 sys/netinet6/icmp6.c       |   8 ++++----
 sys/netinet6/in6_l2tp.c    |  14 +++++---------
 sys/netinet6/ip6_flow.c    |   6 +++---
 sys/netinet6/ip6_input.c   |  29 ++++++++++-------------------
 sys/netinet6/ip6_private.h |   8 ++------
 sys/netinet6/udp6_usrreq.c |   8 ++++----
 sys/sys/mbuf.h             |  13 ++++++++++++-
 sys/sys/param.h            |   8 +++++++-
 21 files changed, 98 insertions(+), 149 deletions(-)

diffs (truncated from 710 to 300 lines):

diff -r e64e21094bce -r 4b8e998520a6 sys/net/if_arp.h
--- a/sys/net/if_arp.h  Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/net/if_arp.h  Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_arp.h,v 1.39 2021/02/14 19:47:16 roy Exp $  */
+/*     $NetBSD: if_arp.h,v 1.40 2021/02/14 20:58:34 christos Exp $     */
 
 /*
  * Copyright (c) 1986, 1993
@@ -72,6 +72,7 @@
        uint8_t  ar_tpa[];      /* target protocol address */
 #endif
 };
+#define        ARP_HDR_ALIGNMENT       3
 
 static __inline uint8_t *
 ar_data(struct arphdr *ap)
diff -r e64e21094bce -r 4b8e998520a6 sys/net/if_bridge.c
--- a/sys/net/if_bridge.c       Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/net/if_bridge.c       Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_bridge.c,v 1.177 2020/11/02 12:14:59 roy Exp $      */
+/*     $NetBSD: if_bridge.c,v 1.178 2021/02/14 20:58:34 christos Exp $ */
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.177 2020/11/02 12:14:59 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.178 2021/02/14 20:58:34 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2806,18 +2806,10 @@
        if (*mp == NULL)
                return -1;
 
-       if (IP_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-               if ((m = m_copyup(m, sizeof(struct ip),
-                       (max_linkhdr + 3) & ~3)) == NULL) {
-                       /* XXXJRT new stat, please */
-                       ip_statinc(IP_STAT_TOOSMALL);
-                       goto bad;
-               }
-       } else if (__predict_false(m->m_len < sizeof (struct ip))) {
-               if ((m = m_pullup(m, sizeof (struct ip))) == NULL) {
-                       ip_statinc(IP_STAT_TOOSMALL);
-                       goto bad;
-               }
+       if (m_get_aligned_hdr(&m, IP_HDR_ALIGNMENT, sizeof(*ip), true) != 0) {
+               /* XXXJRT new stat, please */
+               ip_statinc(IP_STAT_TOOSMALL);
+               goto bad;
        }
        ip = mtod(m, struct ip *);
        if (ip == NULL) goto bad;
@@ -2908,22 +2900,12 @@
         * it.  Otherwise, if it is aligned, make sure the entire base
         * IPv6 header is in the first mbuf of the chain.
         */
-       if (IP6_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
+       if (m_get_aligned_hdr(&m, IP6_HDR_ALIGNMENT, sizeof(*ip6), true) != 0) {
                struct ifnet *inifp = m_get_rcvif_NOMPSAFE(m);
-               if ((m = m_copyup(m, sizeof(struct ip6_hdr),
-                                 (max_linkhdr + 3) & ~3)) == NULL) {
-                       /* XXXJRT new stat, please */
-                       ip6_statinc(IP6_STAT_TOOSMALL);
-                       in6_ifstat_inc(inifp, ifs6_in_hdrerr);
-                       goto bad;
-               }
-       } else if (__predict_false(m->m_len < sizeof(struct ip6_hdr))) {
-               struct ifnet *inifp = m_get_rcvif_NOMPSAFE(m);
-               if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
-                       ip6_statinc(IP6_STAT_TOOSMALL);
-                       in6_ifstat_inc(inifp, ifs6_in_hdrerr);
-                       goto bad;
-               }
+               /* XXXJRT new stat, please */
+               ip6_statinc(IP6_STAT_TOOSMALL);
+               in6_ifstat_inc(inifp, ifs6_in_hdrerr);
+               goto bad;
        }
 
        ip6 = mtod(m, struct ip6_hdr *);
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/icmp_private.h
--- a/sys/netinet/icmp_private.h        Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/icmp_private.h        Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: icmp_private.h,v 1.3 2008/04/28 20:24:09 martin Exp $  */
+/*     $NetBSD: icmp_private.h,v 1.4 2021/02/14 20:58:35 christos Exp $        */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -44,11 +44,7 @@
 
 #define        ICMP_STATINC(x)         _NET_STATINC(icmpstat_percpu, x)
 
-#ifdef __NO_STRICT_ALIGNMENT
-#define        ICMP_HDR_ALIGNED_P(ic)  1
-#else
-#define        ICMP_HDR_ALIGNED_P(ic)  ((((vaddr_t) (ic)) & 3) == 0)
-#endif
+#define        ICMP_HDR_ALIGNMENT      3
 #endif /* _KERNEL_ */
 
 #endif /* !_NETINET_ICMP_PRIVATE_H_ */
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/if_arp.c
--- a/sys/netinet/if_arp.c      Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/if_arp.c      Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_arp.c,v 1.301 2021/02/14 19:47:17 roy Exp $ */
+/*     $NetBSD: if_arp.c,v 1.302 2021/02/14 20:58:35 christos Exp $    */
 
 /*
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.301 2021/02/14 19:47:17 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.302 2021/02/14 20:58:35 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -712,7 +712,7 @@
                                goto badlen;
                }
                ar = mtod(m, struct arphdr *);
-               KASSERT(ARP_HDR_ALIGNED_P(ar));
+               KASSERT(POINTER_ALIGNED_P(ar, ARP_HDR_ALIGNMENT));
 
                rcvif = m_get_rcvif(m, &s);
                if (__predict_false(rcvif == NULL)) {
@@ -741,7 +741,7 @@
                        if ((m = m_pullup(m, arplen)) == NULL)
                                goto badlen;
                        ar = mtod(m, struct arphdr *);
-                       KASSERT(ARP_HDR_ALIGNED_P(ar));
+                       KASSERT(POINTER_ALIGNED_P(ar, ARP_HDR_ALIGNMENT));
                }
 
                switch (ntohs(ar->ar_pro)) {
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/igmp_var.h
--- a/sys/netinet/igmp_var.h    Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/igmp_var.h    Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: igmp_var.h,v 1.25 2018/09/14 05:09:51 maxv Exp $       */
+/*     $NetBSD: igmp_var.h,v 1.26 2021/02/14 20:58:35 christos Exp $   */
 
 /*
  * Copyright (c) 1992, 1993
@@ -105,11 +105,7 @@
  */
 #define        IGMP_RANDOM_DELAY(X)    (cprng_fast32() % (X) + 1)
 
-#ifdef __NO_STRICT_ALIGNMENT
-#define        IGMP_HDR_ALIGNED_P(ig)  1
-#else
-#define        IGMP_HDR_ALIGNED_P(ig)  ((((vaddr_t) (ig)) & 3) == 0)
-#endif
+#define        IGMP_HDR_ALIGNMENT      3
 
 void   igmp_init(void);
 void   igmp_input(struct mbuf *, int, int);
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/in_l2tp.c
--- a/sys/netinet/in_l2tp.c     Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/in_l2tp.c     Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_l2tp.c,v 1.18 2020/01/29 04:37:24 thorpej Exp $     */
+/*     $NetBSD: in_l2tp.c,v 1.19 2021/02/14 20:58:35 christos Exp $    */
 
 /*
  * Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_l2tp.c,v 1.18 2020/01/29 04:37:24 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_l2tp.c,v 1.19 2021/02/14 20:58:35 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_l2tp.h"
@@ -197,13 +197,8 @@
                error = ENOBUFS;
                goto out;
        }
-       if (IP_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-               m = m_copyup(m, sizeof(struct ip), 0);
-       } else {
-               if (m->m_len < sizeof(struct ip))
-                       m = m_pullup(m, sizeof(struct ip));
-       }
-       if (m == NULL) {
+       if (m_get_aligned_hdr(&m, IP_HDR_ALIGNMENT, sizeof(iphdr), false) != 0)
+       {
                error = ENOBUFS;
                goto out;
        }
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/ip_flow.c
--- a/sys/netinet/ip_flow.c     Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/ip_flow.c     Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip_flow.c,v 1.82 2018/04/11 08:29:19 maxv Exp $        */
+/*     $NetBSD: ip_flow.c,v 1.83 2021/02/14 20:58:35 christos Exp $    */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.82 2018/04/11 08:29:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.83 2021/02/14 20:58:35 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -230,9 +230,8 @@
        /*
         * IP header with no option and valid version and length
         */
-       if (IP_HDR_ALIGNED_P(mtod(m, const void *)))
-               ip = mtod(m, struct ip *);
-       else {
+       ip = mtod(m, struct ip *);
+       if (!POINTER_ALIGNED_P(ip, IP_HDR_ALIGNMENT) {
                memcpy(&ip_store, mtod(m, const void *), sizeof(ip_store));
                ip = &ip_store;
        }
@@ -314,7 +313,7 @@
         *
         * XXX Use m_copyback_cow(9) here? --dyoung
         */
-       if (IP_HDR_ALIGNED_P(mtod(m, void *)) == 0)
+       if (!POINTER_ALIGNED_P(mtod(m, void *), IP_HDR_ALIGNMENT))
                memcpy(mtod(m, void *), &ip_store, sizeof(ip_store));
 
        /*
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/ip_input.c
--- a/sys/netinet/ip_input.c    Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/ip_input.c    Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip_input.c,v 1.397 2020/08/28 06:31:42 ozaki-r Exp $   */
+/*     $NetBSD: ip_input.c,v 1.398 2021/02/14 20:58:35 christos Exp $  */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.397 2020/08/28 06:31:42 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.398 2021/02/14 20:58:35 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -454,18 +454,10 @@
         * it.  Otherwise, if it is aligned, make sure the entire
         * base IP header is in the first mbuf of the chain.
         */
-       if (IP_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-               if ((m = m_copyup(m, sizeof(struct ip),
-                   (max_linkhdr + 3) & ~3)) == NULL) {
-                       /* XXXJRT new stat, please */
-                       IP_STATINC(IP_STAT_TOOSMALL);
-                       goto out;
-               }
-       } else if (__predict_false(m->m_len < sizeof(struct ip))) {
-               if ((m = m_pullup(m, sizeof(struct ip))) == NULL) {
-                       IP_STATINC(IP_STAT_TOOSMALL);
-                       goto out;
-               }
+       if (m_get_aligned_hdr(&m, IP_HDR_ALIGNMENT, sizeof(*ip), true) != 0) {
+               /* XXXJRT new stat, please */
+               IP_STATINC(IP_STAT_TOOSMALL);
+               goto out;
        }
        ip = mtod(m, struct ip *);
        if (ip->ip_v != IPVERSION) {
diff -r e64e21094bce -r 4b8e998520a6 sys/netinet/ip_private.h
--- a/sys/netinet/ip_private.h  Sun Feb 14 20:30:31 2021 +0000
+++ b/sys/netinet/ip_private.h  Sun Feb 14 20:58:34 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip_private.h,v 1.3 2008/04/28 20:24:09 martin Exp $    */
+/*     $NetBSD: ip_private.h,v 1.4 2021/02/14 20:58:35 christos Exp $  */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -43,11 +43,7 @@
 #define        IP_STATINC(x)           _NET_STATINC(ipstat_percpu, x)
 #define        IP_STATDEC(x)           _NET_STATDEC(ipstat_percpu, x)
 
-#ifdef __NO_STRICT_ALIGNMENT
-#define        IP_HDR_ALIGNED_P(ip)    1
-#else
-#define        IP_HDR_ALIGNED_P(ip)    ((((vaddr_t) (ip)) & 3) == 0)
-#endif
+#define        IP_HDR_ALIGNMENT        3
 #endif /* _KERNEL */



Home | Main Index | Thread Index | Old Index