Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet/in_pcb.c
Show First 20 Lines • Show All 229 Lines • ▼ Show 20 Lines | in_pcblbgroup_alloc(struct inpcblbgrouphead *hdr, u_char vflag, | ||||
bytes = __offsetof(struct inpcblbgroup, il_inp[size]); | bytes = __offsetof(struct inpcblbgroup, il_inp[size]); | ||||
grp = malloc(bytes, M_PCB, M_ZERO | M_NOWAIT); | grp = malloc(bytes, M_PCB, M_ZERO | M_NOWAIT); | ||||
if (!grp) | if (!grp) | ||||
return (NULL); | return (NULL); | ||||
grp->il_vflag = vflag; | grp->il_vflag = vflag; | ||||
grp->il_lport = port; | grp->il_lport = port; | ||||
grp->il_dependladdr = *addr; | grp->il_dependladdr = *addr; | ||||
grp->il_inpsiz = size; | grp->il_inpsiz = size; | ||||
LIST_INSERT_HEAD(hdr, grp, il_list); | CK_LIST_INSERT_HEAD(hdr, grp, il_list); | ||||
return (grp); | return (grp); | ||||
} | } | ||||
static void | static void | ||||
in_pcblbgroup_free(struct inpcblbgroup *grp) | in_pcblbgroup_free_deferred(epoch_context_t ctx) | ||||
{ | { | ||||
struct inpcblbgroup *grp; | |||||
LIST_REMOVE(grp, il_list); | grp = __containerof(ctx, struct inpcblbgroup, il_epoch_ctx); | ||||
free(grp, M_PCB); | free(grp, M_PCB); | ||||
} | } | ||||
static void | |||||
in_pcblbgroup_free(struct inpcblbgroup *grp) | |||||
{ | |||||
CK_LIST_REMOVE(grp, il_list); | |||||
epoch_call(net_epoch_preempt, &grp->il_epoch_ctx, | |||||
in_pcblbgroup_free_deferred); | |||||
} | |||||
static struct inpcblbgroup * | static struct inpcblbgroup * | ||||
in_pcblbgroup_resize(struct inpcblbgrouphead *hdr, | in_pcblbgroup_resize(struct inpcblbgrouphead *hdr, | ||||
struct inpcblbgroup *old_grp, int size) | struct inpcblbgroup *old_grp, int size) | ||||
{ | { | ||||
struct inpcblbgroup *grp; | struct inpcblbgroup *grp; | ||||
int i; | int i; | ||||
grp = in_pcblbgroup_alloc(hdr, old_grp->il_vflag, | grp = in_pcblbgroup_alloc(hdr, old_grp->il_vflag, | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | if ((inp->inp_vflag & INP_IPV4) && | ||||
INP_CHECK_SOCKAF(inp->inp_socket, AF_INET6)) { | INP_CHECK_SOCKAF(inp->inp_socket, AF_INET6)) { | ||||
return (0); | return (0); | ||||
} | } | ||||
#endif | #endif | ||||
hdr = &pcbinfo->ipi_lbgrouphashbase[ | hdr = &pcbinfo->ipi_lbgrouphashbase[ | ||||
INP_PCBLBGROUP_PORTHASH(inp->inp_lport, | INP_PCBLBGROUP_PORTHASH(inp->inp_lport, | ||||
pcbinfo->ipi_lbgrouphashmask)]; | pcbinfo->ipi_lbgrouphashmask)]; | ||||
LIST_FOREACH(grp, hdr, il_list) { | CK_LIST_FOREACH(grp, hdr, il_list) { | ||||
if (grp->il_vflag == inp->inp_vflag && | if (grp->il_vflag == inp->inp_vflag && | ||||
grp->il_lport == inp->inp_lport && | grp->il_lport == inp->inp_lport && | ||||
memcmp(&grp->il_dependladdr, | memcmp(&grp->il_dependladdr, | ||||
&inp->inp_inc.inc_ie.ie_dependladdr, | &inp->inp_inc.inc_ie.ie_dependladdr, | ||||
sizeof(grp->il_dependladdr)) == 0) { | sizeof(grp->il_dependladdr)) == 0) { | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | in_pcbremlbgrouphash(struct inpcb *inp) | ||||
if (pcbinfo->ipi_lbgrouphashbase == NULL) | if (pcbinfo->ipi_lbgrouphashbase == NULL) | ||||
return; | return; | ||||
hdr = &pcbinfo->ipi_lbgrouphashbase[ | hdr = &pcbinfo->ipi_lbgrouphashbase[ | ||||
INP_PCBLBGROUP_PORTHASH(inp->inp_lport, | INP_PCBLBGROUP_PORTHASH(inp->inp_lport, | ||||
pcbinfo->ipi_lbgrouphashmask)]; | pcbinfo->ipi_lbgrouphashmask)]; | ||||
LIST_FOREACH(grp, hdr, il_list) { | CK_LIST_FOREACH(grp, hdr, il_list) { | ||||
for (i = 0; i < grp->il_inpcnt; ++i) { | for (i = 0; i < grp->il_inpcnt; ++i) { | ||||
if (grp->il_inp[i] != inp) | if (grp->il_inp[i] != inp) | ||||
continue; | continue; | ||||
if (grp->il_inpcnt == 1) { | if (grp->il_inpcnt == 1) { | ||||
/* We are the last, free this local group. */ | /* We are the last, free this local group. */ | ||||
in_pcblbgroup_free(grp); | in_pcblbgroup_free(grp); | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 1,546 Lines • ▼ Show 20 Lines | in_pcblookup_lbgroup(const struct inpcbinfo *pcbinfo, | ||||
* 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 group does not contain IPv4 mapped INET6 wild sockets | * - Load balanced group does not contain IPv4 mapped INET6 wild sockets | ||||
*/ | */ | ||||
local_wild = NULL; | local_wild = NULL; | ||||
LIST_FOREACH(grp, hdr, il_list) { | CK_LIST_FOREACH(grp, hdr, il_list) { | ||||
#ifdef INET6 | #ifdef INET6 | ||||
if (!(grp->il_vflag & INP_IPV4)) | if (!(grp->il_vflag & INP_IPV4)) | ||||
continue; | continue; | ||||
#endif | #endif | ||||
if (grp->il_lport != lport) | if (grp->il_lport != lport) | ||||
continue; | continue; | ||||
idx = INP_PCBLBGROUP_PKTHASH(faddr->s_addr, lport, fport) % | idx = INP_PCBLBGROUP_PKTHASH(faddr->s_addr, lport, fport) % | ||||
▲ Show 20 Lines • Show All 1,465 Lines • Show Last 20 Lines |