unsigned char *buf;
if (!vpninfo->dtls_pkt) {
- vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + len);
+ vpninfo->dtls_pkt = pkt_alloc(vpninfo, sizeof(struct pkt) + len);
if (!vpninfo->dtls_pkt) {
vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
break;
vpn_progress(vpninfo, PRG_TRACE,
_("Sent DTLS packet of %d bytes; DTLS send returned %d\n"),
this->len, ret);
- free(this);
+ pkt_free(vpninfo, this);
}
return work_done;
struct pkt *pkt;
if (!vpninfo->dtls_pkt) {
- vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + len);
+ vpninfo->dtls_pkt = pkt_alloc(vpninfo, sizeof(struct pkt) + len);
if (!vpninfo->dtls_pkt) {
vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
break;
vpn_progress(vpninfo, PRG_ERR,
_("Failed to encrypt ESP packet: %d\n"),
len);
- free(this);
+ pkt_free(vpninfo, this);
work_done = 1;
continue;
}
unmonitor_write_fd(vpninfo, dtls);
vpninfo->deflate_pkt = NULL;
}
- free(this);
+ pkt_free(vpninfo, this);
work_done = 1;
}
int len = vpninfo->ip_info.mtu;
if (!out_pkt) {
- out_pkt = malloc(sizeof(struct pkt) + len + vpninfo->pkt_trailer);
+ out_pkt = pkt_alloc(vpninfo, sizeof(struct pkt) + len + vpninfo->pkt_trailer);
if (!out_pkt) {
vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
break;
vpninfo->stats.rx_pkts++;
vpninfo->stats.rx_bytes += this->len;
- free(this);
+ pkt_free(vpninfo, this);
}
/* Work is not done if we just got rid of packets off the queue */
return work_done;
struct timeval tv;
fd_set rfds, wfds, efds;
#endif
-
/* If tun is not up, loop more often to detect
* a DTLS timeout (due to a firewall block) as soon. */
if (tun_is_up(vpninfo))
struct pkt *cstp_pkt;
struct pkt *dtls_pkt;
struct pkt *tun_pkt;
+ struct pkt *pkt_pool;
int pkt_trailer; /* How many bytes after payload for encryption (ESP HMAC) */
z_stream inflate_strm;
/****************************************************************************/
+
+
+static inline struct pkt *pkt_alloc(struct openconnect_info *vpninfo, int len)
+{
+ struct pkt *ret = vpninfo->pkt_pool;
+ if (ret)
+ vpninfo->pkt_pool = ret->next;
+ else
+ ret = malloc(len);
+ return ret;
+}
+static inline void pkt_free(struct openconnect_info *vpninfo, struct pkt *pkt)
+{
+ pkt->next = vpninfo->pkt_pool;
+ vpninfo->pkt_pool = pkt;
+}
+
/* iconv.c */
#ifdef HAVE_ICONV
char *openconnect_utf8_to_legacy(struct openconnect_info *vpninfo, const char *utf8);