void IP_route_init ( IP_ROUTE_PTR head /* Pointer to the head of the IPRADIX tree */ ) { /* Body */ IPRADIX_init(&head->NODE); head->DIRECT = NULL; head->INDIRECT = NULL; head->VIRTUAL = NULL; } /* Endbody */
static uint_32 NAT_init_internal2 ( NAT_PARM_PTR parm_ptr /* [IN] Initialization parameters */ ) { /* Body */ NAT_CFG_STRUCT_PTR nat_cfg_ptr = RTCS_getcfg(NAT); uint_32 error; /* ** Make sure the netmask is valid. We use the fact that ** (x & x+1) == 0 <=> x = 2^n-1. */ if (~parm_ptr->IP_MASK & (~parm_ptr->IP_MASK + 1)) { return RTCSERR_INVALID_PARAMETER; } /* Endif */ /* Make sure other parameters have been supplied */ if (!parm_ptr->IP_PRV) { return RTCSERR_INVALID_PARAMETER; } /* Endif */ /* ** If the configuration structure has already been allocated, ** just add another private network and return */ if (nat_cfg_ptr) { error = NAT_add_private_network(&nat_cfg_ptr->PRIVATE_NETWORKS, parm_ptr->IP_PRV, parm_ptr->IP_MASK); if (error == RTCS_OK) { nat_cfg_ptr->NAT_EXEC = NAT_apply; } return error; } /* Endif */ // First time through the initialization, // Allocate the NAT configuration structure nat_cfg_ptr = _mem_alloc_system_zero(sizeof(NAT_CFG_STRUCT)); if (nat_cfg_ptr == NULL) { return RTCSERR_OUT_OF_MEMORY; } /* Endif */ /* Record the private network information */ error = NAT_add_private_network(&nat_cfg_ptr->PRIVATE_NETWORKS, parm_ptr->IP_PRV, parm_ptr->IP_MASK); if (error == RTCS_OK) { nat_cfg_ptr->NAT_EXEC = NAT_apply; nat_cfg_ptr->INITIAL_PRV_NET = parm_ptr->IP_PRV; nat_cfg_ptr->INITIAL_PRV_MASK = parm_ptr->IP_MASK; nat_cfg_ptr->TCP_TOUT.PRIVATE = &nat_cfg_ptr->TCP_HEAD; nat_cfg_ptr->UDP_TOUT.PRIVATE = &nat_cfg_ptr->UDP_HEAD; nat_cfg_ptr->FIN_TOUT.PRIVATE = &nat_cfg_ptr->FIN_HEAD; nat_cfg_ptr->ICMP_TOUT.PRIVATE = &nat_cfg_ptr->ICMP_HEAD; /* Initialize radix trees */ IPRADIX_init(&nat_cfg_ptr->ROOT_IN); IPRADIX_init(&nat_cfg_ptr->ROOT_OUT); /* Initialize timeout functions */ nat_cfg_ptr->UDP_TOUT.EVENT = NAT_expire; nat_cfg_ptr->TCP_TOUT.EVENT = NAT_expire; nat_cfg_ptr->FIN_TOUT.EVENT = NAT_expire; nat_cfg_ptr->ICMP_TOUT.EVENT = NAT_expire; nat_cfg_ptr->TIMEOUT_TCP = NAT_DEFAULT_TIMEOUT_TCP; nat_cfg_ptr->TIMEOUT_UDP = NAT_DEFAULT_TIMEOUT_UDP; nat_cfg_ptr->TIMEOUT_FIN = NAT_DEFAULT_TIMEOUT_FIN; nat_cfg_ptr->TIMEOUT_ICMP = NAT_DEFAULT_TIMEOUT_ICMP; /* Initialize last used port numbers */ nat_cfg_ptr->TCP_PORT = NAT_DEFAULT_PORT_MIN; nat_cfg_ptr->UDP_PORT = NAT_DEFAULT_PORT_MIN; nat_cfg_ptr->ICMP_ID = NAT_DEFAULT_PORT_MIN; nat_cfg_ptr->PORT_MAX = NAT_DEFAULT_PORT_MAX; nat_cfg_ptr->PORT_MIN = NAT_DEFAULT_PORT_MIN; /* Inititalize ALGs */ error = NAT_init_algs(nat_cfg_ptr); } /* Allocate partitions */ if (error == RTCS_OK) { nat_cfg_ptr->SESSION_PART = RTCS_part_create(sizeof(NAT_SESSION_STRUCT), NAT_SESSION_INITIAL_COUNT, NAT_SESSION_GROW_COUNT, NAT_SESSION_MAX, NULL, NULL); if (nat_cfg_ptr->SESSION_PART == NULL) { error = RTCSERR_OUT_OF_MEMORY; } /* Endif */ } /* Endif */ if (error == RTCS_OK) { nat_cfg_ptr->RADIX_IN = RTCS_part_create(sizeof(IPRADIX_NODE), NAT_SESSION_INITIAL_COUNT, NAT_SESSION_GROW_COUNT, NAT_SESSION_MAX, NULL, NULL); if (nat_cfg_ptr->RADIX_IN == NULL) { error = RTCSERR_OUT_OF_MEMORY; } /* Endif */ } /* Endif */ if (error == RTCS_OK) { nat_cfg_ptr->RADIX_OUT = RTCS_part_create(sizeof(IPRADIX_NODE), NAT_SESSION_INITIAL_COUNT, NAT_SESSION_GROW_COUNT, NAT_SESSION_MAX, NULL, NULL); if (nat_cfg_ptr->RADIX_OUT == NULL) { error = RTCSERR_OUT_OF_MEMORY; } /* Endif */ } /* Endif */ if (error == RTCS_OK) { // Initialize queue of DNAT Rules _queue_init( &nat_cfg_ptr->RULE_QUEUE, 0 ); RTCS_setcfg(NAT, nat_cfg_ptr); } else { if (nat_cfg_ptr != NULL) { if (nat_cfg_ptr->RADIX_IN != NULL) RTCS_part_destroy(nat_cfg_ptr->RADIX_IN); if (nat_cfg_ptr->RADIX_OUT != NULL) RTCS_part_destroy(nat_cfg_ptr->RADIX_OUT); if (nat_cfg_ptr->SESSION_PART != NULL) RTCS_part_destroy(nat_cfg_ptr->SESSION_PART); _mem_free(nat_cfg_ptr); } } /* Endif */ return error; } /* Endbody */