Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/libalias/alias_db.c
Show First 20 Lines • Show All 396 Lines • ▼ Show 20 Lines | |||||
/* Log file control */ | /* Log file control */ | ||||
static void ShowAliasStats(struct libalias *); | static void ShowAliasStats(struct libalias *); | ||||
static int InitPacketAliasLog(struct libalias *); | static int InitPacketAliasLog(struct libalias *); | ||||
static void UninitPacketAliasLog(struct libalias *); | static void UninitPacketAliasLog(struct libalias *); | ||||
void SctpShowAliasStats(struct libalias *la); | void SctpShowAliasStats(struct libalias *la); | ||||
static u_int | static u_int | ||||
StartPartialIn(u_short alias_port, int link_type) | |||||
{ | |||||
return (link_type == LINK_PPTP) ? 0 | |||||
: (alias_port % LINK_PARTIAL_SIZE); | |||||
} | |||||
static u_int | |||||
StartPointIn(struct in_addr alias_addr, | StartPointIn(struct in_addr alias_addr, | ||||
u_short alias_port, | u_short alias_port, | ||||
int link_type) | int link_type) | ||||
{ | { | ||||
u_int n; | u_int n; | ||||
n = alias_addr.s_addr; | n = alias_addr.s_addr; | ||||
if (link_type != LINK_PPTP) | if (link_type != LINK_PPTP) | ||||
▲ Show 20 Lines • Show All 618 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
/* Set up pointers for output lookup table */ | /* Set up pointers for output lookup table */ | ||||
start_point = StartPointOut(src_addr, dst_addr, | start_point = StartPointOut(src_addr, dst_addr, | ||||
src_port, dst_port, link_type); | src_port, dst_port, link_type); | ||||
LIST_INSERT_HEAD(&la->linkTableOut[start_point], lnk, list_out); | LIST_INSERT_HEAD(&la->linkTableOut[start_point], lnk, list_out); | ||||
/* Set up pointers for input lookup table */ | /* Set up pointers for input lookup table */ | ||||
if (lnk->flags & LINK_PARTIALLY_SPECIFIED) { | |||||
start_point = StartPartialIn(lnk->alias_port, link_type); | |||||
LIST_INSERT_HEAD(&la->linkPartialIn[start_point], lnk, list_in); | |||||
} else { | |||||
start_point = StartPointIn(alias_addr, lnk->alias_port, link_type); | start_point = StartPointIn(alias_addr, lnk->alias_port, link_type); | ||||
LIST_INSERT_HEAD(&la->linkTableIn[start_point], lnk, list_in); | LIST_INSERT_HEAD(&la->linkTableIn[start_point], lnk, list_in); | ||||
} | |||||
/* Include the element into the housekeeping list */ | /* Include the element into the housekeeping list */ | ||||
TAILQ_INSERT_TAIL(&la->checkExpire, lnk, list_expire); | TAILQ_INSERT_TAIL(&la->checkExpire, lnk, list_expire); | ||||
} else { | } else { | ||||
#ifdef LIBALIAS_DEBUG | #ifdef LIBALIAS_DEBUG | ||||
fprintf(stderr, "PacketAlias/AddLink(): "); | fprintf(stderr, "PacketAlias/AddLink(): "); | ||||
fprintf(stderr, "malloc() call failed.\n"); | fprintf(stderr, "malloc() call failed.\n"); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | if (lnk->alias_port != alias_port || \ | ||||
lnk->alias_addr.s_addr != alias_addr.s_addr) \ | lnk->alias_addr.s_addr != alias_addr.s_addr) \ | ||||
continue; | continue; | ||||
/* 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->flags & LINK_PARTIALLY_SPECIFIED) | |||||
continue; | |||||
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 { | ||||
LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) { | ||||
int flags; | int flags = flags_in & LINK_PARTIALLY_SPECIFIED; | ||||
INGUARD; | INGUARD; | ||||
flags = flags_in | lnk->flags; | if (flags == LINK_PARTIALLY_SPECIFIED && | ||||
if ((flags & LINK_UNKNOWN_DEST_ADDR) | lnk_unknown_all == NULL) | ||||
&& (flags & LINK_UNKNOWN_DEST_PORT)) { | |||||
if (lnk_unknown_all == NULL) | |||||
lnk_unknown_all = lnk; | lnk_unknown_all = lnk; | ||||
} else if (flags & LINK_UNKNOWN_DEST_ADDR) { | if (flags == LINK_UNKNOWN_DEST_ADDR && | ||||
if (lnk->dst_port == dst_port) { | lnk->dst_port == dst_port && | ||||
if (lnk_unknown_dst_addr == NULL) | lnk_unknown_dst_addr == NULL) | ||||
lnk_unknown_dst_addr = lnk; | lnk_unknown_dst_addr = lnk; | ||||
} | if (flags == LINK_UNKNOWN_DEST_PORT && | ||||
} else if (flags & LINK_UNKNOWN_DEST_PORT) { | lnk->dst_addr.s_addr == dst_addr.s_addr) { | ||||
if (lnk->dst_addr.s_addr == dst_addr.s_addr) { | |||||
if (lnk_unknown_dst_port == NULL) | |||||
lnk_unknown_dst_port = lnk; | lnk_unknown_dst_port = lnk; | ||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
start_point = StartPartialIn(alias_port, link_type); | |||||
LIST_FOREACH(lnk, &la->linkPartialIn[start_point], list_in) { | |||||
int flags = (flags_in | lnk->flags) & LINK_PARTIALLY_SPECIFIED; | |||||
INGUARD; | |||||
if (flags == LINK_PARTIALLY_SPECIFIED && | |||||
lnk_unknown_all == NULL) | |||||
lnk_unknown_all = lnk; | |||||
if (flags == LINK_UNKNOWN_DEST_ADDR && | |||||
lnk->dst_port == dst_port && | |||||
lnk_unknown_dst_addr == NULL) | |||||
lnk_unknown_dst_addr = lnk; | |||||
if (flags == LINK_UNKNOWN_DEST_PORT && | |||||
lnk->dst_addr.s_addr == dst_addr.s_addr) { | |||||
lnk_unknown_dst_port = lnk; | |||||
break; | |||||
} | |||||
} | |||||
#undef INGUARD | #undef INGUARD | ||||
if (lnk_unknown_dst_port != NULL) | if (lnk_unknown_dst_port != NULL) | ||||
lnk = lnk_unknown_dst_port; | lnk = lnk_unknown_dst_port; | ||||
else if (lnk_unknown_dst_addr != NULL) | else if (lnk_unknown_dst_addr != NULL) | ||||
lnk = lnk_unknown_dst_addr; | lnk = lnk_unknown_dst_addr; | ||||
else if (lnk_unknown_all != NULL) | else if (lnk_unknown_all != NULL) | ||||
lnk = lnk_unknown_all; | lnk = lnk_unknown_all; | ||||
▲ Show 20 Lines • Show All 350 Lines • ▼ Show 20 Lines | FindPptpOutByPeerCallId(struct libalias *la, struct in_addr src_addr, | ||||
return (lnk); | return (lnk); | ||||
} | } | ||||
struct alias_link * | struct alias_link * | ||||
FindPptpInByCallId(struct libalias *la, struct in_addr dst_addr, | FindPptpInByCallId(struct libalias *la, struct in_addr dst_addr, | ||||
struct in_addr alias_addr, | struct in_addr alias_addr, | ||||
u_int16_t dst_call_id) | u_int16_t dst_call_id) | ||||
{ | { | ||||
u_int i; | |||||
struct alias_link *lnk; | struct alias_link *lnk; | ||||
LIBALIAS_LOCK_ASSERT(la); | LIBALIAS_LOCK_ASSERT(la); | ||||
i = StartPointIn(alias_addr, 0, LINK_PPTP); | LIST_FOREACH(lnk, &la->linkPartialIn[0], list_in) | ||||
LIST_FOREACH(lnk, &la->linkTableIn[i], list_in) | |||||
if (lnk->link_type == LINK_PPTP && | if (lnk->link_type == LINK_PPTP && | ||||
lnk->dst_addr.s_addr == dst_addr.s_addr && | lnk->dst_addr.s_addr == dst_addr.s_addr && | ||||
lnk->alias_addr.s_addr == alias_addr.s_addr && | lnk->alias_addr.s_addr == alias_addr.s_addr && | ||||
lnk->dst_port == dst_call_id) | lnk->dst_port == dst_call_id) | ||||
break; | break; | ||||
CleanupLink(la, &lnk); | CleanupLink(la, &lnk); | ||||
return (lnk); | return (lnk); | ||||
▲ Show 20 Lines • Show All 813 Lines • ▼ Show 20 Lines | |||||
#else | #else | ||||
LibAliasTime = time(NULL); | LibAliasTime = time(NULL); | ||||
#endif | #endif | ||||
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) | for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) | ||||
LIST_INIT(&la->linkTableOut[i]); | LIST_INIT(&la->linkTableOut[i]); | ||||
for (i = 0; i < LINK_TABLE_IN_SIZE; i++) | for (i = 0; i < LINK_TABLE_IN_SIZE; i++) | ||||
LIST_INIT(&la->linkTableIn[i]); | LIST_INIT(&la->linkTableIn[i]); | ||||
for (i = 0; i < LINK_PARTIAL_SIZE; i++) | |||||
LIST_INIT(&la->linkPartialIn[i]); | |||||
TAILQ_INIT(&la->checkExpire); | TAILQ_INIT(&la->checkExpire); | ||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
AliasSctpInit(la); | AliasSctpInit(la); | ||||
#endif | #endif | ||||
LIBALIAS_LOCK_INIT(la); | LIBALIAS_LOCK_INIT(la); | ||||
LIBALIAS_LOCK(la); | LIBALIAS_LOCK(la); | ||||
} else { | } else { | ||||
LIBALIAS_LOCK(la); | LIBALIAS_LOCK(la); | ||||
▲ Show 20 Lines • Show All 386 Lines • Show Last 20 Lines |