Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-8]: src Pull up following revision(s) (requested by ryo in ticket...
details: https://anonhg.NetBSD.org/src/rev/f7a5f6baabab
branches: netbsd-8
changeset: 434499:f7a5f6baabab
user: snj <snj%NetBSD.org@localhost>
date: Thu Dec 21 21:08:13 2017 +0000
description:
Pull up following revision(s) (requested by ryo in ticket #445):
distrib/sets/lists/debug/mi: revision 1.222
distrib/sets/lists/tests/mi: revision 1.760
share/man/man4/ip.4: revision 1.38
sys/netinet/in.c: revision 1.207
sys/netinet/in.h: revision 1.101
sys/netinet/in_pcb.c: revision 1.179
sys/netinet/in_pcb.h: revision 1.64
sys/netinet/ip_output.c: revision 1.284, 1.286
sys/netinet/ip_var.h: revision 1.120-1.121
sys/netinet/raw_ip.c: revision 1.166-1.167
sys/netinet/udp_usrreq.c: revision 1.235-1.236
sys/netinet/udp_var.h: revision 1.42
tests/net/net/Makefile: revision 1.21
tests/net/net/t_pktinfo_send.c: revision 1.1-1.2
Add support IP_PKTINFO for sendmsg(2).
The source address or output interface can be specified by adding IP_PKTINFO
to the control part of the message on a SOCK_DGRAM or SOCK_RAW socket.
Reviewed by ozaki-r@ and christos@. thanks.
--
As is the case with IPV6_PKTINFO, IP_PKTINFO can be sent without EADDRINUSE
even if the UDP address:port in use is specified.
diffstat:
distrib/sets/lists/debug/mi | 3 +-
distrib/sets/lists/tests/mi | 3 +-
share/man/man4/ip.4 | 15 +-
sys/netinet/in.c | 41 +-
sys/netinet/in.h | 3 +-
sys/netinet/in_pcb.c | 25 +-
sys/netinet/in_pcb.h | 3 +-
sys/netinet/ip_output.c | 150 +++++++-
sys/netinet/ip_var.h | 13 +-
sys/netinet/raw_ip.c | 87 ++-
sys/netinet/udp_usrreq.c | 54 +-
sys/netinet/udp_var.h | 4 +-
tests/net/net/Makefile | 6 +-
tests/net/net/t_pktinfo_send.c | 808 +++++++++++++++++++++++++++++++++++++++++
14 files changed, 1136 insertions(+), 79 deletions(-)
diffs (truncated from 1621 to 300 lines):
diff -r 03f61c875e70 -r f7a5f6baabab distrib/sets/lists/debug/mi
--- a/distrib/sets/lists/debug/mi Thu Dec 21 19:53:28 2017 +0000
+++ b/distrib/sets/lists/debug/mi Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.216.2.5 2017/11/17 20:43:10 snj Exp $
+# $NetBSD: mi,v 1.216.2.6 2017/12/21 21:08:13 snj Exp $
./etc/mtree/set.debug comp-sys-root
./usr/lib comp-sys-usr compatdir
./usr/lib/i18n/libBIG5_g.a comp-c-debuglib debuglib,compatfile
@@ -2280,6 +2280,7 @@
./usr/libdata/debug/usr/tests/net/mcast/mcast.debug tests-net-debug debug,atf,rump
./usr/libdata/debug/usr/tests/net/mcast/t_mcast.debug tests-obsolete debug,atf,rump,obsolete
./usr/libdata/debug/usr/tests/net/net/t_pktinfo.debug tests-net-debug debug,atf,compattestfile
+./usr/libdata/debug/usr/tests/net/net/t_pktinfo_test.debug tests-net-debug debug,atf,rump
./usr/libdata/debug/usr/tests/net/net/t_raw.debug tests-net-debug debug,atf,rump
./usr/libdata/debug/usr/tests/net/net/t_tcp.debug tests-net-debug debug,atf,compattestfile
./usr/libdata/debug/usr/tests/net/net/t_udp.debug tests-net-debug debug,atf,compattestfile
diff -r 03f61c875e70 -r f7a5f6baabab distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi Thu Dec 21 19:53:28 2017 +0000
+++ b/distrib/sets/lists/tests/mi Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.752.2.6 2017/11/17 20:43:10 snj Exp $
+# $NetBSD: mi,v 1.752.2.7 2017/12/21 21:08:13 snj Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -3363,6 +3363,7 @@
./usr/tests/net/net/t_ping6_opts tests-net-tests atf,rump
./usr/tests/net/net/t_ping_opts tests-net-tests atf,rump
./usr/tests/net/net/t_pktinfo tests-net-tests compattestfile,atf
+./usr/tests/net/net/t_pktinfo_send tests-net-tests atf,rump
./usr/tests/net/net/t_raw tests-net-tests atf,rump
./usr/tests/net/net/t_tcp tests-net-tests compattestfile,atf
./usr/tests/net/net/t_udp tests-net-tests compattestfile,atf
diff -r 03f61c875e70 -r f7a5f6baabab share/man/man4/ip.4
--- a/share/man/man4/ip.4 Thu Dec 21 19:53:28 2017 +0000
+++ b/share/man/man4/ip.4 Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: ip.4,v 1.36 2013/07/13 09:24:25 njoly Exp $
+.\" $NetBSD: ip.4,v 1.36.20.1 2017/12/21 21:08:13 snj Exp $
.\"
.\" Copyright (c) 1983, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" @(#)ip.4 8.2 (Berkeley) 11/30/93
.\"
-.Dd June 27, 2013
+.Dd August 10, 2017
.Dt IP 4
.Os
.Sh NAME
@@ -121,6 +121,7 @@
struct in_addr ipi_addr; /* the source or destination address */
unsigned int ipi_ifindex; /* the interface index */
.Ed
+.Pp
and added to the control portion of the message:
The cmsghdr fields have the following values:
.Bd -literal
@@ -129,6 +130,16 @@
cmsg_type = IP_PKTINFO
.Ed
.Pp
+For
+.Xr sendmsg 2 ,
+the source address or output interface can be specified by adding
+.Dv IP_PKTINFO
+to the control part of the message on a
+.Dv SOCK_DGRAM
+or
+.Dv SOCK_RAW
+socket.
+.Pp
The
.Dv IP_PORTALGO
can be used to randomize the port selection.
diff -r 03f61c875e70 -r f7a5f6baabab sys/netinet/in.c
--- a/sys/netinet/in.c Thu Dec 21 19:53:28 2017 +0000
+++ b/sys/netinet/in.c Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: in.c,v 1.203.2.2 2017/11/17 20:24:05 snj Exp $ */
+/* $NetBSD: in.c,v 1.203.2.3 2017/12/21 21:08:13 snj 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.203.2.2 2017/11/17 20:24:05 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.203.2.3 2017/12/21 21:08:13 snj Exp $");
#include "arp.h"
@@ -258,6 +258,43 @@
}
/*
+ * like in_localaddr() but can specify ifp.
+ */
+int
+in_direct(struct in_addr in, struct ifnet *ifp)
+{
+ struct ifaddr *ifa;
+ int localaddr = 0;
+ int s;
+
+ KASSERT(ifp != NULL);
+
+#define ia (ifatoia(ifa))
+ s = pserialize_read_enter();
+ if (subnetsarelocal) {
+ IFADDR_READER_FOREACH(ifa, ifp) {
+ if (ifa->ifa_addr->sa_family == AF_INET &&
+ ((in.s_addr & ia->ia_netmask) == ia->ia_net)) {
+ localaddr = 1;
+ break;
+ }
+ }
+ } else {
+ IFADDR_READER_FOREACH(ifa, ifp) {
+ if (ifa->ifa_addr->sa_family == AF_INET &&
+ (in.s_addr & ia->ia_subnetmask) == ia->ia_subnet) {
+ localaddr = 1;
+ break;
+ }
+ }
+ }
+ pserialize_read_exit(s);
+
+ return localaddr;
+#undef ia
+}
+
+/*
* Determine whether an IP address is in a reserved set of addresses
* that may not be forwarded, or whether datagrams to that destination
* may be forwarded.
diff -r 03f61c875e70 -r f7a5f6baabab sys/netinet/in.h
--- a/sys/netinet/in.h Thu Dec 21 19:53:28 2017 +0000
+++ b/sys/netinet/in.h Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: in.h,v 1.100 2017/02/16 08:12:44 knakahara Exp $ */
+/* $NetBSD: in.h,v 1.100.6.1 2017/12/21 21:08:13 snj Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -562,6 +562,7 @@
extern const struct sockaddr_in in_any;
int in_broadcast(struct in_addr, struct ifnet *);
+int in_direct(struct in_addr, struct ifnet *);
int in_canforward(struct in_addr);
int cpu_in_cksum(struct mbuf *, int, int, uint32_t);
int in_cksum(struct mbuf *, int);
diff -r 03f61c875e70 -r f7a5f6baabab sys/netinet/in_pcb.c
--- a/sys/netinet/in_pcb.c Thu Dec 21 19:53:28 2017 +0000
+++ b/sys/netinet/in_pcb.c Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.c,v 1.178 2017/04/25 05:44:11 ozaki-r Exp $ */
+/* $NetBSD: in_pcb.c,v 1.178.4.1 2017/12/21 21:08:13 snj 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.178 2017/04/25 05:44:11 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.178.4.1 2017/12/21 21:08:13 snj Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -270,8 +270,8 @@
return (0);
}
-static int
-in_pcbbind_addr(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
+int
+in_pcbbindableaddr(struct sockaddr_in *sin, kauth_cred_t cred)
{
int error = EADDRNOTAVAIL;
struct ifaddr *ifa = NULL;
@@ -298,13 +298,20 @@
if (ia->ia4_flags & IN_IFF_DUPLICATED)
goto error;
}
+ error = 0;
+ error:
pserialize_read_exit(s);
-
- inp->inp_laddr = sin->sin_addr;
+ return error;
+}
- return (0);
-error:
- pserialize_read_exit(s);
+static int
+in_pcbbind_addr(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
+{
+ int error;
+
+ error = in_pcbbindableaddr(sin, cred);
+ if (error == 0)
+ inp->inp_laddr = sin->sin_addr;
return error;
}
diff -r 03f61c875e70 -r f7a5f6baabab sys/netinet/in_pcb.h
--- a/sys/netinet/in_pcb.h Thu Dec 21 19:53:28 2017 +0000
+++ b/sys/netinet/in_pcb.h Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.h,v 1.63 2017/03/02 05:29:31 ozaki-r Exp $ */
+/* $NetBSD: in_pcb.h,v 1.63.6.1 2017/12/21 21:08:13 snj Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -135,6 +135,7 @@
#ifdef _KERNEL
void in_losing(struct inpcb *);
int in_pcballoc(struct socket *, void *);
+int in_pcbbindableaddr(struct sockaddr_in *, kauth_cred_t);
int in_pcbbind(void *, struct sockaddr_in *, struct lwp *);
int in_pcbconnect(void *, struct sockaddr_in *, struct lwp *);
void in_pcbdetach(void *);
diff -r 03f61c875e70 -r f7a5f6baabab sys/netinet/ip_output.c
--- a/sys/netinet/ip_output.c Thu Dec 21 19:53:28 2017 +0000
+++ b/sys/netinet/ip_output.c Thu Dec 21 21:08:13 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_output.c,v 1.279.2.1 2017/07/07 09:23:01 martin Exp $ */
+/* $NetBSD: ip_output.c,v 1.279.2.2 2017/12/21 21:08:13 snj Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.1 2017/07/07 09:23:01 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.2 2017/12/21 21:08:13 snj Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -127,6 +127,7 @@
#include <netinet/in_offload.h>
#include <netinet/portalgo.h>
#include <netinet/udp.h>
+#include <netinet/udp_var.h>
#ifdef INET6
#include <netinet6/ip6_var.h>
@@ -329,8 +330,9 @@
mtu = ifp->if_mtu;
ip->ip_ttl = 1;
isbroadcast = in_broadcast(dst->sin_addr, ifp);
- } else if ((IN_MULTICAST(ip->ip_dst.s_addr) ||
- ip->ip_dst.s_addr == INADDR_BROADCAST) &&
+ } else if (((IN_MULTICAST(ip->ip_dst.s_addr) ||
+ ip->ip_dst.s_addr == INADDR_BROADCAST) ||
+ (flags & IP_ROUTETOIFINDEX)) &&
imo != NULL && imo->imo_multicast_if_index != 0) {
ifp = mifp = if_get_byindex(imo->imo_multicast_if_index, &psref);
if (ifp == NULL) {
@@ -344,7 +346,31 @@
error = EADDRNOTAVAIL;
goto bad;
}
- isbroadcast = 0;
+ if (IN_MULTICAST(ip->ip_dst.s_addr) ||
+ ip->ip_dst.s_addr == INADDR_BROADCAST) {
+ isbroadcast = 0;
+ } else {
+ /* IP_ROUTETOIFINDEX */
+ isbroadcast = in_broadcast(dst->sin_addr, ifp);
+ if ((isbroadcast == 0) && ((ifp->if_flags &
+ (IFF_LOOPBACK | IFF_POINTOPOINT)) == 0) &&
+ (in_direct(dst->sin_addr, ifp) == 0)) {
+ /* gateway address required */
+ if (rt == NULL)
+ rt = rtcache_init(ro);
+ if (rt == NULL || rt->rt_ifp != ifp) {
+ IP_STATINC(IP_STAT_NOROUTE);
+ error = EHOSTUNREACH;
+ goto bad;
+ }
+ rt->rt_use++;
+ if (rt->rt_flags & RTF_GATEWAY)
+ dst = satosin(rt->rt_gateway);
+ if (rt->rt_flags & RTF_HOST)
+ isbroadcast =
+ rt->rt_flags & RTF_BROADCAST;
+ }
+ }
} else {
if (rt == NULL)
rt = rtcache_init(ro);
@@ -1320,6 +1346,120 @@
Home |
Main Index |
Thread Index |
Old Index