summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2008-08-16 06:39:18 +0000
committerbz <bz@FreeBSD.org>2008-08-16 06:39:18 +0000
commiteafee510a97921d081800945c98ef8a0575e49fb (patch)
treec09d29407c6c33b6d73598387cc27ff869841e33 /sys
parentb9ac5192a235cc6efad426f7c989608188af9d9d (diff)
downloadFreeBSD-src-eafee510a97921d081800945c98ef8a0575e49fb.zip
FreeBSD-src-eafee510a97921d081800945c98ef8a0575e49fb.tar.gz
Fix a regression introduced in r179289 splitting up ip6_savecontrol()
into v4-only vs. v6-only inp_flags processing. When ip6_savecontrol_v4() is called from ip6_savecontrol() we were not passing back the **mp thus the information will be missing in userland. Istead of going with a *** as suggested in the PR we are returning **mp now and passing in the v4only flag as a pointer argument. PR: kern/126349 Reviewed by: rwatson, dwmalone
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet/udp_usrreq.c2
-rw-r--r--sys/netinet6/ip6_input.c20
-rw-r--r--sys/netinet6/ip6_var.h3
3 files changed, 17 insertions, 8 deletions
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 715599e..c9cf5d4 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -216,7 +216,7 @@ udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off,
inp->inp_socket->so_options & (SO_TIMESTAMP | SO_BINTIME)) {
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
- ip6_savecontrol_v4(inp, n, &opts);
+ (void)ip6_savecontrol_v4(inp, n, &opts, NULL);
else
#endif
ip_savecontrol(inp, &opts, ip, n);
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
index 7b4e4dc..e6ca375 100644
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -1042,8 +1042,9 @@ ip6_unknown_opt(u_int8_t *optp, struct mbuf *m, int off)
* ip6_savecontrol will directly call ip6_savecontrol_v4 to handle those
* options and handle the v6-only ones itself.
*/
-int
-ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp)
+struct mbuf **
+ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp,
+ int *v4only)
{
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
@@ -1059,8 +1060,11 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp)
}
#endif
- if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION)
- return (1);
+ if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
+ if (v4only != NULL)
+ *v4only = 1;
+ return (mp);
+ }
#define IS2292(inp, x, y) (((inp)->inp_flags & IN6P_RFC2292) ? (x) : (y))
/* RFC 2292 sec. 5 */
@@ -1089,15 +1093,19 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp)
mp = &(*mp)->m_next;
}
- return (0);
+ if (v4only != NULL)
+ *v4only = 0;
+ return (mp);
}
void
ip6_savecontrol(struct inpcb *in6p, struct mbuf *m, struct mbuf **mp)
{
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
+ int v4only = 0;
- if (ip6_savecontrol_v4(in6p, m, mp) != 0)
+ mp = ip6_savecontrol_v4(in6p, m, mp, &v4only);
+ if (v4only)
return;
if ((in6p->in6p_flags & IN6P_TCLASS) != 0) {
diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h
index 2370737..f13ea34 100644
--- a/sys/netinet6/ip6_var.h
+++ b/sys/netinet6/ip6_var.h
@@ -350,7 +350,8 @@ extern int (*ip6_mforward)(struct ip6_hdr *, struct ifnet *,
int ip6_process_hopopts __P((struct mbuf *, u_int8_t *, int, u_int32_t *,
u_int32_t *));
-int ip6_savecontrol_v4(struct inpcb *, struct mbuf *, struct mbuf **);
+struct mbuf **ip6_savecontrol_v4(struct inpcb *, struct mbuf *,
+ struct mbuf **, int *);
void ip6_savecontrol __P((struct inpcb *, struct mbuf *, struct mbuf **));
void ip6_notify_pmtu __P((struct inpcb *, struct sockaddr_in6 *,
u_int32_t *));
OpenPOWER on IntegriCloud