void DNAT_add_rule_internal ( DNAT_PARM_PTR dparm_ptr /* [IN] */ ) { /* Body */ NAT_CFG_STRUCT_PTR nat_cfg_ptr = RTCS_getcfg(NAT); DNAT_ELEMENT_STRUCT_PTR new_element_ptr, prev_element_ptr, next_element_ptr; if (nat_cfg_ptr == NULL) { RTCSCMD_complete(dparm_ptr, RTCSERR_NAT_NOT_INITIALIZED); return; } if (! NAT_is_private_addr(&nat_cfg_ptr->PRIVATE_NETWORKS,dparm_ptr->RULE.PRIVATE_IP)) { RTCSCMD_complete(dparm_ptr, RTCSERR_NAT_INVALID_PRIVATE_ADDRESS); return; } if (IP_is_local(NULL, dparm_ptr->RULE.PRIVATE_IP)) { RTCSCMD_complete(dparm_ptr, RTCSERR_NAT_INVALID_PRIVATE_ADDRESS); return; } prev_element_ptr = NULL; next_element_ptr = (DNAT_ELEMENT_STRUCT_PTR) _queue_head(&nat_cfg_ptr->RULE_QUEUE); while ((next_element_ptr != NULL) && (next_element_ptr->RULE.PRIORITY > dparm_ptr->RULE.PRIORITY)) { prev_element_ptr = next_element_ptr; next_element_ptr = (DNAT_ELEMENT_STRUCT_PTR) _queue_next(&nat_cfg_ptr->RULE_QUEUE, &prev_element_ptr->ELEMENT); } if (next_element_ptr != NULL) { if (next_element_ptr->RULE.PRIORITY == dparm_ptr->RULE.PRIORITY) { // A rule of the given priority exist RTCSCMD_complete(dparm_ptr, RTCSERR_NAT_DUPLICATE_PRIORITY); return; } } new_element_ptr = (DNAT_ELEMENT_STRUCT_PTR)_mem_alloc_system_zero(sizeof(DNAT_ELEMENT_STRUCT)); if (new_element_ptr == NULL) { RTCSCMD_complete(dparm_ptr, RTCSERR_OUT_OF_MEMORY); return; } /* Endif */ new_element_ptr->RULE = dparm_ptr->RULE; _queue_insert(&nat_cfg_ptr->RULE_QUEUE, &prev_element_ptr->ELEMENT, &new_element_ptr->ELEMENT); RTCSCMD_complete(dparm_ptr, RTCS_OK); }/* Endbody */
/** * Add to the head of the queue */ int queue_prepend (queue_t *queue, void *data) { kprintf ("queue_add_head\n"); return _queue_insert (queue, data, NULL); }
/** * Add to the tail of the queue */ int queue_append (queue_t *queue, void *data) { kprintf ("queue_add\n"); return _queue_insert (queue, data, queue->tail); }