netinet*: variable cleanup
In preparation for another change factor out various variable cleanups. These mainly include: (1) do not assign values to variables during declaration: this makes the code more readable and does allow for better grouping of variable declarations, (2) do not assign values to variables before need; e.g., if a variable is only used in the 2nd half of a function and we have multiple return paths before that, then do not set it before it is needed, and (3) try to avoid assigning the same value multiple times. MFC after: 3 weeks Sponsored by: Netflix
This commit is contained in:
parent
c95f8ed885
commit
503f4e4736
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354462
@ -512,10 +512,11 @@ cc_ecnpkt_handler(struct tcpcb *tp, struct tcphdr *th, uint8_t iptos)
|
||||
int
|
||||
tcp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
{
|
||||
struct mbuf *m = *mp;
|
||||
struct mbuf *m;
|
||||
struct in6_ifaddr *ia6;
|
||||
struct ip6_hdr *ip6;
|
||||
|
||||
m = *mp;
|
||||
IP6_EXTHDR_CHECK(m, *offp, sizeof(struct tcphdr), IPPROTO_DONE);
|
||||
|
||||
/*
|
||||
@ -525,10 +526,8 @@ tcp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
ia6 = in6ifa_ifwithaddr(&ip6->ip6_dst, 0 /* XXX */);
|
||||
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);
|
||||
|
@ -421,14 +421,13 @@ udp_input(struct mbuf **mp, int *offp, int proto)
|
||||
/*
|
||||
* Get IP and UDP header together in first mbuf.
|
||||
*/
|
||||
ip = mtod(m, struct ip *);
|
||||
if (m->m_len < iphlen + sizeof(struct udphdr)) {
|
||||
if ((m = m_pullup(m, iphlen + sizeof(struct udphdr))) == NULL) {
|
||||
UDPSTAT_INC(udps_hdrops);
|
||||
return (IPPROTO_DONE);
|
||||
}
|
||||
ip = mtod(m, struct ip *);
|
||||
}
|
||||
ip = mtod(m, struct ip *);
|
||||
uh = (struct udphdr *)((caddr_t)ip + iphlen);
|
||||
cscov_partial = (proto == IPPROTO_UDPLITE) ? 1 : 0;
|
||||
|
||||
|
@ -64,11 +64,14 @@ __FBSDID("$FreeBSD$");
|
||||
int
|
||||
dest6_input(struct mbuf **mp, int *offp, int proto)
|
||||
{
|
||||
struct mbuf *m = *mp;
|
||||
int off = *offp, dstoptlen, optlen;
|
||||
struct mbuf *m;
|
||||
int off, dstoptlen, optlen;
|
||||
struct ip6_dest *dstopts;
|
||||
u_int8_t *opt;
|
||||
|
||||
m = *mp;
|
||||
off = *offp;
|
||||
|
||||
/* validation of the length of the header */
|
||||
#ifndef PULLDOWN_TEST
|
||||
IP6_EXTHDR_CHECK(m, off, sizeof(*dstopts), IPPROTO_DONE);
|
||||
|
@ -401,17 +401,15 @@ icmp6_error(struct mbuf *m, int type, int code, int param)
|
||||
int
|
||||
icmp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
{
|
||||
struct mbuf *m = *mp, *n;
|
||||
struct mbuf *m, *n;
|
||||
struct ifnet *ifp;
|
||||
struct ip6_hdr *ip6, *nip6;
|
||||
struct icmp6_hdr *icmp6, *nicmp6;
|
||||
int off = *offp;
|
||||
int icmp6len = m->m_pkthdr.len - *offp;
|
||||
int code, sum, noff;
|
||||
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
||||
int ip6len, error;
|
||||
int code, error, icmp6len, ip6len, noff, off, sum;
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
m = *mp;
|
||||
off = *offp;
|
||||
|
||||
#ifndef PULLDOWN_TEST
|
||||
IP6_EXTHDR_CHECK(m, off, sizeof(struct icmp6_hdr), IPPROTO_DONE);
|
||||
@ -423,13 +421,14 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
* that not corrupted and of at least minimum length
|
||||
*/
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
ip6len = sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen);
|
||||
icmp6len = m->m_pkthdr.len - off;
|
||||
if (icmp6len < sizeof(struct icmp6_hdr)) {
|
||||
ICMP6STAT_INC(icp6s_tooshort);
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
/*
|
||||
* Check multicast group membership.
|
||||
* Note: SSM filters are not applied for ICMPv6 traffic.
|
||||
@ -445,9 +444,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* calculate the checksum
|
||||
*/
|
||||
/* Calculate the checksum. */
|
||||
#ifndef PULLDOWN_TEST
|
||||
icmp6 = (struct icmp6_hdr *)((caddr_t)ip6 + off);
|
||||
#else
|
||||
@ -473,6 +470,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
if (icmp6->icmp6_type < ICMP6_INFOMSG_MASK)
|
||||
icmp6_ifstat_inc(ifp, ifs6_in_error);
|
||||
|
||||
ip6len = sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen);
|
||||
switch (icmp6->icmp6_type) {
|
||||
case ICMP6_DST_UNREACH:
|
||||
icmp6_ifstat_inc(ifp, ifs6_in_dstunreach);
|
||||
@ -881,12 +879,14 @@ icmp6_input(struct mbuf **mp, int *offp, int proto)
|
||||
static int
|
||||
icmp6_notify_error(struct mbuf **mp, int off, int icmp6len, int code)
|
||||
{
|
||||
struct mbuf *m = *mp;
|
||||
struct mbuf *m;
|
||||
struct icmp6_hdr *icmp6;
|
||||
struct ip6_hdr *eip6;
|
||||
u_int32_t notifymtu;
|
||||
struct sockaddr_in6 icmp6src, icmp6dst;
|
||||
|
||||
m = *mp;
|
||||
|
||||
if (icmp6len < sizeof(struct icmp6_hdr) + sizeof(struct ip6_hdr)) {
|
||||
ICMP6STAT_INC(icp6s_tooshort);
|
||||
goto freeit;
|
||||
@ -2220,24 +2220,19 @@ void
|
||||
icmp6_redirect_input(struct mbuf *m, int off)
|
||||
{
|
||||
struct ifnet *ifp;
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct ip6_hdr *ip6;
|
||||
struct nd_redirect *nd_rd;
|
||||
int icmp6len = ntohs(ip6->ip6_plen);
|
||||
char *lladdr = NULL;
|
||||
int lladdrlen = 0;
|
||||
int is_router;
|
||||
int is_onlink;
|
||||
struct in6_addr src6 = ip6->ip6_src;
|
||||
struct in6_addr src6;
|
||||
struct in6_addr redtgt6;
|
||||
struct in6_addr reddst6;
|
||||
union nd_opts ndopts;
|
||||
char ip6buf[INET6_ADDRSTRLEN];
|
||||
char *lladdr;
|
||||
int icmp6len, is_onlink, is_router, lladdrlen;
|
||||
|
||||
M_ASSERTPKTHDR(m);
|
||||
KASSERT(m->m_pkthdr.rcvif != NULL, ("%s: no rcvif", __func__));
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
|
||||
/* XXX if we are router, we don't update route by icmp6 redirect */
|
||||
if (V_ip6_forwarding)
|
||||
goto freeit;
|
||||
@ -2248,6 +2243,8 @@ icmp6_redirect_input(struct mbuf *m, int off)
|
||||
if(m->m_flags & M_FRAGMENTED)
|
||||
goto freeit;
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
icmp6len = ntohs(ip6->ip6_plen);
|
||||
#ifndef PULLDOWN_TEST
|
||||
IP6_EXTHDR_CHECK(m, off, icmp6len,);
|
||||
nd_rd = (struct nd_redirect *)((caddr_t)ip6 + off);
|
||||
@ -2258,15 +2255,18 @@ icmp6_redirect_input(struct mbuf *m, int off)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
redtgt6 = nd_rd->nd_rd_target;
|
||||
reddst6 = nd_rd->nd_rd_dst;
|
||||
|
||||
if (in6_setscope(&redtgt6, m->m_pkthdr.rcvif, NULL) ||
|
||||
in6_setscope(&reddst6, m->m_pkthdr.rcvif, NULL)) {
|
||||
if (in6_setscope(&redtgt6, ifp, NULL) ||
|
||||
in6_setscope(&reddst6, ifp, NULL)) {
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
/* validation */
|
||||
src6 = ip6->ip6_src;
|
||||
if (!IN6_IS_ADDR_LINKLOCAL(&src6)) {
|
||||
nd6log((LOG_ERR,
|
||||
"ICMP6 redirect sent from %s rejected; "
|
||||
@ -2352,6 +2352,8 @@ icmp6_redirect_input(struct mbuf *m, int off)
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
lladdr = NULL;
|
||||
lladdrlen = 0;
|
||||
if (ndopts.nd_opts_tgt_lladdr) {
|
||||
lladdr = (char *)(ndopts.nd_opts_tgt_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_tgt_lladdr->nd_opt_len << 3;
|
||||
|
@ -1409,13 +1409,14 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp,
|
||||
void
|
||||
ip6_savecontrol(struct inpcb *inp, struct mbuf *m, struct mbuf **mp)
|
||||
{
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct ip6_hdr *ip6;
|
||||
int v4only = 0;
|
||||
|
||||
mp = ip6_savecontrol_v4(inp, m, mp, &v4only);
|
||||
if (v4only)
|
||||
return;
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
/*
|
||||
* IPV6_HOPOPTS socket option. Recall that we required super-user
|
||||
* privilege for the option (see ip6_ctloutput), but it might be too
|
||||
|
@ -1720,12 +1720,10 @@ pim6_input(struct mbuf *m, int off, int proto, void *arg __unused)
|
||||
|
||||
PIM6STAT_INC(pim6s_rcv_total);
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
pimlen = m->m_pkthdr.len - off;
|
||||
|
||||
/*
|
||||
* Validate lengths
|
||||
*/
|
||||
pimlen = m->m_pkthdr.len - off;
|
||||
if (pimlen < PIM_MINLEN) {
|
||||
PIM6STAT_INC(pim6s_rcv_tooshort);
|
||||
MRT6_DLOG(DEBUG_PIM, "PIM packet too short");
|
||||
|
@ -1260,8 +1260,6 @@ mld_input(struct mbuf *m, int off, int icmp6len)
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
|
||||
/* Pullup to appropriate size. */
|
||||
mld = (struct mld_hdr *)(mtod(m, uint8_t *) + off);
|
||||
if (mld->mld_type == MLD_LISTENER_QUERY &&
|
||||
@ -1275,6 +1273,7 @@ mld_input(struct mbuf *m, int off, int icmp6len)
|
||||
ICMP6STAT_INC(icp6s_badlen);
|
||||
return (IPPROTO_DONE);
|
||||
}
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
|
||||
/*
|
||||
* Userland needs to see all of this traffic for implementing
|
||||
|
@ -121,30 +121,33 @@ VNET_DEFINE_STATIC(int, dad_maxtry) = 15; /* max # of *tries* to
|
||||
void
|
||||
nd6_ns_input(struct mbuf *m, int off, int icmp6len)
|
||||
{
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct ifnet *ifp;
|
||||
struct ip6_hdr *ip6;
|
||||
struct nd_neighbor_solicit *nd_ns;
|
||||
struct in6_addr saddr6 = ip6->ip6_src;
|
||||
struct in6_addr daddr6 = ip6->ip6_dst;
|
||||
struct in6_addr taddr6;
|
||||
struct in6_addr myaddr6;
|
||||
char *lladdr = NULL;
|
||||
struct ifaddr *ifa = NULL;
|
||||
int lladdrlen = 0;
|
||||
int anycast = 0, proxy = 0, tentative = 0;
|
||||
int tlladdr;
|
||||
int rflag;
|
||||
union nd_opts ndopts;
|
||||
struct in6_addr daddr6, myaddr6, saddr6, taddr6;
|
||||
struct ifaddr *ifa;
|
||||
struct sockaddr_dl proxydl;
|
||||
union nd_opts ndopts;
|
||||
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
||||
char *lladdr;
|
||||
int anycast, lladdrlen, proxy, rflag, tentative, tlladdr;
|
||||
|
||||
ifa = NULL;
|
||||
|
||||
/* RFC 6980: Nodes MUST silently ignore fragments */
|
||||
if(m->m_flags & M_FRAGMENTED)
|
||||
goto freeit;
|
||||
|
||||
rflag = (V_ip6_forwarding) ? ND_NA_FLAG_ROUTER : 0;
|
||||
if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV && V_ip6_norbit_raif)
|
||||
rflag = 0;
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
if (ip6->ip6_hlim != 255) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_ns_input: invalid hlim (%d) from %s to %s on %s\n",
|
||||
ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src),
|
||||
ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp)));
|
||||
goto bads;
|
||||
}
|
||||
|
||||
#ifndef PULLDOWN_TEST
|
||||
IP6_EXTHDR_CHECK(m, off, icmp6len,);
|
||||
nd_ns = (struct nd_neighbor_solicit *)((caddr_t)ip6 + off);
|
||||
@ -156,17 +159,16 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
|
||||
}
|
||||
#endif
|
||||
ip6 = mtod(m, struct ip6_hdr *); /* adjust pointer for safety */
|
||||
|
||||
saddr6 = ip6->ip6_src;
|
||||
daddr6 = ip6->ip6_dst;
|
||||
taddr6 = nd_ns->nd_ns_target;
|
||||
if (in6_setscope(&taddr6, ifp, NULL) != 0)
|
||||
goto bad;
|
||||
|
||||
if (ip6->ip6_hlim != 255) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_ns_input: invalid hlim (%d) from %s to %s on %s\n",
|
||||
ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src),
|
||||
ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp)));
|
||||
goto bad;
|
||||
}
|
||||
rflag = (V_ip6_forwarding) ? ND_NA_FLAG_ROUTER : 0;
|
||||
if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV && V_ip6_norbit_raif)
|
||||
rflag = 0;
|
||||
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&saddr6)) {
|
||||
/* dst has to be a solicited node multicast address. */
|
||||
@ -215,6 +217,8 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
lladdr = NULL;
|
||||
lladdrlen = 0;
|
||||
if (ndopts.nd_opts_src_lladdr) {
|
||||
lladdr = (char *)(ndopts.nd_opts_src_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_src_lladdr->nd_opt_len << 3;
|
||||
@ -254,6 +258,7 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
|
||||
ifa = (struct ifaddr *)in6ifa_ifpwithaddr(ifp, &taddr6);
|
||||
|
||||
/* (2) check. */
|
||||
proxy = 0;
|
||||
if (ifa == NULL) {
|
||||
struct sockaddr_dl rt_gateway;
|
||||
struct rt_addrinfo info;
|
||||
@ -380,6 +385,7 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
|
||||
ip6_sprintf(ip6bufs, &daddr6)));
|
||||
nd6log((LOG_ERR, "nd6_ns_input: tgt=%s\n",
|
||||
ip6_sprintf(ip6bufs, &taddr6)));
|
||||
bads:
|
||||
ICMP6STAT_INC(icp6s_badns);
|
||||
if (ifa != NULL)
|
||||
ifa_free(ifa);
|
||||
@ -614,34 +620,34 @@ nd6_ns_output(struct ifnet *ifp, const struct in6_addr *saddr6,
|
||||
void
|
||||
nd6_na_input(struct mbuf *m, int off, int icmp6len)
|
||||
{
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct nd_neighbor_advert *nd_na;
|
||||
struct in6_addr daddr6 = ip6->ip6_dst;
|
||||
struct in6_addr taddr6;
|
||||
int flags;
|
||||
int is_router;
|
||||
int is_solicited;
|
||||
int is_override;
|
||||
char *lladdr = NULL;
|
||||
int lladdrlen = 0;
|
||||
int checklink = 0;
|
||||
struct ifnet *ifp;
|
||||
struct ip6_hdr *ip6;
|
||||
struct ifaddr *ifa;
|
||||
struct llentry *ln = NULL;
|
||||
union nd_opts ndopts;
|
||||
struct mbuf *chain = NULL;
|
||||
struct llentry *ln;
|
||||
struct mbuf *chain;
|
||||
struct nd_neighbor_advert *nd_na;
|
||||
struct in6_addr daddr6, taddr6;
|
||||
struct sockaddr_in6 sin6;
|
||||
union nd_opts ndopts;
|
||||
u_char linkhdr[LLE_MAX_LINKHDR];
|
||||
size_t linkhdrsize;
|
||||
int lladdr_off;
|
||||
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
||||
char *lladdr;
|
||||
size_t linkhdrsize;
|
||||
int flags, is_override, is_router, is_solicited;
|
||||
int lladdr_off, lladdrlen, checklink;
|
||||
|
||||
NET_EPOCH_ASSERT();
|
||||
|
||||
chain = NULL;
|
||||
ln = NULL;
|
||||
checklink = 0;
|
||||
|
||||
/* RFC 6980: Nodes MUST silently ignore fragments */
|
||||
if(m->m_flags & M_FRAGMENTED)
|
||||
goto freeit;
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
if (ip6->ip6_hlim != 255) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_na_input: invalid hlim (%d) from %s to %s on %s\n",
|
||||
@ -665,7 +671,6 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
|
||||
is_router = ((flags & ND_NA_FLAG_ROUTER) != 0);
|
||||
is_solicited = ((flags & ND_NA_FLAG_SOLICITED) != 0);
|
||||
is_override = ((flags & ND_NA_FLAG_OVERRIDE) != 0);
|
||||
memset(&sin6, 0, sizeof(sin6));
|
||||
|
||||
taddr6 = nd_na->nd_na_target;
|
||||
if (in6_setscope(&taddr6, ifp, NULL))
|
||||
@ -677,6 +682,8 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
|
||||
ip6_sprintf(ip6bufs, &taddr6)));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
daddr6 = ip6->ip6_dst;
|
||||
if (IN6_IS_ADDR_MULTICAST(&daddr6))
|
||||
if (is_solicited) {
|
||||
nd6log((LOG_ERR,
|
||||
@ -693,6 +700,8 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
lladdr = NULL;
|
||||
lladdrlen = 0;
|
||||
if (ndopts.nd_opts_tgt_lladdr) {
|
||||
lladdr = (char *)(ndopts.nd_opts_tgt_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_tgt_lladdr->nd_opt_len << 3;
|
||||
@ -888,8 +897,10 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
|
||||
* rt->rt_flags &= ~RTF_REJECT;
|
||||
*/
|
||||
ln->la_asked = 0;
|
||||
if (ln->la_hold != NULL)
|
||||
if (ln->la_hold != NULL) {
|
||||
memset(&sin6, 0, sizeof(sin6));
|
||||
nd6_grab_holdchain(ln, &chain, &sin6);
|
||||
}
|
||||
freeit:
|
||||
if (ln != NULL)
|
||||
LLE_WUNLOCK(ln);
|
||||
|
@ -127,14 +127,16 @@ VNET_DEFINE(int, nd6_ignore_ipv6_only_ra) = 1;
|
||||
void
|
||||
nd6_rs_input(struct mbuf *m, int off, int icmp6len)
|
||||
{
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct ifnet *ifp;
|
||||
struct ip6_hdr *ip6;
|
||||
struct nd_router_solicit *nd_rs;
|
||||
struct in6_addr saddr6 = ip6->ip6_src;
|
||||
char *lladdr = NULL;
|
||||
int lladdrlen = 0;
|
||||
struct in6_addr saddr6;
|
||||
union nd_opts ndopts;
|
||||
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
||||
char *lladdr;
|
||||
int lladdrlen;
|
||||
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
|
||||
/*
|
||||
* Accept RS only when V_ip6_forwarding=1 and the interface has
|
||||
@ -148,6 +150,7 @@ nd6_rs_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto freeit;
|
||||
|
||||
/* Sanity checks */
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
if (ip6->ip6_hlim != 255) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_rs_input: invalid hlim (%d) from %s to %s on %s\n",
|
||||
@ -160,6 +163,7 @@ nd6_rs_input(struct mbuf *m, int off, int icmp6len)
|
||||
* Don't update the neighbor cache, if src = ::.
|
||||
* This indicates that the src has no IP address assigned yet.
|
||||
*/
|
||||
saddr6 = ip6->ip6_src;
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&saddr6))
|
||||
goto freeit;
|
||||
|
||||
@ -183,6 +187,8 @@ nd6_rs_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
lladdr = NULL;
|
||||
lladdrlen = 0;
|
||||
if (ndopts.nd_opts_src_lladdr) {
|
||||
lladdr = (char *)(ndopts.nd_opts_src_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_src_lladdr->nd_opt_len << 3;
|
||||
@ -322,22 +328,22 @@ nd6_ifnet_link_event(void *arg __unused, struct ifnet *ifp, int linkstate)
|
||||
void
|
||||
nd6_ra_input(struct mbuf *m, int off, int icmp6len)
|
||||
{
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct nd_ifinfo *ndi = ND_IFINFO(ifp);
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct ifnet *ifp;
|
||||
struct nd_ifinfo *ndi;
|
||||
struct ip6_hdr *ip6;
|
||||
struct nd_router_advert *nd_ra;
|
||||
struct in6_addr saddr6 = ip6->ip6_src;
|
||||
int mcast = 0;
|
||||
union nd_opts ndopts;
|
||||
struct in6_addr saddr6;
|
||||
struct nd_defrouter *dr;
|
||||
union nd_opts ndopts;
|
||||
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
||||
|
||||
dr = NULL;
|
||||
int mcast;
|
||||
|
||||
/*
|
||||
* We only accept RAs only when the per-interface flag
|
||||
* ND6_IFF_ACCEPT_RTADV is on the receiving interface.
|
||||
*/
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
ndi = ND_IFINFO(ifp);
|
||||
if (!(ndi->flags & ND6_IFF_ACCEPT_RTADV))
|
||||
goto freeit;
|
||||
|
||||
@ -345,6 +351,7 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len)
|
||||
if(m->m_flags & M_FRAGMENTED)
|
||||
goto freeit;
|
||||
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
if (ip6->ip6_hlim != 255) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_ra_input: invalid hlim (%d) from %s to %s on %s\n",
|
||||
@ -353,6 +360,7 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
saddr6 = ip6->ip6_src;
|
||||
if (!IN6_IS_ADDR_LINKLOCAL(&saddr6)) {
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_ra_input: src %s is not link-local\n",
|
||||
@ -380,6 +388,8 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len)
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
mcast = 0;
|
||||
dr = NULL;
|
||||
{
|
||||
struct nd_defrouter dr0;
|
||||
u_int32_t advreachable = nd_ra->nd_ra_reachable;
|
||||
|
@ -62,12 +62,16 @@ int
|
||||
route6_input(struct mbuf **mp, int *offp, int proto)
|
||||
{
|
||||
struct ip6_hdr *ip6;
|
||||
struct mbuf *m = *mp;
|
||||
struct mbuf *m;
|
||||
struct ip6_rthdr *rh;
|
||||
int off = *offp, rhlen;
|
||||
#ifdef __notyet__
|
||||
struct ip6aux *ip6a;
|
||||
#endif
|
||||
|
||||
m = *mp;
|
||||
|
||||
#ifdef __notyet__
|
||||
ip6a = ip6_findaux(m);
|
||||
if (ip6a) {
|
||||
/* XXX reject home-address option before rthdr */
|
||||
|
Loading…
Reference in New Issue
Block a user