Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/libalias/alias_db.c
Show First 20 Lines • Show All 1,091 Lines • ▼ Show 20 Lines | if (new_lnk != NULL && | ||||
old_lnk->data.tcp->fwhole > 0) { | old_lnk->data.tcp->fwhole > 0) { | ||||
PunchFWHole(new_lnk); | PunchFWHole(new_lnk); | ||||
} | } | ||||
#endif | #endif | ||||
DeleteLink(&old_lnk); | DeleteLink(&old_lnk); | ||||
return (new_lnk); | return (new_lnk); | ||||
} | } | ||||
static struct alias_link * | |||||
_FindLinkOut(struct libalias *la, struct in_addr src_addr, | |||||
struct in_addr dst_addr, | |||||
u_short src_port, | |||||
u_short dst_port, | |||||
int link_type, | |||||
int replace_partial_links) | |||||
{ | |||||
u_int i; | |||||
struct alias_link *lnk; | |||||
#define OUTGUARD \ | #define OUTGUARD \ | ||||
if (lnk->src_port != src_port || \ | if (lnk->src_port != src_port || \ | ||||
lnk->src_addr.s_addr != src_addr.s_addr || \ | lnk->src_addr.s_addr != src_addr.s_addr || \ | ||||
lnk->dst_addr.s_addr != dst_addr.s_addr || \ | |||||
lnk->dst_port != dst_port || \ | |||||
lnk->link_type != link_type || \ | lnk->link_type != link_type || \ | ||||
lnk->server != NULL) \ | lnk->server != NULL) \ | ||||
continue; | continue; | ||||
LIBALIAS_LOCK_ASSERT(la); | static struct alias_link * | ||||
_SearchLinkOut(struct libalias *la, struct in_addr src_addr, | |||||
struct in_addr dst_addr, | |||||
u_short src_port, | |||||
u_short dst_port, | |||||
int link_type) { | |||||
u_int i; | |||||
struct alias_link *lnk; | |||||
i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type); | i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type); | ||||
LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) { | LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) { | ||||
OUTGUARD; | OUTGUARD; | ||||
if (lnk->dst_addr.s_addr == dst_addr.s_addr && | |||||
lnk->dst_port == dst_port) | |||||
break; | |||||
} | |||||
CleanupLink(la, &lnk); | CleanupLink(la, &lnk); | ||||
if (lnk != NULL) | if (lnk != NULL) | ||||
lnk->timestamp = LibAliasTime; | lnk->timestamp = LibAliasTime; | ||||
return (lnk); | |||||
} | |||||
return (NULL); | |||||
} | |||||
#undef OUTGUARD | |||||
static struct alias_link * | |||||
_FindLinkOut(struct libalias *la, struct in_addr src_addr, | |||||
struct in_addr dst_addr, | |||||
u_short src_port, | |||||
u_short dst_port, | |||||
int link_type, | |||||
int replace_partial_links) | |||||
{ | |||||
struct alias_link *lnk; | |||||
LIBALIAS_LOCK_ASSERT(la); | |||||
lnk = _SearchLinkOut(la, src_addr, dst_addr, src_port, dst_port, link_type); | |||||
/* Search for partially specified links. */ | /* Search for partially specified links. */ | ||||
if (lnk == NULL && replace_partial_links) { | if (lnk == NULL && replace_partial_links) { | ||||
if (dst_port != 0 && dst_addr.s_addr != INADDR_ANY) { | if (dst_port != 0 && dst_addr.s_addr != INADDR_ANY) { | ||||
lnk = _FindLinkOut(la, src_addr, dst_addr, src_port, 0, | lnk = _SearchLinkOut(la, src_addr, dst_addr, src_port, 0, | ||||
link_type, 0); | link_type); | ||||
if (lnk == NULL) | if (lnk == NULL) | ||||
lnk = _FindLinkOut(la, src_addr, ANY_ADDR, src_port, | lnk = _SearchLinkOut(la, src_addr, ANY_ADDR, src_port, | ||||
dst_port, link_type, 0); | dst_port, link_type); | ||||
} | } | ||||
if (lnk == NULL && | if (lnk == NULL && | ||||
(dst_port != 0 || dst_addr.s_addr != INADDR_ANY)) { | (dst_port != 0 || dst_addr.s_addr != INADDR_ANY)) { | ||||
lnk = _FindLinkOut(la, src_addr, ANY_ADDR, src_port, 0, | lnk = _SearchLinkOut(la, src_addr, ANY_ADDR, src_port, 0, | ||||
link_type, 0); | link_type); | ||||
} | } | ||||
if (lnk != NULL) { | if (lnk != NULL) { | ||||
lnk = ReLink(lnk, | lnk = ReLink(lnk, | ||||
src_addr, dst_addr, lnk->alias_addr, | src_addr, dst_addr, lnk->alias_addr, | ||||
src_port, dst_port, lnk->alias_port, | src_port, dst_port, lnk->alias_port, | ||||
link_type); | link_type); | ||||
} | } | ||||
} | } | ||||
#undef OUTGUARD | |||||
return (lnk); | return (lnk); | ||||
} | } | ||||
static struct alias_link * | static struct alias_link * | ||||
FindLinkOut(struct libalias *la, struct in_addr src_addr, | FindLinkOut(struct libalias *la, struct in_addr src_addr, | ||||
struct in_addr dst_addr, | struct in_addr dst_addr, | ||||
u_short src_port, | u_short src_port, | ||||
u_short dst_port, | u_short dst_port, | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | #define INGUARD \ | ||||
/* Search loop */ | /* Search loop */ | ||||
start_point = StartPointIn(alias_addr, alias_port, link_type); | start_point = StartPointIn(alias_addr, alias_port, link_type); | ||||
if (!(flags_in & LINK_PARTIALLY_SPECIFIED)) { | if (!(flags_in & LINK_PARTIALLY_SPECIFIED)) { | ||||
LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | ||||
INGUARD; | INGUARD; | ||||
if (lnk->dst_addr.s_addr == dst_addr.s_addr | if (lnk->dst_addr.s_addr == dst_addr.s_addr | ||||
&& lnk->dst_port == dst_port) { | && lnk->dst_port == dst_port) { | ||||
CleanupLink(la, &lnk); | CleanupLink(la, &lnk); | ||||
if (lnk != NULL) { | if (lnk != NULL) | ||||
lnk->timestamp = LibAliasTime; | lnk->timestamp = LibAliasTime; | ||||
return (lnk); | return (lnk); | ||||
} | |||||
} | } | ||||
} | } | ||||
} else { | } else { | ||||
LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | ||||
int flags = flags_in & LINK_PARTIALLY_SPECIFIED; | int flags = flags_in & LINK_PARTIALLY_SPECIFIED; | ||||
INGUARD; | INGUARD; | ||||
if (flags == LINK_PARTIALLY_SPECIFIED && | if (flags == LINK_PARTIALLY_SPECIFIED && | ||||
▲ Show 20 Lines • Show All 1,619 Lines • Show Last 20 Lines |