Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/libalias/alias_db.c
Show First 20 Lines • Show All 1,192 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int flags_in; | int flags_in; | ||||
u_int start_point; | u_int start_point; | ||||
struct alias_link *lnk; | struct alias_link *lnk; | ||||
struct alias_link *lnk_fully_specified; | struct alias_link *lnk_fully_specified; | ||||
struct alias_link *lnk_unknown_all; | struct alias_link *lnk_unknown_all; | ||||
struct alias_link *lnk_unknown_dst_addr; | struct alias_link *lnk_unknown_dst_addr; | ||||
struct alias_link *lnk_unknown_dst_port; | struct alias_link *lnk_unknown_dst_port; | ||||
struct in_addr src_addr; | |||||
u_short src_port; | |||||
LIBALIAS_LOCK_ASSERT(la); | LIBALIAS_LOCK_ASSERT(la); | ||||
/* Initialize pointers */ | /* Initialize pointers */ | ||||
lnk_fully_specified = NULL; | lnk_fully_specified = NULL; | ||||
lnk_unknown_all = NULL; | lnk_unknown_all = NULL; | ||||
lnk_unknown_dst_addr = NULL; | lnk_unknown_dst_addr = NULL; | ||||
lnk_unknown_dst_port = NULL; | lnk_unknown_dst_port = NULL; | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | LIST_FOREACH(lnk, &la->linkPartialIn[start_point], list_in) { | ||||
if (flags == LINK_UNKNOWN_DEST_PORT && | if (flags == LINK_UNKNOWN_DEST_PORT && | ||||
lnk->dst_addr.s_addr == dst_addr.s_addr) { | lnk->dst_addr.s_addr == dst_addr.s_addr) { | ||||
lnk_unknown_dst_port = lnk; | lnk_unknown_dst_port = lnk; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
#undef INGUARD | #undef INGUARD | ||||
if (lnk_unknown_dst_port != NULL) | lnk = (lnk_unknown_dst_port != NULL) ? lnk_unknown_dst_port | ||||
lnk = lnk_unknown_dst_port; | : (lnk_unknown_dst_addr != NULL) ? lnk_unknown_dst_addr | ||||
else if (lnk_unknown_dst_addr != NULL) | : lnk_unknown_all; | ||||
lnk = lnk_unknown_dst_addr; | |||||
else if (lnk_unknown_all != NULL) | |||||
lnk = lnk_unknown_all; | |||||
else | |||||
return (NULL); | |||||
if (replace_partial_links && | if (lnk == NULL || !replace_partial_links) | ||||
(lnk->flags & LINK_PARTIALLY_SPECIFIED || lnk->server != NULL)) { | return (lnk); | ||||
struct in_addr src_addr; | |||||
u_short src_port; | |||||
if (lnk->server != NULL) { /* LSNAT link */ | if (lnk->server != NULL) { /* LSNAT link */ | ||||
src_addr = lnk->server->addr; | src_addr = lnk->server->addr; | ||||
src_port = lnk->server->port; | src_port = lnk->server->port; | ||||
lnk->server = lnk->server->next; | lnk->server = lnk->server->next; | ||||
} else { | } else { | ||||
src_addr = lnk->src_addr; | src_addr = lnk->src_addr; | ||||
src_port = lnk->src_port; | src_port = lnk->src_port; | ||||
} | } | ||||
if (link_type == LINK_SCTP) { | if (link_type == LINK_SCTP) { | ||||
lnk->src_addr = src_addr; | lnk->src_addr = src_addr; | ||||
lnk->src_port = src_port; | lnk->src_port = src_port; | ||||
return (lnk); | } else { | ||||
} | |||||
lnk = ReLink(lnk, | lnk = ReLink(lnk, | ||||
src_addr, dst_addr, alias_addr, | src_addr, dst_addr, alias_addr, | ||||
src_port, dst_port, alias_port, | src_port, dst_port, alias_port, | ||||
link_type); | link_type); | ||||
} | } | ||||
return (lnk); | return (lnk); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,557 Lines • Show Last 20 Lines |