X-Git-Url: https://git.saurik.com/apple/network_cmds.git/blobdiff_plain/2b484d24084b903459c5b416c06cd77b48c748b9..342c141ecf761e55ea0f23a89d835a8544df5f2e:/alias/alias_db.c diff --git a/alias/alias_db.c b/alias/alias_db.c index 9d6b996..81dfff9 100644 --- a/alias/alias_db.c +++ b/alias/alias_db.c @@ -169,6 +169,7 @@ #include #include #include +#include #include #include @@ -272,8 +273,8 @@ static int iChatAVHack = 1; struct ack_data_record /* used to save changes to ACK/sequence numbers */ { - u_long ack_old; - u_long ack_new; + __uint32_t ack_old; + __uint32_t ack_new; int delta; int active; }; @@ -447,9 +448,11 @@ static u_int StartPointIn(struct in_addr, u_short, int); static u_int StartPointOut(struct in_addr, struct in_addr, u_short, u_short, int); -static int SeqDiff(u_long, u_long); +static int SeqDiff(__uint32_t, __uint32_t); +#ifndef DEBUG static void ShowAliasStats(void); +#endif #ifndef NO_FW_PUNCH /* Firewall control */ @@ -496,7 +499,7 @@ StartPointOut(struct in_addr src_addr, struct in_addr dst_addr, static int -SeqDiff(u_long x, u_long y) +SeqDiff(__uint32_t x, __uint32_t y) { /* Return the difference between two TCP sequence numbers */ @@ -509,6 +512,7 @@ SeqDiff(u_long x, u_long y) } +#ifndef DEBUG static void ShowAliasStats(void) { @@ -537,6 +541,7 @@ ShowAliasStats(void) fflush(monitorFile); } } +#endif @@ -596,6 +601,7 @@ FindLinkIn(struct in_addr, struct in_addr, u_short, u_short, int, int); #define GET_NEW_PORT_MAX_ATTEMPTS 20 #define GET_ALIAS_PORT -1 +#define GET_ALIAS_EPHEMERAL_PORT -2 #define GET_ALIAS_ID GET_ALIAS_PORT #define FIND_EVEN_ALIAS_BASE 1 @@ -605,6 +611,45 @@ FindLinkIn(struct in_addr, struct in_addr, u_short, u_short, int, int); another link concurrently. This is because GetNewPort() looks for unused triplets: (dest addr, dest port, alias port). */ +static int +GetEphemeralPort(struct alias_link *link) +{ + int i; + + /* Port number search */ + for (i=0; i < GET_NEW_PORT_MAX_ATTEMPTS; i++) + { + struct sockaddr_in sock_addr; + socklen_t salen; + u_short port_net; + struct alias_link *search_result; + + if (GetSocket(0, &link->sockfd, link->link_type) == 0) + return -1; + salen = sizeof(struct sockaddr_in); + if (getsockname(link->sockfd, (struct sockaddr *)&sock_addr, &salen) == -1) + return -1; + port_net = sock_addr.sin_port; + + search_result = FindLinkIn(link->dst_addr, link->alias_addr, + link->dst_port, port_net, + link->link_type, 0); + + if (search_result == NULL) { + link->alias_port = port_net; + return(0); + } + close(link->sockfd); + link->sockfd = -1; + } + #ifdef DEBUG + fprintf(stderr, "PacketAlias/GetEphemeralPort(): "); + fprintf(stderr, "could not find free port\n"); + #endif + + return(-1); +} + static int GetNewPort(struct alias_link *link, int alias_port_param) { @@ -613,6 +658,9 @@ GetNewPort(struct alias_link *link, int alias_port_param) u_short port_sys; u_short port_net; + if (alias_port_param == GET_ALIAS_EPHEMERAL_PORT) + return GetEphemeralPort(link); + /* Description of alias_port_param for GetNewPort(). When this parameter is zero or positive, it precisely specifies @@ -1957,16 +2005,18 @@ FindAliasPortOut(struct in_addr src_addr, struct in_addr dst_addr, u_short src_p link_type = LINK_TCP; break; default: - return NULL; + return 0; break; } #ifdef DEBUG { - int icount; + int icount = 0; - printf("PORTMAP::srcaddr = 0x%x.%d, dstaddr = 0x%x.%d link_type = %d, lifetime = %d\n", - src_addr.s_addr, src_port, dst_addr.s_addr, pub_port, link_type, lifetime); + printf("FindAliasPortOut:: srcaddr= %s:%u, ", + inet_ntoa(src_addr), ntohs(src_port)); + printf("dstadd= %s:%u link_type= %d, lifetime= %d\n", + inet_ntoa(dst_addr), ntohs(pub_port), link_type, lifetime); for (i=0; isrc_addr.s_addr,link->src_port,link->dst_addr.s_addr,link->dst_port, link->alias_addr.s_addr,link->alias_port, - link->link_type); - + char src_str[32], dst_str[32], alias_str[32]; + + snprintf(src_str, sizeof(src_str), "%s:%u", + inet_ntoa(link->src_addr), ntohs(link->src_port)); + snprintf(dst_str, sizeof(dst_str), "%s:%u", + inet_ntoa(link->dst_addr), ntohs(link->dst_port)); + snprintf(alias_str, sizeof(alias_str), "%s:%u", + inet_ntoa(link->alias_addr), ntohs(link->alias_port)); + + printf(" linkTableOut[%d:%d] src= %s dst= %s alias= %s flags= 0x%x linktype= %d ts= %d exp= %d fd= %d\n", + i, icount, src_str, dst_str, alias_str, + link->flags, link->link_type, link->timestamp, link->expire_time, link->sockfd); + link_next = LIST_NEXT(link, list_out); icount++; link = link_next; @@ -2004,20 +2062,22 @@ FindAliasPortOut(struct in_addr src_addr, struct in_addr dst_addr, u_short src_p { struct in_addr alias_addr; #ifdef DEBUG - printf("PORTMAP:: cannot find mapping, adding mapping private port =%d, public port = %d\n",src_port, pub_port); + printf("PORTMAP:: cannot find mapping, adding mapping private port =%d, public port = %d\n", + src_port, pub_port); #endif /* address/port in not in list, create new mapping */ alias_addr = FindAliasAddress(src_addr); /* create new mapping */ - if ( !pub_port ) - pub_port = GET_ALIAS_PORT; link = AddLink(src_addr, dst_addr, alias_addr, - src_port, 0, pub_port, + src_port, 0, GET_ALIAS_EPHEMERAL_PORT, link_type); - if ( link != NULL ) + if ( link != NULL ) { /* link was create, set new lifetime */ SetExpire(link, lifetime); + /* Prevent link deletion when incoming connection arrive */ + link->flags |= LINK_CONE; + } } if ( link ) { @@ -2255,7 +2315,7 @@ packet size was altered is searched. int i; struct tcphdr *tc; int delta, ack_diff_min; - u_long ack; + __uint32_t ack; tc = (struct tcphdr *) ((char *) pip + (pip->ip_hl << 2)); ack = tc->th_ack; @@ -2306,7 +2366,7 @@ packet size was altered is searched. int i; struct tcphdr *tc; int delta, seq_diff_min; - u_long seq; + __uint32_t seq; tc = (struct tcphdr *) ((char *) pip + (pip->ip_hl << 2)); seq = tc->th_seq; @@ -3001,3 +3061,36 @@ PacketAliasSetFWBase(unsigned int base, unsigned int num) { fireWallNumNums = num; #endif } + +void +DumpInfo(void) +{ + int i, icount = 0; + struct alias_link *link; + + for (i=0; isrc_addr), ntohs(link->src_port)); + snprintf(dst_str, sizeof(dst_str), "%s:%u", + inet_ntoa(link->dst_addr), ntohs(link->dst_port)); + snprintf(alias_str, sizeof(alias_str), "%s:%u", + inet_ntoa(link->alias_addr), ntohs(link->alias_port)); + + syslog(LOG_ERR, " linkTableOut[%d:%d] src= %s dst= %s alias= %s flags= 0x%x linktype= %d ts= %d exp= %d fd= %d", + i, icount, src_str, dst_str, alias_str, + link->flags, link->link_type, link->timestamp, link->expire_time, link->sockfd); + + link_next = LIST_NEXT(link, list_out); + icount++; + link = link_next; + } + } + +}