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 | |||||