net/rxrpc/input.c

Source file repositories/reference/linux-study-clean/net/rxrpc/input.c

File Facts

System
Linux kernel
Corpus path
net/rxrpc/input.c
Extension
.c
Size
38027 bytes
Lines
1308
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: implementation source
Status
source implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

if (call->cong_cwnd >= call->cong_ssthresh) {
			call->cong_ca_state = RXRPC_CA_CONGEST_AVOIDANCE;
			call->cong_tstamp = call->acks_latest_ts;
		}
		goto out;

	case RXRPC_CA_CONGEST_AVOIDANCE:
		if (call->acks_nr_snacks > 0)
			goto packet_loss_detected;

		/* We analyse the number of packets that get ACK'd per RTT
		 * period and increase the window if we managed to fill it.
		 */
		if (call->rtt_count == 0)
			goto out;
		if (ktime_before(call->acks_latest_ts,
				 ktime_add_us(call->cong_tstamp,
					      call->srtt_us >> 3)))
			goto out_no_clear_ca;
		summary->change = rxrpc_cong_rtt_window_end;
		call->cong_tstamp = call->acks_latest_ts;
		if (call->cong_cumul_acks >= call->cong_cwnd)
			call->cong_cwnd++;
		goto out;

	case RXRPC_CA_PACKET_LOSS:
		if (call->acks_nr_snacks == 0)
			goto resume_normality;

		if (summary->new_low_snack) {
			summary->change = rxrpc_cong_new_low_nack;
			call->cong_dup_acks = 1;
			if (call->cong_extra > 1)
				call->cong_extra = 1;
			goto send_extra_data;
		}

		call->cong_dup_acks++;
		if (call->cong_dup_acks < 3)
			goto send_extra_data;

		summary->change = rxrpc_cong_begin_retransmission;
		call->cong_ca_state = RXRPC_CA_FAST_RETRANSMIT;
		call->cong_ssthresh = umax(summary->in_flight / 2, 2);
		call->cong_cwnd = call->cong_ssthresh + 3;
		call->cong_extra = 0;
		call->cong_dup_acks = 0;
		summary->need_retransmit = true;
		summary->in_fast_or_rto_recovery = true;
		goto out;

	case RXRPC_CA_FAST_RETRANSMIT:
		rxrpc_tlp_init(call);
		summary->in_fast_or_rto_recovery = true;
		if (!summary->new_low_snack) {
			if (summary->nr_new_sacks == 0)
				call->cong_cwnd += 1;
			call->cong_dup_acks++;
			if (call->cong_dup_acks == 2) {
				summary->change = rxrpc_cong_retransmit_again;
				call->cong_dup_acks = 0;
				summary->need_retransmit = true;
			}
		} else {
			summary->change = rxrpc_cong_progress;
			call->cong_cwnd = call->cong_ssthresh;
			if (call->acks_nr_snacks == 0) {
				summary->exiting_fast_or_rto_recovery = true;
				goto resume_normality;
			}
		}
		goto out;

	default:
		BUG();
		goto out;
	}

resume_normality:
	summary->change = rxrpc_cong_cleared_nacks;
	call->cong_dup_acks = 0;
	call->cong_extra = 0;
	call->cong_tstamp = call->acks_latest_ts;
	if (call->cong_cwnd < call->cong_ssthresh)
		call->cong_ca_state = RXRPC_CA_SLOW_START;
	else
		call->cong_ca_state = RXRPC_CA_CONGEST_AVOIDANCE;
out:
	call->cong_cumul_acks = 0;
out_no_clear_ca:

Annotation

Implementation Notes