void citp_waitable_init(ci_netif* ni, citp_waitable* w, int id) { /* NB. Some members initialised in citp_waitable_obj_free(). */ oo_p sp; #if CI_CFG_SOCKP_IS_PTR w->bufid = id; #else w->bufid = OO_SP_FROM_INT(ni, id); #endif w->sb_flags = 0; w->sb_aflags = CI_SB_AFLAG_ORPHAN | CI_SB_AFLAG_NOT_READY; sp = oo_sockp_to_statep(ni, W_SP(w)); OO_P_ADD(sp, CI_MEMBER_OFFSET(citp_waitable, post_poll_link)); ci_ni_dllist_link_init(ni, &w->post_poll_link, sp, "ppll"); ci_ni_dllist_self_link(ni, &w->post_poll_link); sp = oo_sockp_to_statep(ni, W_SP(w)); OO_P_ADD(sp, CI_MEMBER_OFFSET(citp_waitable, ready_link)); ci_ni_dllist_link_init(ni, &w->ready_link, sp, "rll"); ci_ni_dllist_self_link(ni, &w->ready_link); w->lock.wl_val = 0; CI_DEBUG(w->wt_next = OO_SP_NULL); CI_DEBUG(w->next_id = CI_ILL_END); citp_waitable_reinit(ni, w); }
/* Should be called when netif is locked */ static int oo_pipe_init(ci_netif* ni, struct oo_pipe* p) { ci_assert(ni); ci_assert(p); /* init waitable */ citp_waitable_reinit(ni, &p->b); p->b.state = CI_TCP_STATE_PIPE; p->bytes_added = 0; p->bytes_removed = 0; p->aflags = 0; oo_pipe_buf_clear_state(ni, p); p->bufs_num = 0; /* We add extra buffer to ensure we can always fill the pipe to at least * pipe_size bytes. This extra buffer is needed because the buffer * under read_ptr can be blocked */ p->bufs_max = OO_PIPE_SIZE_TO_BUFS(CITP_OPTS.pipe_size) + 1; return 0; }
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); }