Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet6/in6_pcb.c
Show First 20 Lines • Show All 867 Lines • ▼ Show 20 Lines | in6_rtchange(struct inpcb *inp, int errno __unused) | ||||
return inp; | return inp; | ||||
} | } | ||||
static struct inpcb * | static struct inpcb * | ||||
in6_pcblookup_lbgroup(const struct inpcbinfo *pcbinfo, | in6_pcblookup_lbgroup(const struct inpcbinfo *pcbinfo, | ||||
const struct in6_addr *laddr, uint16_t lport, const struct in6_addr *faddr, | const struct in6_addr *laddr, uint16_t lport, const struct in6_addr *faddr, | ||||
uint16_t fport, int lookupflags) | uint16_t fport, int lookupflags) | ||||
{ | { | ||||
struct inpcb *local_wild = NULL; | struct inpcb *local_wild; | ||||
const struct inpcblbgrouphead *hdr; | const struct inpcblbgrouphead *hdr; | ||||
struct inpcblbgroup *grp; | struct inpcblbgroup *grp; | ||||
struct inpcblbgroup *grp_local_wild; | |||||
uint32_t idx; | uint32_t idx; | ||||
INP_HASH_LOCK_ASSERT(pcbinfo); | INP_HASH_LOCK_ASSERT(pcbinfo); | ||||
hdr = &pcbinfo->ipi_lbgrouphashbase[INP_PCBLBGROUP_PORTHASH( | hdr = &pcbinfo->ipi_lbgrouphashbase[INP_PCBLBGROUP_PORTHASH( | ||||
lport, pcbinfo->ipi_lbgrouphashmask)]; | lport, pcbinfo->ipi_lbgrouphashmask)]; | ||||
/* | /* | ||||
* Order of socket selection: | * Order of socket selection: | ||||
* 1. non-wild. | * 1. non-wild. | ||||
* 2. wild (if lookupflags contains INPLOOKUP_WILDCARD). | * 2. wild (if lookupflags contains INPLOOKUP_WILDCARD). | ||||
* | * | ||||
* NOTE: | * NOTE: | ||||
* - Load balanced group does not contain jailed sockets. | * - Load balanced group does not contain jailed sockets. | ||||
* - Load balanced does not contain IPv4 mapped INET6 wild sockets. | * - Load balanced does not contain IPv4 mapped INET6 wild sockets. | ||||
*/ | */ | ||||
local_wild = NULL; | |||||
CK_LIST_FOREACH(grp, hdr, il_list) { | CK_LIST_FOREACH(grp, hdr, il_list) { | ||||
#ifdef INET | #ifdef INET | ||||
if (!(grp->il_vflag & INP_IPV6)) | if (!(grp->il_vflag & INP_IPV6)) | ||||
continue; | continue; | ||||
#endif | #endif | ||||
if (grp->il_lport == lport) { | if (grp->il_lport != lport) | ||||
idx = 0; | continue; | ||||
int pkt_hash = INP_PCBLBGROUP_PKTHASH( | |||||
INP6_PCBHASHKEY(faddr), lport, fport); | |||||
idx = pkt_hash % grp->il_inpcnt; | idx = INP_PCBLBGROUP_PKTHASH(INP6_PCBHASHKEY(faddr), lport, | ||||
fport) % grp->il_inpcnt; | |||||
if (IN6_ARE_ADDR_EQUAL(&grp->il6_laddr, laddr)) { | if (IN6_ARE_ADDR_EQUAL(&grp->il6_laddr, laddr)) | ||||
return (grp->il_inp[idx]); | return (grp->il_inp[idx]); | ||||
} else { | |||||
if (IN6_IS_ADDR_UNSPECIFIED(&grp->il6_laddr) && | if (IN6_IS_ADDR_UNSPECIFIED(&grp->il6_laddr) && | ||||
(lookupflags & INPLOOKUP_WILDCARD)) { | (lookupflags & INPLOOKUP_WILDCARD) != 0) | ||||
local_wild = grp->il_inp[idx]; | local_wild = grp->il_inp[idx]; | ||||
grp_local_wild = grp; | |||||
} | } | ||||
} | |||||
} | |||||
} | |||||
if (local_wild != NULL) { | |||||
return (local_wild); | return (local_wild); | ||||
} | |||||
return (NULL); | |||||
} | } | ||||
#ifdef PCBGROUP | #ifdef PCBGROUP | ||||
/* | /* | ||||
* Lookup PCB in hash list, using pcbgroup tables. | * Lookup PCB in hash list, using pcbgroup tables. | ||||
*/ | */ | ||||
static struct inpcb * | static struct inpcb * | ||||
in6_pcblookup_group(struct inpcbinfo *pcbinfo, struct inpcbgroup *pcbgroup, | in6_pcblookup_group(struct inpcbinfo *pcbinfo, struct inpcbgroup *pcbgroup, | ||||
▲ Show 20 Lines • Show All 458 Lines • Show Last 20 Lines |