in6_embedscope() needs to lose some weight. Remove the last argument.
In all but two calls NULL is passed and in the other 2 cases the ifp
is only used to maybe feed it to in6_selecthlim() to select the hoplimit
for the link. Since in6_embedscope() only works on link-local addresses
it does not matter what hop limit we select since the destination is
directly reachable. This makes our lives a lot easier.
OK?
--
:wq Claudio
Index: net/pfkeyv2_convert.c
===================================================================
RCS file: /cvs/src/sys/net/pfkeyv2_convert.c,v
retrieving revision 1.54
diff -u -p -r1.54 pfkeyv2_convert.c
--- net/pfkeyv2_convert.c 11 Jun 2015 15:59:17 -0000 1.54
+++ net/pfkeyv2_convert.c 10 Sep 2015 19:12:38 -0000
@@ -483,9 +483,9 @@ import_flow(struct sockaddr_encap *flow,
#ifdef INET6
case AF_INET6:
in6_embedscope(&src->sin6.sin6_addr, &src->sin6,
- NULL, NULL);
+ NULL);
in6_embedscope(&dst->sin6.sin6_addr, &dst->sin6,
- NULL, NULL);
+ NULL);
/* netmask handling */
rt_maskedcopy(&src->sa, &src->sa, &srcmask->sa);
Index: net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.76
diff -u -p -r1.76 pipex.c
--- net/pipex.c 10 Sep 2015 17:52:05 -0000 1.76
+++ net/pipex.c 10 Sep 2015 19:12:38 -0000
@@ -1976,7 +1976,7 @@ pipex_l2tp_output(struct mbuf *m0, struc
ip6->ip6_nxt = IPPROTO_UDP;
ip6->ip6_src = session->local.sin6.sin6_addr;
(void)in6_embedscope(&ip6->ip6_dst,
- &session->peer.sin6, NULL, NULL);
+ &session->peer.sin6, NULL);
/* ip6->ip6_plen will be filled in ip6_output. */
if (ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL) != 0) {
Index: netinet/ip_ipip.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_ipip.c,v
retrieving revision 1.66
diff -u -p -r1.66 ip_ipip.c
--- netinet/ip_ipip.c 9 Sep 2015 20:19:26 -0000 1.66
+++ netinet/ip_ipip.c 10 Sep 2015 19:12:38 -0000
@@ -517,8 +517,8 @@ ipip_output(struct mbuf *m, struct tdb *
ip6o->ip6_vfc |= IPV6_VERSION;
ip6o->ip6_plen = htons(m->m_pkthdr.len - sizeof(*ip6o));
ip6o->ip6_hlim = ip_defttl;
- in6_embedscope(&ip6o->ip6_src, &tdb->tdb_src.sin6, NULL, NULL);
- in6_embedscope(&ip6o->ip6_dst, &tdb->tdb_dst.sin6, NULL, NULL);
+ in6_embedscope(&ip6o->ip6_src, &tdb->tdb_src.sin6, NULL);
+ in6_embedscope(&ip6o->ip6_dst, &tdb->tdb_dst.sin6, NULL);
if (tp == IPVERSION) {
/* Save ECN notification */
Index: netinet/tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.127
diff -u -p -r1.127 tcp_usrreq.c
--- netinet/tcp_usrreq.c 27 Aug 2015 17:10:45 -0000 1.127
+++ netinet/tcp_usrreq.c 10 Sep 2015 19:12:38 -0000
@@ -794,11 +794,11 @@ tcp_ident(void *oldp, size_t *oldlenp, v
#ifdef INET6
case AF_INET6:
fin6 = (struct sockaddr_in6 *)&tir.faddr;
- error = in6_embedscope(&f6, fin6, NULL, NULL);
+ error = in6_embedscope(&f6, fin6, NULL);
if (error)
return EINVAL; /*?*/
lin6 = (struct sockaddr_in6 *)&tir.laddr;
- error = in6_embedscope(&l6, lin6, NULL, NULL);
+ error = in6_embedscope(&l6, lin6, NULL);
if (error)
return EINVAL; /*?*/
break;
Index: netinet/udp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v
retrieving revision 1.206
diff -u -p -r1.206 udp_usrreq.c
--- netinet/udp_usrreq.c 10 Sep 2015 17:52:05 -0000 1.206
+++ netinet/udp_usrreq.c 10 Sep 2015 19:12:38 -0000
@@ -742,7 +742,7 @@ udp6_ctlinput(int cmd, struct sockaddr *
cmdarg = NULL;
/* XXX: translate addresses into internal form */
sa6 = *satosin6(sa);
- if (in6_embedscope(&sa6.sin6_addr, &sa6, NULL, NULL)) {
+ if (in6_embedscope(&sa6.sin6_addr, &sa6, NULL)) {
/* should be impossible */
return;
}
@@ -756,14 +756,14 @@ udp6_ctlinput(int cmd, struct sockaddr *
/* XXX: assuming M is valid in this case */
sa6.sin6_scope_id = in6_addr2scopeid(m->m_pkthdr.ph_ifidx,
ip6cp->ip6c_finaldst);
- if (in6_embedscope(ip6cp->ip6c_finaldst, &sa6, NULL, NULL)) {
+ if (in6_embedscope(ip6cp->ip6c_finaldst, &sa6, NULL)) {
/* should be impossible */
return;
}
} else {
/* XXX: translate addresses into internal form */
sa6 = *satosin6(sa);
- if (in6_embedscope(&sa6.sin6_addr, &sa6, NULL, NULL)) {
+ if (in6_embedscope(&sa6.sin6_addr, &sa6, NULL)) {
/* should be impossible */
return;
}
@@ -789,7 +789,7 @@ udp6_ctlinput(int cmd, struct sockaddr *
sa6_src.sin6_addr = ip6->ip6_src;
sa6_src.sin6_scope_id = in6_addr2scopeid(m->m_pkthdr.ph_ifidx,
&ip6->ip6_src);
- if (in6_embedscope(&sa6_src.sin6_addr, &sa6_src, NULL, NULL)) {
+ if (in6_embedscope(&sa6_src.sin6_addr, &sa6_src, NULL)) {
/* should be impossible */
return;
}
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.165
diff -u -p -r1.165 icmp6.c
--- netinet6/icmp6.c 10 Sep 2015 17:52:05 -0000 1.165
+++ netinet6/icmp6.c 10 Sep 2015 19:12:38 -0000
@@ -908,8 +908,7 @@ icmp6_notify_error(struct mbuf *m, int o
icmp6dst.sin6_addr = *finaldst;
icmp6dst.sin6_scope_id = in6_addr2scopeid(m->m_pkthdr.ph_ifidx,
&icmp6dst.sin6_addr);
- if (in6_embedscope(&icmp6dst.sin6_addr, &icmp6dst,
- NULL, NULL)) {
+ if (in6_embedscope(&icmp6dst.sin6_addr, &icmp6dst, NULL)) {
/* should be impossbile */
nd6log((LOG_DEBUG,
"icmp6_notify_error: in6_embedscope failed\n"));
@@ -926,8 +925,7 @@ icmp6_notify_error(struct mbuf *m, int o
icmp6src.sin6_addr = eip6->ip6_src;
icmp6src.sin6_scope_id = in6_addr2scopeid(m->m_pkthdr.ph_ifidx,
&icmp6src.sin6_addr);
- if (in6_embedscope(&icmp6src.sin6_addr, &icmp6src,
- NULL, NULL)) {
+ if (in6_embedscope(&icmp6src.sin6_addr, &icmp6src, NULL)) {
/* should be impossbile */
nd6log((LOG_DEBUG,
"icmp6_notify_error: in6_embedscope failed\n"));
@@ -1217,13 +1215,13 @@ icmp6_reflect(struct mbuf *m, size_t off
sa6_src.sin6_len = sizeof(sa6_src);
sa6_src.sin6_addr = ip6->ip6_dst;
in6_recoverscope(&sa6_src, &ip6->ip6_dst);
- in6_embedscope(&ip6->ip6_dst, &sa6_src, NULL, NULL);
+ in6_embedscope(&ip6->ip6_dst, &sa6_src, NULL);
bzero(&sa6_dst, sizeof(sa6_dst));
sa6_dst.sin6_family = AF_INET6;
sa6_dst.sin6_len = sizeof(sa6_dst);
sa6_dst.sin6_addr = t;
in6_recoverscope(&sa6_dst, &t);
- in6_embedscope(&t, &sa6_dst, NULL, NULL);
+ in6_embedscope(&t, &sa6_dst, NULL);
/*
* If the incoming packet was addressed directly to us (i.e. unicast),
Index: netinet6/in6.h
===================================================================
RCS file: /cvs/src/sys/netinet6/in6.h,v
retrieving revision 1.84
diff -u -p -r1.84 in6.h
--- netinet6/in6.h 10 Sep 2015 17:52:05 -0000 1.84
+++ netinet6/in6.h 10 Sep 2015 19:12:38 -0000
@@ -436,7 +436,7 @@ int in6_mask2len(struct in6_addr *, u_ch
struct inpcb;
int in6_embedscope(struct in6_addr *, const struct sockaddr_in6 *,
- struct inpcb *, struct ifnet **);
+ struct inpcb *);
void in6_recoverscope(struct sockaddr_in6 *, const struct in6_addr *);
void in6_clearscope(struct in6_addr *);
Index: netinet6/in6_pcb.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6_pcb.c,v
retrieving revision 1.71
diff -u -p -r1.71 in6_pcb.c
--- netinet6/in6_pcb.c 10 Sep 2015 17:52:05 -0000 1.71
+++ netinet6/in6_pcb.c 10 Sep 2015 19:12:38 -0000
@@ -194,7 +194,7 @@ in6_pcbbind(struct inpcb *inp, struct mb
return EAFNOSUPPORT;
/* KAME hack: embed scopeid */
- if (in6_embedscope(&sin6->sin6_addr, sin6, inp, NULL) != 0)
+ if (in6_embedscope(&sin6->sin6_addr, sin6, inp) != 0)
return EINVAL;
/* this must be cleared for ifa_ifwithaddr() */
sin6->sin6_scope_id = 0;
@@ -418,7 +418,7 @@ in6_pcbconnect(struct inpcb *inp, struct
sin6 = &tmp;
/* KAME hack: embed scopeid */
- if (in6_embedscope(&sin6->sin6_addr, sin6, inp, &ifp) != 0)
+ if (in6_embedscope(&sin6->sin6_addr, sin6, inp) != 0)
return EINVAL;
/* this must be cleared for ifa_ifwithaddr() */
sin6->sin6_scope_id = 0;
Index: netinet6/in6_src.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6_src.c,v
retrieving revision 1.56
diff -u -p -r1.56 in6_src.c
--- netinet6/in6_src.c 10 Sep 2015 17:52:05 -0000 1.56
+++ netinet6/in6_src.c 10 Sep 2015 19:12:38 -0000
@@ -586,15 +586,13 @@ in6_selecthlim(struct inpcb *in6p, struc
*/
int
in6_embedscope(struct in6_addr *in6, const struct sockaddr_in6 *sin6,
- struct inpcb *in6p, struct ifnet **ifpp)
+ struct inpcb *in6p)
{
struct ifnet *ifp = NULL;
u_int32_t scopeid;
*in6 = sin6->sin6_addr;
scopeid = sin6->sin6_scope_id;
- if (ifpp)
- *ifpp = NULL;
/*
* don't try to read sin6->sin6_addr beyond here, since the caller may
@@ -616,8 +614,8 @@ in6_embedscope(struct in6_addr *in6, con
return ENXIO; /* XXX EINVAL? */
in6->s6_addr16[1] = htons(pi->ipi6_ifindex);
} else if (in6p && IN6_IS_ADDR_MULTICAST(in6) &&
- in6p->inp_moptions6 &&
- (ifp = if_get(in6p->inp_moptions6->im6o_ifidx))) {
+ in6p->inp_moptions6 &&
+ (ifp = if_get(in6p->inp_moptions6->im6o_ifidx))) {
in6->s6_addr16[1] = htons(ifp->if_index);
} else if (scopeid) {
ifp = if_get(scopeid);
@@ -626,9 +624,7 @@ in6_embedscope(struct in6_addr *in6, con
/*XXX assignment to 16bit from 32bit variable */
in6->s6_addr16[1] = htons(scopeid & 0xffff);
}
-
- if (ifpp)
- *ifpp = ifp;
+ if_put(ifp);
}
return 0;
Index: netinet6/raw_ip6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
retrieving revision 1.82
diff -u -p -r1.82 raw_ip6.c
--- netinet6/raw_ip6.c 10 Sep 2015 17:52:05 -0000 1.82
+++ netinet6/raw_ip6.c 10 Sep 2015 19:12:38 -0000
@@ -402,7 +402,7 @@ rip6_output(struct mbuf *m, ...)
/* KAME hack: embed scopeid */
origoptp = in6p->inp_outputopts6;
in6p->inp_outputopts6 = optp;
- if (in6_embedscope(&ip6->ip6_dst, dstsock, in6p, &oifp) != 0) {
+ if (in6_embedscope(&ip6->ip6_dst, dstsock, in6p) != 0) {
error = EINVAL;
goto bad;
}
Index: netinet6/udp6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/udp6_output.c,v
retrieving revision 1.35
diff -u -p -r1.35 udp6_output.c
--- netinet6/udp6_output.c 8 Jun 2015 22:19:28 -0000 1.35
+++ netinet6/udp6_output.c 10 Sep 2015 19:12:38 -0000
@@ -151,7 +151,7 @@ udp6_output(struct inpcb *in6p, struct m
fport = sin6->sin6_port; /* allow 0 port */
/* KAME hack: embed scopeid */
- if (in6_embedscope(&sin6->sin6_addr, sin6, in6p, NULL) != 0) {
+ if (in6_embedscope(&sin6->sin6_addr, sin6, in6p) != 0) {
error = EINVAL;
goto release;
}