Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plpmtud icmp #241

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Prev Previous commit
Next Next commit
More prerequisites without actually sending probes
Irene Ruengeler authored and Irene Ruengeler committed Jun 11, 2018
commit 007f2850b56c4b025792e76cf28ff6798a12a34e
4 changes: 4 additions & 0 deletions usrsctplib/netinet/sctp_input.c
Original file line number Diff line number Diff line change
@@ -935,6 +935,10 @@ sctp_start_net_timers(struct sctp_tcb *stcb)
sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net);
if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) &&
(cnt_hb_sent < SCTP_BASE_SYSCTL(sctp_hb_maxburst))) {
if (stcb->asoc.plpmtud_supported) {
net->probing_state = SCTP_PROBE_NONE;
net->probe_mtu = 0;
}
sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED);
cnt_hb_sent++;
}
46 changes: 30 additions & 16 deletions usrsctplib/netinet/sctp_output.c
Original file line number Diff line number Diff line change
@@ -4487,9 +4487,11 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) {
sctp_mtu_size_reset(inp, &stcb->asoc, mtu);
}
net->mtu = mtu;
net->got_max = 1;
sctp_pathmtu_adjustment(stcb, net->mtu, net);
if (!stcb->sctp_ep->plpmtud_supported) {
net->mtu = mtu;
sctp_pathmtu_adjustment(stcb, net->mtu, net);
}
}
#else
mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt);
@@ -4958,27 +4960,39 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,

#if defined(__Userspace__)
mtu = sctp_get_mtu_from_addr(inp, (struct sockaddr *)&(net->ro._s_addr->address.sin));
if (mtu > 0 && (mtu < net->mtu || !net->got_max)) {
if (net->port) {
mtu -= sizeof(struct udphdr);
if (!stcb->sctp_ep->plpmtud_supported) {
if (mtu > 0 && (mtu < net->mtu || !net->got_max)) {
if (net->port) {
mtu -= sizeof(struct udphdr);
}
if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) {
sctp_mtu_size_reset(inp, &stcb->asoc, mtu);
}
net->mtu = mtu;
net->got_max = 1;
sctp_pathmtu_adjustment(stcb, net->mtu, net);
}
if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) {
sctp_mtu_size_reset(inp, &stcb->asoc, mtu);
} else {
if (net->port) {
net->mtu -= sizeof(struct udphdr);
}
net->mtu = mtu;
net->got_max = 1;
sctp_pathmtu_adjustment(stcb, net->mtu, net);
}
#else
mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt);
if (mtu > 0) {
if (net->port) {
mtu -= sizeof(struct udphdr);
}
if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) {
sctp_mtu_size_reset(inp, &stcb->asoc, mtu);
if (!stcb->sctp_ep->plpmtud_supported) {
if (net->port) {
mtu -= sizeof(struct udphdr);
}
if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) {
sctp_mtu_size_reset(inp, &stcb->asoc, mtu);
}
net->mtu = mtu;
} else {
if (net->port) {
net->mtu -= sizeof(struct udphdr);
}
}
net->mtu = mtu;
net->got_max = 1;
}
#endif
12 changes: 12 additions & 0 deletions usrsctplib/netinet/sctp_pcb.c
Original file line number Diff line number Diff line change
@@ -4618,6 +4618,12 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
net->RTO_measured = 0;
stcb->asoc.numnets++;
net->ref_count = 1;
if (stcb->asoc.plpmtud_supported) {
net->probe_mtu = 0;
net->mtu_probing = 0;
net->probing_state = SCTP_PROBE_NONE;
net->got_max = 0;
}
net->cwr_window_tsn = net->last_cwr_tsn = stcb->asoc.sending_seq - 1;
net->port = port;
net->dscp = stcb->asoc.default_dscp;
@@ -4727,6 +4733,12 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
/* Start things off to match mtu of interface please. */
SCTP_SET_MTU_OF_ROUTE(&net->ro._l_addr.sa,
net->ro.ro_rt, net->mtu);
} else if (stcb->asoc.plpmtud_supported) {
net->mtu = min(rmtu, SCTP_DEFAULT_MTU);
}
if (stcb->asoc.plpmtud_supported) {
net->max_mtu = max(net->mtu, rmtu);
net->max_mtu -= net->max_mtu % 4;
}
net->got_max = 1;
}