void ci_ip_send_pkt_lookup(ci_netif* ni, const struct oo_sock_cplane* sock_cp_opt, ci_ip_pkt_fmt* pkt, ci_ip_cached_hdrs* ipcache) { ci_ip4_hdr* pkt_ip = oo_tx_ip_hdr(pkt); struct oo_sock_cplane sock_cp; ci_assert(pkt_ip->ip_saddr_be32 != 0); ci_assert(pkt_ip->ip_daddr_be32 != 0); if( sock_cp_opt != NULL ) sock_cp = *sock_cp_opt; else oo_sock_cplane_init(&sock_cp); ci_ip_cache_init(ipcache); sock_cp.ip_laddr_be32 = pkt_ip->ip_saddr_be32; ipcache->ip.ip_daddr_be32 = pkt_ip->ip_daddr_be32; switch( pkt_ip->ip_protocol ) { case IPPROTO_UDP: case IPPROTO_TCP: sock_cp.lport_be16 = TX_PKT_SPORT_BE16(pkt); ipcache->dport_be16 = TX_PKT_DPORT_BE16(pkt); break; default: sock_cp.lport_be16 = 0; ipcache->dport_be16 = 0; break; } cicp_user_retrieve(ni, ipcache, &sock_cp); }
void ci_sock_cmn_init(ci_netif* ni, ci_sock_cmn* s) { oo_p sp; /* Poison. */ CI_DEBUG(memset(&s->b + 1, 0xf0, (char*) (s + 1) - (char*) (&s->b + 1))); citp_waitable_reinit(ni, &s->b); oo_sock_cplane_init(&s->cp); s->local_peer = OO_SP_NULL; s->s_flags = CI_SOCK_FLAG_CONNECT_MUST_BIND | CI_SOCK_FLAG_PMTU_DO; s->s_aflags = 0u; ci_assert_equal( 0, CI_IP_DFLT_TOS ); s->so_priority = 0; /* SO_SNDBUF & SO_RCVBUF. See also ci_tcp_set_established_state() which * may modify these values. */ memset(&s->so, 0, sizeof(s->so)); s->so.sndbuf = NI_OPTS(ni).tcp_sndbuf_def; s->so.rcvbuf = NI_OPTS(ni).tcp_rcvbuf_def; s->rx_bind2dev_ifindex = CI_IFID_BAD; /* These don't really need to be initialised, as only significant when * rx_bind2dev_ifindex != CI_IFID_BAD. But makes stackdump output * cleaner this way... */ s->rx_bind2dev_base_ifindex = 0; s->rx_bind2dev_vlan = 0; s->cmsg_flags = 0u; s->timestamping_flags = 0u; s->os_sock_status = OO_OS_STATUS_TX; ci_ip_queue_init(&s->timestamp_q); s->timestamp_q_extract = OO_PP_NULL; ci_sock_cmn_reinit(ni, s); sp = oo_sockp_to_statep(ni, SC_SP(s)); OO_P_ADD(sp, CI_MEMBER_OFFSET(ci_sock_cmn, reap_link)); ci_ni_dllist_link_init(ni, &s->reap_link, sp, "reap"); ci_ni_dllist_self_link(ni, &s->reap_link); }