void ci_sock_cmn_timestamp_q_enqueue(ci_netif* ni, ci_sock_cmn* s, ci_ip_pkt_fmt* pkt) { ci_ip_pkt_queue* qu = &s->timestamp_q; oo_pkt_p prev_head = qu->head; /* This part is effectively ci_ip_queue_enqueue(ni, &s->timestamp_q, p); * but inlined to allow using tsq_next field */ pkt->tsq_next = OO_PP_NULL; if( ci_ip_queue_is_empty(qu) ) { ci_assert(OO_PP_IS_NULL(qu->head)); qu->head = OO_PKT_P(pkt); } else { ci_assert(OO_PP_NOT_NULL(qu->head)); /* This assumes the netif lock is held, so use ci_ip_queue_enqueue_nnl() if it's not */ PKT(ni, qu->tail)->tsq_next = OO_PKT_P(pkt); } qu->tail = OO_PKT_P(pkt); qu->num++; if( OO_PP_IS_NULL(prev_head) ) { ci_assert(OO_PP_IS_NULL(s->timestamp_q_extract)); s->timestamp_q_extract = qu->head; } else { ci_sock_cmn_timestamp_q_reap(ni, s); } /* Tells post-poll loop to put socket on the [reap_list]. */ s->b.sb_flags |= CI_SB_FLAG_RX_DELIVERED; }
static int efab_file_move_supported_tcp(ci_netif *ni, ci_tcp_state *ts) { #if CI_CFG_FD_CACHING /* Don't support moving cached sockets for now */ if( ci_tcp_is_cached(ts) || !ci_ni_dllist_is_self_linked(ni, &ts->epcache_link) ) return false; #endif /* TCP closed: supported */ if( ts->s.b.state == CI_TCP_CLOSED ) return true; /* everything except TCP connected is not supported */ if( !(ts->s.b.state & CI_TCP_STATE_TCP_CONN) ) return false; if( ts->local_peer != OO_SP_NULL ) return false; if( !(ts->tcpflags & CI_TCPT_FLAG_PASSIVE_OPENED) ) return false; /* send queue is not supported * NB: retrans_ptr is uninitialised when retrans was not used yet, * so do not check for !OO_PP_IS_NULL(ts->retrans_ptr) */ if( !ci_ip_queue_is_empty(&ts->send) || ts->send_prequeue != OO_PP_ID_NULL || oo_atomic_read(&ts->send_prequeue_in) != 0 || !ci_ip_queue_is_empty(&ts->retrans) || ci_ip_timer_pending(ni, &ts->rto_tid) || ci_ip_timer_pending(ni, &ts->zwin_tid) || #if CI_CFG_TAIL_DROP_PROBE ci_ip_timer_pending(ni, &ts->taildrop_tid) || #endif ci_ip_timer_pending(ni, &ts->cork_tid) ) return false; /* Sockets with allocated templates are not supported */ if( OO_PP_NOT_NULL(ts->tmpl_head) ) return false; return true; }