version 1.134, 2011/12/19 11:59:58 |
version 1.136.2.2, 2018/01/30 18:44:22 |
Line 161 percpu_t *ip6stat_percpu; |
|
Line 161 percpu_t *ip6stat_percpu; |
|
static void ip6_init2(void *); |
static void ip6_init2(void *); |
static struct m_tag *ip6_setdstifaddr(struct mbuf *, const struct in6_ifaddr *); |
static struct m_tag *ip6_setdstifaddr(struct mbuf *, const struct in6_ifaddr *); |
|
|
static int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *); |
static int ip6_process_hopopts(struct mbuf *, u_int8_t *, int, u_int32_t *, |
|
u_int32_t *); |
static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int); |
static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int); |
static void sysctl_net_inet6_ip6_setup(struct sysctllog **); |
static void sysctl_net_inet6_ip6_setup(struct sysctllog **); |
|
|
|
|
frag6_init(); |
frag6_init(); |
ip6_desync_factor = cprng_fast32() % MAX_TEMP_DESYNC_FACTOR; |
ip6_desync_factor = cprng_fast32() % MAX_TEMP_DESYNC_FACTOR; |
|
|
ip6_init2((void *)0); |
ip6_init2(NULL); |
#ifdef GATEWAY |
#ifdef GATEWAY |
ip6flow_init(ip6_hashsize); |
ip6flow_init(ip6_hashsize); |
#endif |
#endif |
Line 882 ip6_getdstifaddr(struct mbuf *m) |
|
Line 883 ip6_getdstifaddr(struct mbuf *m) |
|
* |
* |
* rtalertp - XXX: should be stored more smart way |
* rtalertp - XXX: should be stored more smart way |
*/ |
*/ |
static int |
int |
ip6_hopopts_input(u_int32_t *plenp, u_int32_t *rtalertp, |
ip6_hopopts_input(u_int32_t *plenp, u_int32_t *rtalertp, |
struct mbuf **mp, int *offp) |
struct mbuf **mp, int *offp) |
{ |
{ |
Line 927 ip6_hopopts_input(u_int32_t *plenp, u_in |
|
Line 928 ip6_hopopts_input(u_int32_t *plenp, u_in |
|
* (RFC2460 p7), opthead is pointer into data content in m, and opthead to |
* (RFC2460 p7), opthead is pointer into data content in m, and opthead to |
* opthead + hbhlen is located in continuous memory region. |
* opthead + hbhlen is located in continuous memory region. |
*/ |
*/ |
int |
static int |
ip6_process_hopopts(struct mbuf *m, u_int8_t *opthead, int hbhlen, |
ip6_process_hopopts(struct mbuf *m, u_int8_t *opthead, int hbhlen, |
u_int32_t *rtalertp, u_int32_t *plenp) |
u_int32_t *rtalertp, u_int32_t *plenp) |
{ |
{ |
Line 1418 ip6_pullexthdr(struct mbuf *m, size_t of |
|
Line 1419 ip6_pullexthdr(struct mbuf *m, size_t of |
|
} |
} |
|
|
/* |
/* |
* Get pointer to the previous header followed by the header |
* Get offset to the previous header followed by the header |
* currently processed. |
* currently processed. |
* XXX: This function supposes that |
|
* M includes all headers, |
|
* the next header field and the header length field of each header |
|
* are valid, and |
|
* the sum of each header length equals to OFF. |
|
* Because of these assumptions, this function must be called very |
|
* carefully. Moreover, it will not be used in the near future when |
|
* we develop `neater' mechanism to process extension headers. |
|
*/ |
*/ |
u_int8_t * |
int |
ip6_get_prevhdr(struct mbuf *m, int off) |
ip6_get_prevhdr(struct mbuf *m, int off) |
{ |
{ |
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); |
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); |
|
|
if (off == sizeof(struct ip6_hdr)) |
if (off == sizeof(struct ip6_hdr)) { |
return (&ip6->ip6_nxt); |
return offsetof(struct ip6_hdr, ip6_nxt); |
else { |
} else if (off < sizeof(struct ip6_hdr)) { |
int len, nxt; |
panic("%s: off < sizeof(struct ip6_hdr)", __func__); |
struct ip6_ext *ip6e = NULL; |
} else { |
|
int len, nlen, nxt; |
|
struct ip6_ext ip6e; |
|
|
nxt = ip6->ip6_nxt; |
nxt = ip6->ip6_nxt; |
len = sizeof(struct ip6_hdr); |
len = sizeof(struct ip6_hdr); |
|
nlen = 0; |
while (len < off) { |
while (len < off) { |
ip6e = (struct ip6_ext *)(mtod(m, char *) + len); |
m_copydata(m, len, sizeof(ip6e), &ip6e); |
|
|
switch (nxt) { |
switch (nxt) { |
case IPPROTO_FRAGMENT: |
case IPPROTO_FRAGMENT: |
len += sizeof(struct ip6_frag); |
nlen = sizeof(struct ip6_frag); |
break; |
break; |
case IPPROTO_AH: |
case IPPROTO_AH: |
len += (ip6e->ip6e_len + 2) << 2; |
nlen = (ip6e.ip6e_len + 2) << 2; |
break; |
break; |
default: |
default: |
len += (ip6e->ip6e_len + 1) << 3; |
nlen = (ip6e.ip6e_len + 1) << 3; |
break; |
break; |
} |
} |
nxt = ip6e->ip6e_nxt; |
len += nlen; |
|
nxt = ip6e.ip6e_nxt; |
} |
} |
if (ip6e) |
|
return (&ip6e->ip6e_nxt); |
return (len - nlen); |
else |
|
return NULL; |
|
} |
} |
} |
} |
|
|
Line 1988 sysctl_net_inet6_ip6_setup(struct sysctl |
|
Line 1983 sysctl_net_inet6_ip6_setup(struct sysctl |
|
CTL_NET, PF_INET6, IPPROTO_IPV6, |
CTL_NET, PF_INET6, IPPROTO_IPV6, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
#endif |
#endif |
|
sysctl_createv(clog, 0, NULL, NULL, |
|
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
|
CTLTYPE_INT, "neighborgcthresh", |
|
SYSCTL_DESCR("Maximum number of entries in neighbor" |
|
" cache"), |
|
NULL, 1, &ip6_neighborgcthresh, 0, |
|
CTL_NET, PF_INET6, IPPROTO_IPV6, |
|
CTL_CREATE, CTL_EOL); |
|
sysctl_createv(clog, 0, NULL, NULL, |
|
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
|
CTLTYPE_INT, "maxifprefixes", |
|
SYSCTL_DESCR("Maximum number of prefixes created by" |
|
" route advertisement per interface"), |
|
NULL, 1, &ip6_maxifprefixes, 0, |
|
CTL_NET, PF_INET6, IPPROTO_IPV6, |
|
CTL_CREATE, CTL_EOL); |
|
sysctl_createv(clog, 0, NULL, NULL, |
|
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
|
CTLTYPE_INT, "maxifdefrouters", |
|
SYSCTL_DESCR("Maximum number of default routers created" |
|
" by route advertisement per interface"), |
|
NULL, 1, &ip6_maxifdefrouters, 0, |
|
CTL_NET, PF_INET6, IPPROTO_IPV6, |
|
CTL_CREATE, CTL_EOL); |
|
sysctl_createv(clog, 0, NULL, NULL, |
|
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
|
CTLTYPE_INT, "maxdynroutes", |
|
SYSCTL_DESCR("Maximum number of routes created via" |
|
" redirect"), |
|
NULL, 1, &ip6_maxdynroutes, 0, |
|
CTL_NET, PF_INET6, IPPROTO_IPV6, |
|
CTL_CREATE, CTL_EOL); |
} |
} |
|
|
void |
void |