Source-Changes-HG archive

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

[src/trunk]: src/sys - Add in_init() and move some functions, variables and s...



details:   https://anonhg.NetBSD.org/src/rev/77f87282743b
branches:  trunk
changeset: 796154:77f87282743b
user:      rmind <rmind%NetBSD.org@localhost>
date:      Thu May 22 22:01:12 2014 +0000

description:
- Add in_init() and move some functions, variables and sysctls into in.c
  where they belong to.  Make some functions and variables static.
- ip_input.c: reduce some #ifdefs, cleanup a little.
- Move some sysctls into ip_flow.c as they belong there.

No functional change.

diffstat:

 sys/net/if_tokensubr.c |   13 +-
 sys/netinet/in.c       |  158 ++++++++++++++++++++++++++++-
 sys/netinet/in.h       |    8 +-
 sys/netinet/in_pcb.c   |   84 +---------------
 sys/netinet/in_pcb.h   |    4 +-
 sys/netinet/in_var.h   |    6 +-
 sys/netinet/ip_flow.c  |  117 ++++++++++++++++++++-
 sys/netinet/ip_input.c |  258 ++++++++----------------------------------------
 sys/netinet/ip_var.h   |   18 +--
 9 files changed, 329 insertions(+), 337 deletions(-)

diffs (truncated from 1119 to 300 lines):

diff -r 01ea66f6dbd8 -r 77f87282743b sys/net/if_tokensubr.c
--- a/sys/net/if_tokensubr.c    Thu May 22 16:47:31 2014 +0000
+++ b/sys/net/if_tokensubr.c    Thu May 22 22:01:12 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_tokensubr.c,v 1.63 2014/05/15 09:23:03 msaitoh Exp $        */
+/*     $NetBSD: if_tokensubr.c,v 1.64 2014/05/22 22:01:12 rmind Exp $  */
 
 /*
  * Copyright (c) 1982, 1989, 1993
@@ -92,7 +92,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.63 2014/05/15 09:23:03 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.64 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_atalk.h"
@@ -124,17 +124,16 @@
 #include <net/if_ether.h>
 #include <net/if_token.h>
 
-#include "carp.h"
-#if NCARP > 0
-#include <netinet/ip_carp.h>
-#endif
-
 #ifdef INET
 #include <netinet/in.h>
 #include <netinet/in_var.h>
 #include <netinet/if_inarp.h>
 #endif
 
+#include "carp.h"
+#if NCARP > 0
+#include <netinet/ip_carp.h>
+#endif
 
 #ifdef DECNET
 #include <netdnet/dn.h>
diff -r 01ea66f6dbd8 -r 77f87282743b sys/netinet/in.c
--- a/sys/netinet/in.c  Thu May 22 16:47:31 2014 +0000
+++ b/sys/netinet/in.c  Thu May 22 22:01:12 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in.c,v 1.144 2013/06/29 21:06:58 rmind Exp $   */
+/*     $NetBSD: in.c,v 1.145 2014/05/22 22:01:12 rmind Exp $   */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.144 2013/06/29 21:06:58 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.145 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_conf.h"
@@ -132,13 +132,14 @@
 #include <netinet/in_selsrc.h>
 #endif
 
-static u_int in_mask2len(struct in_addr *);
-static void in_len2mask(struct in_addr *, u_int);
-static int in_lifaddr_ioctl(struct socket *, u_long, void *,
+static u_int   in_mask2len(struct in_addr *);
+static void    in_len2mask(struct in_addr *, u_int);
+static int     in_lifaddr_ioctl(struct socket *, u_long, void *,
        struct ifnet *, struct lwp *);
 
-static int in_addprefix(struct in_ifaddr *, int);
-static int in_scrubprefix(struct in_ifaddr *);
+static int     in_addprefix(struct in_ifaddr *, int);
+static int     in_scrubprefix(struct in_ifaddr *);
+static void    in_sysctl_init(struct sysctllog **);
 
 #ifndef SUBNETSARELOCAL
 #define        SUBNETSARELOCAL 1
@@ -148,15 +149,39 @@
 #define HOSTZEROBROADCAST 1
 #endif
 
-int subnetsarelocal = SUBNETSARELOCAL;
-int hostzeroisbroadcast = HOSTZEROBROADCAST;
+static int                     subnetsarelocal = SUBNETSARELOCAL;
+static int                     hostzeroisbroadcast = HOSTZEROBROADCAST;
 
 /*
  * This list is used to keep track of in_multi chains which belong to
  * deleted interface addresses.  We use in_ifaddr so that a chain head
  * won't be deallocated until all multicast address record are deleted.
  */
-static TAILQ_HEAD(, in_ifaddr) in_mk = TAILQ_HEAD_INITIALIZER(in_mk);
+static TAILQ_HEAD(, in_ifaddr) in_mk = TAILQ_HEAD_INITIALIZER(in_mk);
+
+static struct pool             inmulti_pool;
+static u_int                   in_multientries;
+struct in_multihashhead *      in_multihashtbl;
+
+u_long                         in_multihash;
+struct in_ifaddrhashhead *     in_ifaddrhashtbl;
+u_long                         in_ifaddrhash;
+struct in_ifaddrhead           in_ifaddrhead;
+
+void
+in_init(void)
+{
+       pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl",
+           NULL, IPL_SOFTNET);
+       TAILQ_INIT(&in_ifaddrhead);
+
+       in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
+           &in_ifaddrhash);
+       in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
+           &in_multihash);
+
+       in_sysctl_init(NULL);
+}
 
 /*
  * Return 1 if an internet address is for a ``local'' host
@@ -1132,3 +1157,116 @@
        }
        splx(s);
 }
+
+struct sockaddr_in *
+in_selectsrc(struct sockaddr_in *sin, struct route *ro,
+    int soopts, struct ip_moptions *mopts, int *errorp)
+{
+       struct rtentry *rt = NULL;
+       struct in_ifaddr *ia = NULL;
+
+       /*
+         * If route is known or can be allocated now, take the
+         * source address from the interface.  Otherwise, punt.
+        */
+       if ((soopts & SO_DONTROUTE) != 0)
+               rtcache_free(ro);
+       else {
+               union {
+                       struct sockaddr         dst;
+                       struct sockaddr_in      dst4;
+               } u;
+
+               sockaddr_in_init(&u.dst4, &sin->sin_addr, 0);
+               rt = rtcache_lookup(ro, &u.dst);
+       }
+       /*
+        * If we found a route, use the address
+        * corresponding to the outgoing interface
+        * unless it is the loopback (in case a route
+        * to our address on another net goes to loopback).
+        *
+        * XXX Is this still true?  Do we care?
+        */
+       if (rt != NULL && (rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0)
+               ia = ifatoia(rt->rt_ifa);
+       if (ia == NULL) {
+               u_int16_t fport = sin->sin_port;
+
+               sin->sin_port = 0;
+               ia = ifatoia(ifa_ifwithladdr(sintosa(sin)));
+               sin->sin_port = fport;
+               if (ia == NULL) {
+                       /* Find 1st non-loopback AF_INET address */
+                       TAILQ_FOREACH(ia, &in_ifaddrhead, ia_list) {
+                               if (!(ia->ia_ifp->if_flags & IFF_LOOPBACK))
+                                       break;
+                       }
+               }
+               if (ia == NULL) {
+                       *errorp = EADDRNOTAVAIL;
+                       return NULL;
+               }
+       }
+       /*
+        * If the destination address is multicast and an outgoing
+        * interface has been set as a multicast option, use the
+        * address of that interface as our source address.
+        */
+       if (IN_MULTICAST(sin->sin_addr.s_addr) && mopts != NULL) {
+               struct ip_moptions *imo;
+               struct ifnet *ifp;
+
+               imo = mopts;
+               if (imo->imo_multicast_ifp != NULL) {
+                       ifp = imo->imo_multicast_ifp;
+                       IFP_TO_IA(ifp, ia);             /* XXX */
+                       if (ia == 0) {
+                               *errorp = EADDRNOTAVAIL;
+                               return NULL;
+                       }
+               }
+       }
+       if (ia->ia_ifa.ifa_getifa != NULL) {
+               ia = ifatoia((*ia->ia_ifa.ifa_getifa)(&ia->ia_ifa,
+                                                     sintosa(sin)));
+       }
+#ifdef GETIFA_DEBUG
+       else
+               printf("%s: missing ifa_getifa\n", __func__);
+#endif
+       return satosin(&ia->ia_addr);
+}
+
+static void
+in_sysctl_init(struct sysctllog **clog)
+{
+       sysctl_createv(clog, 0, NULL, NULL,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_NODE, "inet",
+                      SYSCTL_DESCR("PF_INET related settings"),
+                      NULL, 0, NULL, 0,
+                      CTL_NET, PF_INET, CTL_EOL);
+       sysctl_createv(clog, 0, NULL, NULL,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_NODE, "ip",
+                      SYSCTL_DESCR("IPv4 related settings"),
+                      NULL, 0, NULL, 0,
+                      CTL_NET, PF_INET, IPPROTO_IP, CTL_EOL);
+
+       sysctl_createv(clog, 0, NULL, NULL,
+                      CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+                      CTLTYPE_INT, "subnetsarelocal",
+                      SYSCTL_DESCR("Whether logical subnets are considered "
+                                   "local"),
+                      NULL, 0, &subnetsarelocal, 0,
+                      CTL_NET, PF_INET, IPPROTO_IP,
+                      IPCTL_SUBNETSARELOCAL, CTL_EOL);
+       sysctl_createv(clog, 0, NULL, NULL,
+                      CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+                      CTLTYPE_INT, "hostzerobroadcast",
+                      SYSCTL_DESCR("All zeroes address is broadcast address"),
+                      NULL, 0, &hostzeroisbroadcast, 0,
+                      CTL_NET, PF_INET, IPPROTO_IP,
+                      IPCTL_HOSTZEROBROADCAST, CTL_EOL);
+}
diff -r 01ea66f6dbd8 -r 77f87282743b sys/netinet/in.h
--- a/sys/netinet/in.h  Thu May 22 16:47:31 2014 +0000
+++ b/sys/netinet/in.h  Thu May 22 22:01:12 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in.h,v 1.89 2013/06/27 19:38:16 christos Exp $ */
+/*     $NetBSD: in.h,v 1.90 2014/05/22 22:01:12 rmind Exp $    */
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -564,6 +564,12 @@
 int    in_localaddr(struct in_addr);
 void   in_socktrim(struct sockaddr_in *);
 
+struct route;
+struct ip_moptions;
+
+struct sockaddr_in *in_selectsrc(struct sockaddr_in *,
+       struct route *, int, struct ip_moptions *, int *);
+
 #define        in_hosteq(s,t)  ((s).s_addr == (t).s_addr)
 #define        in_nullhost(x)  ((x).s_addr == INADDR_ANY)
 
diff -r 01ea66f6dbd8 -r 77f87282743b sys/netinet/in_pcb.c
--- a/sys/netinet/in_pcb.c      Thu May 22 16:47:31 2014 +0000
+++ b/sys/netinet/in_pcb.c      Thu May 22 22:01:12 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_pcb.c,v 1.146 2013/11/23 14:20:21 christos Exp $    */
+/*     $NetBSD: in_pcb.c,v 1.147 2014/05/22 22:01:12 rmind Exp $       */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.146 2013/11/23 14:20:21 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.147 2014/05/22 22:01:12 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -1053,83 +1053,3 @@
        sockaddr_in_init(&u.dst4, &inp->inp_faddr, 0);
        return rtcache_lookup(ro, &u.dst);
 }
-
-struct sockaddr_in *
-in_selectsrc(struct sockaddr_in *sin, struct route *ro,
-    int soopts, struct ip_moptions *mopts, int *errorp)
-{
-       struct rtentry *rt = NULL;
-       struct in_ifaddr *ia = NULL;
-
-       /*
-         * If route is known or can be allocated now, take the
-         * source address from the interface.  Otherwise, punt.
-        */
-       if ((soopts & SO_DONTROUTE) != 0)
-               rtcache_free(ro);
-       else {
-               union {
-                       struct sockaddr         dst;
-                       struct sockaddr_in      dst4;



Home | Main Index | Thread Index | Old Index