static IP_DGRAM_PTR IPREASM_get_dgram ( _ip_address ipsrc, /* [IN] the IP source */ _ip_address ipdst, /* [IN] the IP destination */ uint8_t proto, /* [IN] the IP protocol */ uint16_t id /* [IN] the IP ID */ ) { /* Body */ register IP_DGRAM_PTR dgram; RTCS_DLIST_PEEK(IPREASM_head, dgram); if (dgram) { /* There's a good probability our IP_DGRAM is at the head of the list */ if (dgram->family==AF_INET && ipsrc == dgram->header.IP4.IPSRC && ipdst == dgram->header.IP4.IPDST && proto == dgram->header.IP4.PROTO && id == dgram->header.IP4.ID) { return dgram; } /* Endif */ /* It's not at the head. Scan the list for it */ RTCS_DLIST_SEARCH_REST(IPREASM_head, dgram) { if (ipsrc == dgram->header.IP4.IPSRC && ipdst == dgram->header.IP4.IPDST && proto == dgram->header.IP4.PROTO && id == dgram->header.IP4.ID) { /* Found it. Move it to the head of the list */ RTCS_DLIST_DEL(IPREASM_head, dgram); RTCS_DLIST_INS(IPREASM_head, dgram); return dgram; } /* Endif */ } /* End SEARCH */ } /* Endif */ /* Not found. Allocate one */ dgram = RTCS_part_alloc_zero(IPREASM_part); if (!dgram) return NULL; /* Initialize it */ dgram->family=AF_INET; dgram->header.IP4.IPSRC = ipsrc; dgram->header.IP4.IPDST = ipdst; dgram->header.IP4.PROTO = proto; dgram->header.IP4.ID = id; dgram->TIMER.TIME = IPREASM_TTL; dgram->TIMER.EVENT = IPREASM_expire; dgram->TIMER.PRIVATE = dgram; TCPIP_Event_add(&dgram->TIMER); /* Add it to the list*/ RTCS_DLIST_INS(IPREASM_head, dgram); return dgram; } /* Endbody */
IPREASM_BLK_PTR IPREASM_blk_get ( IP_DGRAM_PTR dgram, /* [IN] the IP datagram */ uint32_t offset /* [IN] the offset into the datagram */ ) { /* Body */ IPREASM_BLK_PTR blk; uint32_t nb; uint32_t ni; nb = IPREASM_BLK_NUM(offset); if (IPREASM_IS_DIRECT(nb)) { blk = dgram->DIRECT[nb]; if (!blk) { blk = RTCS_part_alloc(IPREASM_part); if (blk) { blk->BUSYINT = 0; dgram->DIRECT[nb] = blk; } /* Endif */ } /* Endif */ return blk; } /* Endif */ /* If we get here, it's an indirect block */ ni = IPREASM_IND_NUM(nb); if (ni >= IPREASM_NB_IND) { return NULL; } /* Endif */ if (!dgram->INDIR[ni]) { dgram->INDIR[ni] = RTCS_part_alloc_zero(IPREASM_part); if (!dgram->INDIR[ni]) { return NULL; } /* Endif */ } /* Endif */ nb = IPREASM_IND_OFS(nb); blk = dgram->INDIR[ni]->DIRECT[nb]; if (!blk) { blk = RTCS_part_alloc(IPREASM_part); if (blk) { blk->BUSYINT = 0; dgram->INDIR[ni]->DIRECT[nb] = blk; } /* Endif */ } /* Endif */ return blk; } /* Endbody */
MC_MEMBER_PTR _PTR_ IGMP_member_create ( MC_MEMBER_PTR _PTR_ phead, ip_mreq _PTR_ igrp ) { /* Body */ IP_CFG_STRUCT_PTR IP_cfg_ptr = RTCS_getcfg(IP); MC_MEMBER_PTR group; group = RTCS_part_alloc_zero(IP_cfg_ptr->MCB_PARTID); if (!group) { return NULL; } /* Endif */ group->IGRP = *igrp; group->UCOUNT = 1; group->NEXT = *phead; *phead = group; return phead; } /* Endbody */
SOCKET_STRUCT_PTR SOCK_Get_sock_struct ( RTCS_SOCKET_CALL_STRUCT_PTR type, _rtcs_taskid owner ) { /* Body */ RTCS_DATA_PTR RTCS_data_ptr; SOCKET_CONFIG_STRUCT_PTR socket_cfg_ptr; SOCKET_STRUCT_PTR socket_ptr; RTCS_data_ptr = RTCS_get_data(); socket_cfg_ptr = RTCS_data_ptr->SOCKET_CFG; socket_ptr = RTCS_part_alloc_zero(RTCS_data_ptr->RTCS_socket_partition); if ( socket_ptr != NULL ) { RTCS_mutex_lock(&socket_cfg_ptr->SOCK_MUTEX); socket_cfg_ptr->CURRENT_SOCKETS++; #if RTCSCFG_SOCKET_OWNERSHIP SOCK_Add_owner(socket_ptr, owner); #endif /* ** link in this socket into the linked list of active sockets */ if ( socket_cfg_ptr->SOCKET_HEAD != NULL ) { ((SOCKET_STRUCT_PTR)socket_cfg_ptr->SOCKET_TAIL)->NEXT = (void *)socket_ptr; socket_ptr->PREV = (SOCKET_STRUCT_PTR)socket_cfg_ptr->SOCKET_TAIL; } else { socket_cfg_ptr->SOCKET_HEAD = (void *)socket_ptr; socket_ptr->PREV = NULL; } /* Endif */ socket_ptr->NEXT = NULL; socket_cfg_ptr->SOCKET_TAIL = (void *)socket_ptr; RTCS_mutex_unlock(&socket_cfg_ptr->SOCK_MUTEX); socket_ptr->VALID = SOCKET_VALID; /* ** set the default socket options */ socket_ptr->CONNECT_TIMEOUT = DEFAULT_CONNECT_TIMEOUT; socket_ptr->RETRANSMISSION_TIMEOUT = DEFAULT_RETRANSMISSION_TIMEOUT; socket_ptr->SEND_TIMEOUT = DEFAULT_SEND_TIMEOUT; socket_ptr->RECEIVE_TIMEOUT = DEFAULT_RECEIVE_TIMEOUT; socket_ptr->RECEIVE_PUSH = DEFAULT_PUSH; socket_ptr->SEND_NOWAIT = DEFAULT_SEND_NOWAIT; socket_ptr->SEND_WAIT = DEFAULT_SEND_WAIT; socket_ptr->SEND_PUSH = DEFAULT_PUSH; socket_ptr->RECEIVE_NOWAIT = DEFAULT_RECEIVE_NOWAIT; socket_ptr->CHECKSUM_BYPASS = DEFAULT_CHECKSUM_BYPASS; socket_ptr->ACTIVE = DEFAULT_ACTIVE; socket_ptr->TBSIZE = DEFAULT_TBSIZE; socket_ptr->RBSIZE = DEFAULT_RBSIZE; socket_ptr->MAXRTO = DEFAULT_MAXRTO; socket_ptr->MAXRCV_WND = DEFAULT_MAXRCV_WND; socket_ptr->KEEPALIVE = DEFAULT_KEEPALIVE; socket_ptr->NOWAIT = DEFAULT_NOWAIT; socket_ptr->NO_NAGLE_ALGORITHM = DEFAULT_NO_NAGLE_ALGORITHM; socket_ptr->NOSWRBUF = DEFAULT_NOSWRBUF; socket_ptr->CALL_BACK = DEFAULT_CALL_BACK; socket_ptr->TYPE_MIRROR = (uint32_t)type; socket_ptr->APPLICATION_CALLBACK = DEFAULT_CALLBACK; socket_ptr->TIMEWAIT_TIMEOUT = DEFAULT_TIMEWAIT_TIMEOUT; socket_ptr->DELAY_ACK = DEFAULT_DELAY_ACK; #if RTCSCFG_ENABLE_IP6 socket_ptr->LINK_OPTIONS.TX.HOP_LIMIT_MULTICAST = DEFAULT_IP6_MULTICAST_HOPS; #endif socket_ptr->PROTOCOL = type; } /* Endif */ return(socket_ptr); } /* Endbody */