svn commit: r256673 - in user/ae/inet6/sys: netinet netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Thu Oct 17 10:53:58 UTC 2013
Author: ae
Date: Thu Oct 17 10:53:57 2013
New Revision: 256673
URL: http://svnweb.freebsd.org/changeset/base/256673
Log:
Remove auxiliary data support and use in6ifa_ifwithaddr() function
instead of ip6_getdstifaddr().
Modified:
user/ae/inet6/sys/netinet/tcp_input.c
user/ae/inet6/sys/netinet6/frag6.c
user/ae/inet6/sys/netinet6/icmp6.c
user/ae/inet6/sys/netinet6/ip6_input.c
user/ae/inet6/sys/netinet6/ip6_var.h
Modified: user/ae/inet6/sys/netinet/tcp_input.c
==============================================================================
--- user/ae/inet6/sys/netinet/tcp_input.c Thu Oct 17 09:57:09 2013 (r256672)
+++ user/ae/inet6/sys/netinet/tcp_input.c Thu Oct 17 10:53:57 2013 (r256673)
@@ -530,6 +530,7 @@ tcp6_input(struct mbuf **mp, int *offp,
{
struct mbuf *m = *mp;
struct in6_ifaddr *ia6;
+ struct ip6_hdr *ip6;
IP6_EXTHDR_CHECK(m, *offp, sizeof(struct tcphdr), IPPROTO_DONE);
@@ -537,12 +538,12 @@ tcp6_input(struct mbuf **mp, int *offp,
* draft-itojun-ipv6-tcp-to-anycast
* better place to put this in?
*/
- ia6 = ip6_getdstifaddr(m);
+ ip6 = mtod(m, struct ip6_hdr *);
+ ia6 = in6ifa_ifwithaddr(&ip6->ip6_dst,
+ in6_getscopezone(m->m_pkthdr.rcvif,
+ in6_addrscope(&ip6->ip6_dst)));
if (ia6 && (ia6->ia6_flags & IN6_IFF_ANYCAST)) {
- struct ip6_hdr *ip6;
-
ifa_free(&ia6->ia_ifa);
- ip6 = mtod(m, struct ip6_hdr *);
icmp6_error(m, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_ADDR,
(caddr_t)&ip6->ip6_dst - (caddr_t)ip6);
return IPPROTO_DONE;
@@ -1269,7 +1270,9 @@ relocked:
if (isipv6 && !V_ip6_use_deprecated) {
struct in6_ifaddr *ia6;
- ia6 = ip6_getdstifaddr(m);
+ ia6 = in6ifa_ifwithaddr(&ip6->ip6_dst,
+ in6_getscopezone(m->m_pkthdr.rcvif,
+ in6_addrscope(&ip6->ip6_dst)));
if (ia6 != NULL &&
(ia6->ia6_flags & IN6_IFF_DEPRECATED)) {
ifa_free(&ia6->ia_ifa);
Modified: user/ae/inet6/sys/netinet6/frag6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/frag6.c Thu Oct 17 09:57:09 2013 (r256672)
+++ user/ae/inet6/sys/netinet6/frag6.c Thu Oct 17 10:53:57 2013 (r256673)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
#include <netinet/in_var.h>
#include <netinet/ip6.h>
#include <netinet6/ip6_var.h>
+#include <netinet6/scope6_var.h>
#include <netinet/icmp6.h>
#include <netinet/in_systm.h> /* for ECN definitions */
#include <netinet/ip.h> /* for ECN definitions */
@@ -184,7 +185,10 @@ frag6_input(struct mbuf **mp, int *offp,
dstifp = NULL;
#ifdef IN6_IFSTAT_STRICT
/* find the destination interface of the packet. */
- if ((ia = ip6_getdstifaddr(m)) != NULL) {
+ ia = in6ifa_ifwithaddr(&ip6->ip6_dst,
+ in6_getscopezone(m->m_pkthdr.rcvif,
+ in6_addrscope(&ip6->ip6_dst)));
+ if (ia != NULL) {
dstifp = ia->ia_ifp;
ifa_free(&ia->ia_ifa);
}
Modified: user/ae/inet6/sys/netinet6/icmp6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/icmp6.c Thu Oct 17 09:57:09 2013 (r256672)
+++ user/ae/inet6/sys/netinet6/icmp6.c Thu Oct 17 10:53:57 2013 (r256673)
@@ -1309,7 +1309,10 @@ ni6_input(struct mbuf *m, int off)
goto bad;
/* else it's a link-local multicast, fine */
} else { /* unicast or anycast */
- if ((ia6 = ip6_getdstifaddr(m)) == NULL)
+ ia6 = in6ifa_ifwithaddr(&ip6->ip6_dst,
+ in6_getscopezone(m->m_pkthdr.rcvif,
+ in6_addrscope(&ip6->ip6_dst)));
+ if (ia6 == NULL)
goto bad; /* XXX impossible */
if ((ia6->ia6_flags & IN6_IFF_TEMPORARY) &&
@@ -2198,32 +2201,15 @@ icmp6_reflect(struct mbuf *m, size_t off
* The IN6_IFF_NOTREADY case should be VERY rare, but is possible
* (for example) when we encounter an error while forwarding procedure
* destined to a duplicated address of ours.
- * Note that ip6_getdstifaddr() may fail if we are in an error handling
- * procedure of an outgoing packet of our own, in which case we need
- * to search in the ifaddr list.
*/
- if (!IN6_IS_ADDR_MULTICAST(&origdst)) {
- if ((ia = ip6_getdstifaddr(m))) {
- if (!(ia->ia6_flags &
- (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY)))
- srcp = &ia->ia_addr.sin6_addr;
- } else {
- struct sockaddr_in6 d;
-
- bzero(&d, sizeof(d));
- d.sin6_family = AF_INET6;
- d.sin6_len = sizeof(d);
- d.sin6_addr = origdst;
- ia = (struct in6_ifaddr *)
- ifa_ifwithaddr((struct sockaddr *)&d);
- if (ia &&
- !(ia->ia6_flags &
- (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY))) {
- srcp = &ia->ia_addr.sin6_addr;
- }
- }
+ if (!IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
+ ia = in6ifa_ifwithaddr(&ip6->ip6_dst,
+ in6_getscopezone(m->m_pkthdr.rcvif,
+ in6_addrscope(&ip6->ip6_dst)));
+ if (ia != NULL && !(ia->ia6_flags &
+ (IN6_IFF_ANYCAST | IN6_IFF_NOTREADY)))
+ srcp = &ia->ia_addr.sin6_addr;
}
-
if (srcp == NULL) {
int e;
struct sockaddr_in6 sin6;
Modified: user/ae/inet6/sys/netinet6/ip6_input.c
==============================================================================
--- user/ae/inet6/sys/netinet6/ip6_input.c Thu Oct 17 09:57:09 2013 (r256672)
+++ user/ae/inet6/sys/netinet6/ip6_input.c Thu Oct 17 10:53:57 2013 (r256673)
@@ -154,10 +154,6 @@ struct rwlock in6_ifaddr_lock;
RW_SYSINIT(in6_ifaddr_lock, &in6_ifaddr_lock, "in6_ifaddr_lock");
static void ip6_init2(void *);
-static struct ip6aux *ip6_setdstifaddr(struct mbuf *, struct in6_ifaddr *);
-static struct ip6aux *ip6_addaux(struct mbuf *);
-static struct ip6aux *ip6_findaux(struct mbuf *m);
-static void ip6_delaux (struct mbuf *);
static int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *);
#ifdef PULLDOWN_TEST
static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int);
@@ -854,41 +850,6 @@ bad:
}
/*
- * set/grab in6_ifaddr correspond to IPv6 destination address.
- * XXX backward compatibility wrapper
- *
- * XXXRW: We should bump the refcount on ia6 before sticking it in the m_tag,
- * and then bump it when the tag is copied, and release it when the tag is
- * freed. Unfortunately, m_tags don't support deep copies (yet), so instead
- * we just bump the ia refcount when we receive it. This should be fixed.
- */
-static struct ip6aux *
-ip6_setdstifaddr(struct mbuf *m, struct in6_ifaddr *ia6)
-{
- struct ip6aux *ip6a;
-
- ip6a = ip6_addaux(m);
- if (ip6a)
- ip6a->ip6a_dstia6 = ia6;
- return ip6a; /* NULL if failed to set */
-}
-
-struct in6_ifaddr *
-ip6_getdstifaddr(struct mbuf *m)
-{
- struct ip6aux *ip6a;
- struct in6_ifaddr *ia;
-
- ip6a = ip6_findaux(m);
- if (ip6a) {
- ia = ip6a->ip6a_dstia6;
- ifa_ref(&ia->ia_ifa);
- return ia;
- } else
- return NULL;
-}
-
-/*
* Hop-by-Hop options header processing. If a valid jumbo payload option is
* included, the real payload length will be stored in plenp.
*
@@ -1651,46 +1612,9 @@ ip6_lasthdr(struct mbuf *m, int off, int
}
}
-static struct ip6aux *
-ip6_addaux(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
- if (!mtag) {
- mtag = m_tag_get(PACKET_TAG_IPV6_INPUT, sizeof(struct ip6aux),
- M_NOWAIT);
- if (mtag) {
- m_tag_prepend(m, mtag);
- bzero(mtag + 1, sizeof(struct ip6aux));
- }
- }
- return mtag ? (struct ip6aux *)(mtag + 1) : NULL;
-}
-
-static struct ip6aux *
-ip6_findaux(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
- return mtag ? (struct ip6aux *)(mtag + 1) : NULL;
-}
-
-static void
-ip6_delaux(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
- if (mtag)
- m_tag_delete(m, mtag);
-}
-
/*
* System control for IP6
*/
-
u_char inet6ctlerrmap[PRC_NCMDS] = {
0, 0, 0, 0,
0, EMSGSIZE, EHOSTDOWN, EHOSTUNREACH,
Modified: user/ae/inet6/sys/netinet6/ip6_var.h
==============================================================================
--- user/ae/inet6/sys/netinet6/ip6_var.h Thu Oct 17 09:57:09 2013 (r256672)
+++ user/ae/inet6/sys/netinet6/ip6_var.h Thu Oct 17 10:53:57 2013 (r256673)
@@ -257,37 +257,6 @@ VNET_PCPUSTAT_DECLARE(struct ip6stat, ip
#endif
#ifdef _KERNEL
-/*
- * IPv6 onion peeling state.
- * it will be initialized when we come into ip6_input().
- * XXX do not make it a kitchen sink!
- */
-struct ip6aux {
- u_int32_t ip6a_flags;
-#define IP6A_SWAP 0x01 /* swapped home/care-of on packet */
-#define IP6A_HASEEN 0x02 /* HA was present */
-#define IP6A_BRUID 0x04 /* BR Unique Identifier was present */
-#define IP6A_RTALERTSEEN 0x08 /* rtalert present */
-
- /* ip6.ip6_src */
- struct in6_addr ip6a_careof; /* care-of address of the peer */
- struct in6_addr ip6a_home; /* home address of the peer */
- u_int16_t ip6a_bruid; /* BR unique identifier */
-
- /* ip6.ip6_dst */
- struct in6_ifaddr *ip6a_dstia6; /* my ifaddr that matches ip6_dst */
-
- /* rtalert */
- u_int16_t ip6a_rtalert; /* rtalert option value */
-
- /*
- * decapsulation history will be here.
- * with IPsec it may not be accurate.
- */
-};
-#endif
-
-#ifdef _KERNEL
/* flags passed to ip6_output as last parameter */
#define IPV6_UNSPECSRC 0x01 /* allow :: as the source address */
#define IPV6_FORWARDING 0x02 /* most of IPv6 header exists */
@@ -394,7 +363,6 @@ int ip6proto_register(short);
int ip6proto_unregister(short);
void ip6_input(struct mbuf *);
-struct in6_ifaddr *ip6_getdstifaddr(struct mbuf *);
void ip6_freepcbopts(struct ip6_pktopts *);
int ip6_unknown_opt(u_int8_t *, struct mbuf *, int);
@@ -402,10 +370,6 @@ char * ip6_get_prevhdr(struct mbuf *, in
int ip6_nexthdr(struct mbuf *, int, int, int *);
int ip6_lasthdr(struct mbuf *, int, int, int *);
-#ifdef __notyet__
-struct ip6aux *ip6_findaux(struct mbuf *);
-#endif
-
extern int (*ip6_mforward)(struct ip6_hdr *, struct ifnet *,
struct mbuf *);
More information about the svn-src-user
mailing list