Instead of allocating a new packet buffer every time we generate a packet,
we pre-allocate it and keep it around. We only reallocate when the MTU
increases.
struct {
struct hdr hdr;
uint8_t data[];
struct {
struct hdr hdr;
uint8_t data[];
- } *pkt;
-
- pkt = malloc(c->utcp->mtu);
-
- if(!pkt) {
- return;
- }
pkt->hdr.src = c->src;
pkt->hdr.dst = c->dst;
pkt->hdr.src = c->src;
pkt->hdr.dst = c->dst;
print_packet(c, "send", pkt, sizeof(pkt->hdr) + seglen);
c->utcp->send(c->utcp, pkt, sizeof(pkt->hdr) + seglen);
} while(left);
print_packet(c, "send", pkt, sizeof(pkt->hdr) + seglen);
c->utcp->send(c->utcp, pkt, sizeof(pkt->hdr) + seglen);
} while(left);
}
ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) {
}
ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) {
struct {
struct hdr hdr;
uint8_t data[];
struct {
struct hdr hdr;
uint8_t data[];
- } *pkt;
-
- pkt = malloc(c->utcp->mtu);
-
- if(!pkt) {
- return;
- }
pkt->hdr.src = c->src;
pkt->hdr.dst = c->dst;
pkt->hdr.src = c->src;
pkt->hdr.dst = c->dst;
c->dupack = 0; // cancel any ongoing fast recovery
cleanup:
c->dupack = 0; // cancel any ongoing fast recovery
cleanup:
}
/* Update receive buffer and SACK entries after consuming data.
}
/* Update receive buffer and SACK entries after consuming data.
utcp->pre_accept = pre_accept;
utcp->send = send;
utcp->priv = priv;
utcp->pre_accept = pre_accept;
utcp->send = send;
utcp->priv = priv;
- utcp->mtu = DEFAULT_MTU;
- utcp->mss = DEFAULT_MTU - sizeof(struct hdr);
+ utcp_set_mtu(utcp, DEFAULT_MTU);
utcp->timeout = DEFAULT_USER_TIMEOUT; // sec
utcp->rto = START_RTO; // usec
utcp->timeout = DEFAULT_USER_TIMEOUT; // sec
utcp->rto = START_RTO; // usec
}
void utcp_set_mtu(struct utcp *utcp, uint16_t mtu) {
}
void utcp_set_mtu(struct utcp *utcp, uint16_t mtu) {
- // TODO: handle overhead of the header
- if(utcp) {
- utcp->mtu = mtu;
- utcp->mss = mtu - sizeof(struct hdr);
+
+ if (mtu <= sizeof(struct hdr)) {
+ return;
+ }
+
+ if (mtu > utcp->mtu) {
+ char *new = realloc(utcp->pkt, mtu);
+ if (!new)
+ return;
+ utcp->pkt = new;
+ }
+
+ utcp->mtu = mtu;
+ utcp->mss = mtu - sizeof(struct hdr);
}
void utcp_reset_timers(struct utcp *utcp) {
}
void utcp_reset_timers(struct utcp *utcp) {
utcp_pre_accept_t pre_accept;
utcp_send_t send;
utcp_pre_accept_t pre_accept;
utcp_send_t send;
+ // Packet buffer
+
+ void *pkt;
+
// Global socket options
uint16_t mtu; // The maximum size of a UTCP packet, including headers.
// Global socket options
uint16_t mtu; // The maximum size of a UTCP packet, including headers.