aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/network/sender.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2012-02-23 11:51:53 +0100
committerTobias Brunner <tobias@strongswan.org>2012-08-08 15:12:24 +0200
commit064da8b96b24db331e37c93d8f857c8558d294bb (patch)
tree0635f8c3ced5682dec7e84590efbbe1869e9ef61 /src/libcharon/network/sender.c
parent65da43e2fceb74f297a280c034000a7c01538703 (diff)
downloadstrongswan-064da8b96b24db331e37c93d8f857c8558d294bb.tar.bz2
strongswan-064da8b96b24db331e37c93d8f857c8558d294bb.tar.xz
Add Non-ESP marker in sender and not individual socket plugins.
Diffstat (limited to 'src/libcharon/network/sender.c')
-rw-r--r--src/libcharon/network/sender.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/libcharon/network/sender.c b/src/libcharon/network/sender.c
index 75635d2e3..b62185f8c 100644
--- a/src/libcharon/network/sender.c
+++ b/src/libcharon/network/sender.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2005-2006 Martin Willi
* Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil
@@ -121,6 +122,7 @@ METHOD(sender_t, send_, void,
static job_requeue_t send_packets(private_sender_t * this)
{
packet_t *packet;
+ host_t *src, *dst;
bool oldstate;
this->mutex->lock(this->mutex);
@@ -139,6 +141,23 @@ static job_requeue_t send_packets(private_sender_t * this)
this->sent->signal(this->sent);
this->mutex->unlock(this->mutex);
+ /* if neither source nor destination port is 500 we add a Non-ESP marker */
+ dst = packet->get_destination(packet);
+ src = packet->get_source(packet);
+ if (dst->get_port(dst) != IKEV2_UDP_PORT &&
+ src->get_port(src) != IKEV2_UDP_PORT)
+ {
+ chunk_t marker = chunk_from_chars(0x00, 0x00, 0x00, 0x00), data;
+
+ data = packet->get_data(packet);
+ /* NAT keepalives have no marker prepended */
+ if (data.len != 1 || data.ptr[0] != 0xFF)
+ {
+ data = chunk_cat("cm", marker, data);
+ packet->set_data(packet, data);
+ }
+ }
+
charon->socket->send(charon->socket, packet);
packet->destroy(packet);
return JOB_REQUEUE_DIRECT;