33#include <machine/stdarg.h>
35#include <sys/kernel.h>
38#include <sys/module.h>
39#include <sys/rwlock.h>
40#include <sys/syslog.h>
50#include <sys/socket.h>
76alias_mod_handler(module_t mod,
int type,
void *data)
90 "alias", alias_mod_handler, NULL
111 grp = SPLAY_FIND(splay_in, &la->linkSplayIn, &needle);
112 if (grp != NULL || !create || (grp = malloc(
sizeof(*grp))) == NULL)
117 LIST_INIT(&grp->full);
119 SPLAY_INSERT(splay_in, &la->linkSplayIn, grp);
130 return (ntohl(y) - ntohl(x));
139 va_start(ap, format);
145AliasLog(FILE *stream,
const char *format, ...)
149 va_start(ap, format);
150 vfprintf(stream, format, ap);
169 "icmp=%u, udp=%u, tcp=%u, sctp=%u, pptp=%u, proto=%u, frag_id=%u frag_ptr=%u / tot=%u",
226 if (alias_port_param >= 0 && alias_port_param < 0x10000) {
232 fprintf(stderr,
"PacketAlias/GetNewPort(): ");
233 fprintf(stderr,
"input parameter error\n");
251 for (i = 0; i < max_trials; i++, port =
_RandomPort(la)) {
259 LIST_FOREACH(search_result, &grp->full,
all.in) {
264 if (search_result == NULL)
268 if (i >= max_trials) {
270 fprintf(stderr,
"PacketAlias/GetNewPort(): ");
271 fprintf(stderr,
"could not find free port\n");
276#ifndef NO_USE_SOCKETS
291#ifndef NO_USE_SOCKETS
301 sock = socket(AF_INET, SOCK_STREAM, 0);
303 sock = socket(AF_INET, SOCK_DGRAM, 0);
306 fprintf(stderr,
"PacketAlias/GetSocket(): ");
307 fprintf(stderr,
"incorrect link type\n");
314 fprintf(stderr,
"PacketAlias/GetSocket(): ");
315 fprintf(stderr,
"socket() error %d\n", *sockfd);
324 (
struct sockaddr *)&sock_addr,
394 for (i = 0; i < max_trials; i++, port =
_RandomPort(la)) {
398 port &= htons(0xfffe);
400 for (j = 0; j < port_count; j++) {
401 u_short port_j = ntohs(port) + j;
415 fprintf(stderr,
"PacketAlias/FindNewPortGroup(): ");
416 fprintf(stderr,
"could not find free port(s)\n");
430 TAILQ_FOREACH_SAFE(lnk, &
la->checkExpire,
expire.list, lnk_tmp)
438 if (lnk == NULL || *lnk == NULL)
441 if (
LibAliasTime - (*lnk)->timestamp > (*lnk)->expire.time) {
448 TAILQ_REMOVE(&
la->checkExpire, (*lnk),
expire.list);
449 TAILQ_INSERT_TAIL(&
la->checkExpire, (*lnk),
expire.list);
479 LIST_REMOVE(lnk, pptp.list);
485 if (lnk->
server != NULL) {
488 head = curr = lnk->
server;
492 }
while ((curr =
next) != head);
495 SPLAY_REMOVE(splay_out, &la->linkSplayOut, lnk);
499 LIST_REMOVE(lnk, all.in);
504 LIST_EMPTY(&grp->full) &&
506 SPLAY_REMOVE(splay_in, &la->linkSplayIn, grp);
514 TAILQ_REMOVE(&la->checkExpire, lnk,
expire.list);
516#ifndef NO_USE_SOCKETS
575 fprintf(stderr,
"PacketAlias/AddLink(): ");
576 fprintf(stderr,
"malloc() call failed.\n");
591#ifndef NO_USE_SOCKETS
643 aux_tcp = malloc(
sizeof(
struct tcp_dat));
644 if (aux_tcp == NULL) {
646 fprintf(stderr,
"PacketAlias/AddLink: ");
647 fprintf(stderr,
" cannot allocate auxiliary TCP data\n");
682 LIST_INSERT_HEAD(&la->pptpList, lnk, pptp.list);
694 SPLAY_INSERT(splay_out, &la->linkSplayOut, lnk);
698 LIST_INSERT_HEAD(&grp->
partial, lnk, all.in);
700 LIST_INSERT_HEAD(&grp->full, lnk, all.in);
706 TAILQ_INSERT_TAIL(&la->checkExpire, lnk,
expire.list);
725 int alias_port_param,
733 new_lnk =
AddLink(la, src_addr, dst_addr, alias_addr,
734 src_port, dst_port, alias_port_param,
737 if (new_lnk != NULL &&
762 lnk = SPLAY_FIND(splay_out, &
la->linkSplayOut, &needle);
772 int replace_partial_links)
778 if (lnk != NULL || !replace_partial_links)
809 int replace_partial_links)
839 int replace_partial_links)
852 lnk_unknown_all = NULL;
853 lnk_unknown_dst_addr = NULL;
854 lnk_unknown_dst_port = NULL;
865 grp =
StartPointIn(la, alias_addr, alias_port, link_type, 0);
871 LIST_FOREACH(lnk, &grp->full, all.in) {
878 LIST_FOREACH(lnk, &grp->full, all.in) {
880 lnk_unknown_dst_port = lnk;
886 LIST_FOREACH(lnk, &grp->full, all.in) {
888 lnk_unknown_dst_addr = lnk;
894 lnk_unknown_all = LIST_FIRST(&grp->full);
898 if (lnk_unknown_dst_port == NULL) {
899 LIST_FOREACH(lnk, &grp->
partial, all.in) {
903 lnk_unknown_all == NULL)
904 lnk_unknown_all = lnk;
907 lnk_unknown_dst_addr == NULL)
908 lnk_unknown_dst_addr = lnk;
911 lnk_unknown_dst_port = lnk;
917 lnk = (lnk_unknown_dst_port != NULL) ? lnk_unknown_dst_port
918 : (lnk_unknown_dst_addr != NULL) ? lnk_unknown_dst_addr
921 if (lnk == NULL || !replace_partial_links)
924 if (lnk->
server != NULL) {
938 src_addr, dst_addr, alias_addr,
939 src_port, dst_port, alias_port,
951 int replace_partial_links)
1007 lnk =
AddLink(la, target_addr, dst_addr, alias_addr,
1026 if (lnk == NULL && create) {
1030 lnk =
AddLink(la, src_addr, dst_addr, alias_addr,
1104 lnk =
AddLink(la, target_addr, dst_addr, alias_addr,
1127 lnk =
AddLink(la, src_addr, dst_addr, alias_addr,
1166 lnk =
AddLink(la, target_addr, dst_addr, alias_addr,
1167 alias_port, dst_port, alias_port,
1199 if (lnk == NULL && create) {
1203 lnk =
AddLink(la, src_addr, dst_addr, alias_addr,
1214 u_int16_t src_call_id)
1229 u_int16_t src_call_id)
1234 LIST_FOREACH(lnk, &
la->pptpList,
pptp.list)
1246 u_int16_t dst_call_id)
1251 LIST_FOREACH(lnk, &
la->pptpList,
pptp.list)
1263 u_int16_t dst_call_id)
1269 LIST_FOREACH(lnk, &
la->pptpList,
pptp.list)
1270 if (lnk->
dst_port == dst_call_id &&
1281 u_int16_t alias_call_id)
1286 LIST_FOREACH(lnk, &
la->pptpList,
pptp.list)
1324 lnk =
AddLink(la, src_addr, dst_addr, alias_addr,
1325 src_port, 0, alias_port,
1348 if (lnk->
server != NULL) {
1356 la->aliasAddress : alias_addr;
1437 panic(
"libalias:SetStateIn() unknown state");
1462 panic(
"libalias:SetStateOut() unknown state");
1488 return (lnk->la->aliasAddress);
1490 return (lnk->src_addr);
1496 return (lnk->dst_addr);
1503 return (lnk->la->aliasAddress);
1505 return (lnk->alias_addr);
1512 return (la->aliasAddress);
1553 return (lnk->proxy_addr);
1591 int delta, ack_diff_min;
1607 if (ack_diff >= 0) {
1608 if (ack_diff_min >= 0) {
1609 if (ack_diff < ack_diff_min) {
1611 ack_diff_min = ack_diff;
1615 ack_diff_min = ack_diff;
1633 int delta, seq_diff_min;
1649 if (seq_diff >= 0) {
1650 if (seq_diff_min >= 0) {
1651 if (seq_diff < seq_diff_min) {
1653 seq_diff_min = seq_diff;
1657 seq_diff_min = seq_diff;
1673 u_long th_seq, u_int th_off)
1676 int hlen, tlen, dlen;
1679 hlen = (
ip_hl + th_off) << 2;
1683 x.
ack_old = htonl(ntohl(th_seq) + dlen);
1702 lnk->
flags &= ~LINK_PERMANENT;
1704 }
else if (
expire == -1) {
1709#ifdef LIBALIAS_DEBUG
1710 fprintf(stderr,
"PacketAlias/SetExpire(): ");
1711 fprintf(stderr,
"error in expire parameter\n");
1755 static unsigned int packets = 0;
1756 static unsigned int packet_limit = 1000;
1772 if (packet_limit <= 1 || packets % packet_limit == 0) {
1782 packet_limit = packets / 3;
1790 struct alias_link * lnk = TAILQ_FIRST(&
la->checkExpire);
1806 if ((
la->
logDesc = fopen(
"/var/log/alias.log",
"w")))
1807 fprintf(
la->
logDesc,
"PacketAlias/InitPacketAliasLog: Packet alias logging enabled.\n");
1874#ifdef LIBALIAS_DEBUG
1875 fprintf(stderr,
"PacketAliasRedirectPort(): ");
1876 fprintf(stderr,
"only SCTP, TCP and UDP protocols allowed\n");
1889#ifdef LIBALIAS_DEBUG
1891 fprintf(stderr,
"PacketAliasRedirectPort(): "
1892 "call to AddLink() failed\n");
1930 SPLAY_REMOVE(splay_out, &la->linkSplayOut, lnk);
1934 for (s = head; s->
next != head; s = s->
next)
1966#ifdef LIBALIAS_DEBUG
1968 fprintf(stderr,
"PacketAliasRedirectProto(): "
1969 "call to AddLink() failed\n");
1992#ifdef LIBALIAS_DEBUG
1994 fprintf(stderr,
"PacketAliasRedirectAddr(): "
1995 "call to AddLink() failed\n");
2015 lnk->
flags &= ~LINK_PERMANENT;
2073 while (!LIST_EMPTY(&instancehead))
2083 la = malloc(
sizeof *la, M_ALIAS, M_WAITOK | M_ZERO);
2085 la = calloc(
sizeof *la, 1);
2092 if (LIST_EMPTY(&instancehead))
2095 LIST_INSERT_HEAD(&instancehead, la, instancelist);
2103 SPLAY_INIT(&la->linkSplayIn);
2104 SPLAY_INIT(&la->linkSplayOut);
2105 LIST_INIT(&la->pptpList);
2106 TAILQ_INIT(&la->checkExpire);
2137#ifndef NO_USE_SOCKETS
2138 | PKT_ALIAS_USE_SOCKETS
2163 LIST_REMOVE(la, instancelist);
2190 if (flags & mask & PKT_ALIAS_PUNCH_FW)
2193 else if (~flags & mask & PKT_ALIAS_PUNCH_FW)
2228 bzero(cmd,
sizeof(*cmd));
2238 int flags, u_int16_t arg)
2240 cmd->opcode = opcode;
2267 struct in_addr sa, u_int16_t sp,
struct in_addr da, u_int16_t dp)
2269 struct ip_fw *
rule = (
struct ip_fw *)buf;
2272 bzero(buf, bufsize);
2273 rule->rulenum = rulenum;
2281 rule->act_ofs = (u_int32_t *)cmd - (u_int32_t *)
rule->cmd;
2284 rule->cmd_len = (u_int32_t *)cmd - (u_int32_t *)
rule->cmd;
2286 return ((
char *)cmd - (
char *)buf);
2296 la->
fireWallFD = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
2344 fwhole < la->fireWallActiveNum &&
2350#ifdef LIBALIAS_DEBUG
2351 fprintf(stderr,
"libalias: Unable to create firewall hole!\n");
2366 u_int32_t rulebuf[255];
2369 i =
fill_rule(rulebuf,
sizeof(rulebuf), fwhole,
2375 err(1,
"alias punch inbound(1) setsockopt(IP_FW_ADD)");
2377 i =
fill_rule(rulebuf,
sizeof(rulebuf), fwhole,
2383 err(1,
"alias punch inbound(2) setsockopt(IP_FW_ADD)");
2408 &fwhole,
sizeof fwhole));
2465 lnk =
FindLinkIn(la, sm->ip_hdr->ip_src, sm->ip_hdr->ip_dst,
2466 sm->sctp_hdr->dest_port,sm->sctp_hdr->dest_port,
LINK_SCTP, 1);
2475 lnk =
FindLinkIn(la, sm->ip_hdr->ip_src, sm->ip_hdr->ip_dst,
int LibAliasRefreshModules(void)
#define PKT_ALIAS_DENY_INCOMING
#define LIBALIAS_BUF_SIZE
#define PKT_ALIAS_RESET_ON_ADDR_CHANGE
#define PKT_ALIAS_SAME_PORTS
struct in_addr FindOriginalAddress(struct libalias *la, struct in_addr alias_addr)
void LibAliasSetTarget(struct libalias *la, struct in_addr target_addr)
struct alias_link * FindUdpTcpIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short dst_port, u_short alias_port, u_char proto, int create)
static struct alias_link * _FindLinkIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short dst_port, u_short alias_port, int link_type, int replace_partial_links)
unsigned int LibAliasSetMode(struct libalias *la, unsigned int flags, unsigned int mask)
void SetFragmentAddr(struct alias_link *lnk, struct in_addr src_addr)
struct alias_link * LibAliasRedirectPort(struct libalias *la, struct in_addr src_addr, u_short src_port, struct in_addr dst_addr, u_short dst_port, struct in_addr alias_addr, u_short alias_port, u_char proto)
void LibAliasRedirectDelete(struct libalias *la, struct alias_link *lnk)
static void UninitPacketAliasLog(struct libalias *la)
u_short GetAliasPort(struct alias_link *lnk)
struct alias_link * FindProtoIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_char proto)
void SetProxyAddress(struct alias_link *lnk, struct in_addr addr)
void SetFragmentPtr(struct alias_link *lnk, void *fptr)
int GetAckModified(struct alias_link *lnk)
void PunchFWHole(struct alias_link *lnk)
static struct alias_link * ReLink(struct alias_link *old_lnk, struct in_addr src_addr, struct in_addr dst_addr, struct in_addr alias_addr, u_short src_port, u_short dst_port, int alias_port_param, int link_type, int deletePermanent)
struct alias_link * LibAliasRedirectAddr(struct libalias *la, struct in_addr src_addr, struct in_addr alias_addr)
void SetStateIn(struct alias_link *lnk, int state)
u_short GetProxyPort(struct alias_link *lnk)
static moduledata_t alias_mod
static void UninitPunchFW(struct libalias *la)
struct libalias * LibAliasInit(struct libalias *la)
void LibAliasSetSkinnyPort(struct libalias *la, unsigned int port)
int GetDeltaAckIn(u_long ack, struct alias_link *lnk)
static void CleanupLink(struct libalias *la, struct alias_link **lnk, int deletePermanent)
static int fill_rule(void *buf, int bufsize, int rulenum, enum ipfw_opcodes action, int proto, struct in_addr sa, u_int16_t sp, struct in_addr da, u_int16_t dp)
void SetStateOut(struct alias_link *lnk, int state)
struct in_addr GetAliasAddress(struct alias_link *lnk)
static int GetNewPort(struct libalias *la, struct alias_link *lnk, int alias_port_param)
void SetDefaultAliasAddress(struct libalias *la, struct in_addr alias_addr)
static void ShowAliasStats(struct libalias *la)
void LibAliasSetAliasPortRange(struct libalias *la, u_short port_low, u_short port_high)
struct alias_link * FindPptpOutByPeerCallId(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_int16_t dst_call_id)
struct alias_link * FindIcmpIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short id_alias, int create)
static void ClearAllFWHoles(struct libalias *la)
SPLAY_GENERATE(splay_out, alias_link, all.out, cmp_out)
static ipfw_insn * next_cmd(ipfw_insn *cmd)
void LibAliasSetFWBase(struct libalias *la, unsigned int base, unsigned int num)
static u_short _RandomPort(struct libalias *la)
static void ClearFWHole(struct alias_link *lnk)
struct in_addr GetDestAddress(struct alias_link *lnk)
void GetFragmentAddr(struct alias_link *lnk, struct in_addr *src_addr)
int LibAliasAddServer(struct libalias *la, struct alias_link *lnk, struct in_addr addr, u_short port)
struct in_addr FindAliasAddress(struct libalias *la, struct in_addr original_addr)
struct alias_link * FindFragmentIn2(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short ip_id)
struct alias_link * FindFragmentIn1(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short ip_id)
void SetExpire(struct alias_link *lnk, int expire)
struct alias_link * FindPptpInByPeerCallId(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_int16_t alias_call_id)
struct alias_link * FindPptpOutByCallId(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_int16_t src_call_id)
struct in_addr GetProxyAddress(struct alias_link *lnk)
struct alias_link * AddPptp(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, struct in_addr alias_addr, u_int16_t src_call_id)
struct alias_link * FindIcmpOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short id, int create)
struct alias_link * FindProtoOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_char proto)
static struct alias_link * UseLink(struct libalias *la, struct alias_link *lnk)
int GetProtocolFlags(struct alias_link *lnk)
struct alias_link * FindPptpInByCallId(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_int16_t dst_call_id)
int GetStateOut(struct alias_link *lnk)
void GetFragmentPtr(struct alias_link *lnk, void **fptr)
static void finishoff(void)
struct alias_link * AddFragmentPtrLink(struct libalias *la, struct in_addr dst_addr, u_short ip_id)
struct alias_link * FindRtspOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short src_port, u_short alias_port, u_char proto)
static ipfw_insn * fill_one_port(ipfw_insn *cmd1, enum ipfw_opcodes opcode, u_int16_t port)
void HouseKeeping(struct libalias *la)
int LibAliasRedirectDynamic(struct libalias *la, struct alias_link *lnk)
void LibAliasUninit(struct libalias *la)
static ipfw_insn * fill_cmd(ipfw_insn *cmd, enum ipfw_opcodes opcode, int size, int flags, u_int16_t arg)
static void AliasLog(char *str, const char *format,...)
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)
static int SeqDiff(u_long x, u_long y)
int GetStateIn(struct alias_link *lnk)
static int InitPacketAliasLog(struct libalias *la)
static void DeleteLink(struct alias_link **plnk, int deletePermanent)
struct in_addr GetOriginalAddress(struct alias_link *lnk)
static u_short GetDestPort(struct alias_link *lnk)
static void CleanupAliasData(struct libalias *la, int deletePermanent)
static void InitPunchFW(struct libalias *la)
static LIST_HEAD(MODULE_VERSION(libalias)
void SetAckModified(struct alias_link *lnk)
static struct alias_link * FindLinkIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short dst_port, u_short alias_port, int link_type, int replace_partial_links)
void SetDestCallId(struct alias_link *lnk, u_int16_t cid)
static ipfw_insn * fill_ip(ipfw_insn *cmd1, enum ipfw_opcodes opcode, u_int32_t addr)
struct in_addr FindSctpRedirectAddress(struct libalias *la, struct sctp_nat_msg *sm)
struct alias_link * LibAliasRedirectProto(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, struct in_addr alias_addr, u_char proto)
static struct group_in * StartPointIn(struct libalias *la, struct in_addr alias_addr, u_short alias_port, int link_type, int create)
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 * AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, struct in_addr alias_addr, u_short src_port, u_short dst_port, int alias_port_param, int link_type)
void SetProxyPort(struct alias_link *lnk, u_short port)
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)
void LibAliasSetAddress(struct libalias *la, struct in_addr addr)
DECLARE_MODULE(alias, alias_mod, SI_SUB_DRIVERS, SI_ORDER_SECOND)
u_short GetOriginalPort(struct alias_link *lnk)
static u_short GetSocket(struct libalias *la, u_short port_net, int *sockfd, int link_type)
struct alias_link * FindFragmentPtr(struct libalias *la, struct in_addr dst_addr, u_short ip_id)
void SetProtocolFlags(struct alias_link *lnk, int pflags)
int FindNewPortGroup(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short src_port, u_short dst_port, u_short port_count, u_char proto, u_char align)
struct in_addr GetDefaultAliasAddress(struct libalias *la)
void AddSeq(struct alias_link *lnk, int delta, u_int ip_hl, u_short ip_len, u_long th_seq, u_int th_off)
int GetDeltaSeqOut(u_long seq, struct alias_link *lnk)
struct alias_link * FindUdpTcpOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short src_port, u_short dst_port, u_char proto, int create)
#define GET_NEW_PORT_MAX_ATTEMPTS
#define TCP_EXPIRE_SINGLEDEAD
#define LINK_UNKNOWN_DEST_ADDR
#define TCP_EXPIRE_CONNECTED
static struct in_addr const ANY_ADDR
static int cmp_out(struct alias_link *a, struct alias_link *b)
static int cmp_in(struct group_in *a, struct group_in *b)
#define LINK_UNKNOWN_DEST_PORT
#define LINK_FRAGMENT_PTR
#define FRAGMENT_PTR_EXPIRE_TIME
#define fw_clrfield(la, field, num)
#define FRAGMENT_ID_EXPIRE_TIME
#define fw_tstfield(la, field, num)
#define LINK_PARTIALLY_SPECIFIED
#define TCP_EXPIRE_INITIAL
#define fw_setfield(la, field, num)
#define PROTO_EXPIRE_TIME
#define LIBALIAS_LOCK_ASSERT(l)
void AliasSctpTerm(struct libalias *la)
Cleans-up the SCTP NAT Implementation prior to unloading.
#define LIBALIAS_LOCK_DESTROY(l)
#define LIBALIAS_LOCK_INIT(l)
#define LIBALIAS_UNLOCK(l)
void AliasSctpInit(struct libalias *la)
Initialises the SCTP NAT Implementation.
@ ALIAS_TCP_STATE_NOT_CONNECTED
@ ALIAS_TCP_STATE_CONNECTED
@ ALIAS_TCP_STATE_DISCONNECTED
MALLOC_DEFINE(M_CC_MEM, "CC Mem", "Congestion Control State memory")
void SctpShowAliasStats(struct libalias *la)
Log current statistics for the libalias instance.
struct alias_link::@26 expire
struct alias_link::@24::@28 all
struct in_addr alias_addr
struct alias_link::@24::@29 pptp
struct in_addr proxy_addr
union alias_link::@27 data
struct in_addr alias_addr
unsigned int fragmentIdLinkCount
unsigned int pptpLinkCount
unsigned int tcpLinkCount
unsigned int udpLinkCount
unsigned int protoLinkCount
struct in_addr targetAddress
struct in_addr aliasAddress
unsigned int icmpLinkCount
unsigned int fragmentPtrLinkCount
struct ack_data_record ack[N_LINK_TCP_DATA]