/** * @skb_list can be invalid after the function call, don't try to use it. */ static void ss_do_send(struct sock *sk, SsSkbList *skb_list) { struct tcp_sock *tp = tcp_sk(sk); struct sk_buff *skb; int size, mss = tcp_send_mss(sk, &size, MSG_DONTWAIT); SS_DBG("%s: cpu=%d sk=%p queue_empty=%d send_head=%p" " sk_state=%d mss=%d size=%d\n", __func__, smp_processor_id(), sk, tcp_write_queue_empty(sk), tcp_send_head(sk), sk->sk_state, mss, size); if (unlikely(!ss_sock_active(sk))) return; ss_sock_cpu_check(sk); while ((skb = ss_skb_dequeue(skb_list))) { skb->ip_summed = CHECKSUM_PARTIAL; skb_shinfo(skb)->gso_segs = 0; /* * TODO Mark all data with PUSH to force receiver to consume * the data. Currently we do this for debugging purposes. * We need to do this only for complete messages/skbs. * Actually tcp_push() already does it for the last skb. * MSG_MORE should be used, probably by connection layer. */ tcp_mark_push(tp, skb); SS_DBG("%s: entail skb=%p data_len=%u len=%u\n", __func__, skb, skb->data_len, skb->len); ss_skb_entail(sk, skb); tp->write_seq += skb->len; TCP_SKB_CB(skb)->end_seq += skb->len; } SS_DBG("%s: sk=%p send_head=%p sk_state=%d\n", __func__, sk, tcp_send_head(sk), sk->sk_state); tcp_push(sk, MSG_DONTWAIT, mss, TCP_NAGLE_OFF|TCP_NAGLE_PUSH, size); }
void rtl_tcp_mark_push(struct tcp_sock *tp, struct sk_buff *skb) { tcp_mark_push(tp, skb); }