Add Non-ESP marker in sender and not individual socket plugins.
authorTobias Brunner <tobias@strongswan.org>
Thu, 23 Feb 2012 10:51:53 +0000 (11:51 +0100)
committerTobias Brunner <tobias@strongswan.org>
Wed, 8 Aug 2012 13:12:24 +0000 (15:12 +0200)
src/libcharon/network/sender.c
src/libcharon/network/sender.h
src/libcharon/plugins/socket_default/socket_default_socket.c
src/libcharon/plugins/socket_dynamic/socket_dynamic_socket.c
src/libcharon/plugins/socket_raw/socket_raw_socket.c

index 75635d2..b62185f 100644 (file)
@@ -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;
index 6ee0704..d8ff8c8 100644 (file)
@@ -28,7 +28,7 @@ typedef struct sender_t sender_t;
 #include <network/packet.h>
 
 /**
- * Thread responsible for sending packets over the socket.
+ * Callback job responsible for sending IKE packets over the socket.
  */
 struct sender_t {
 
index a0b8e0b..eba7219 100644 (file)
@@ -315,7 +315,7 @@ METHOD(socket_t, sender, status_t,
 {
        int sport, skt, family;
        ssize_t bytes_sent;
-       chunk_t data, marked;
+       chunk_t data;
        host_t *src, *dst;
        struct msghdr msg;
        struct cmsghdr *cmsg;
@@ -351,17 +351,6 @@ METHOD(socket_t, sender, status_t,
                {
                        skt = this->ipv6_natt;
                }
-               /* NAT keepalives without marker */
-               if (data.len != 1 || data.ptr[0] != 0xFF)
-               {
-                       /* add non esp marker to packet */
-                       marked = chunk_alloc(data.len + MARKER_LEN);
-                       memset(marked.ptr, 0, MARKER_LEN);
-                       memcpy(marked.ptr + MARKER_LEN, data.ptr, data.len);
-                       /* let the packet do the clean up for us */
-                       packet->set_data(packet, marked);
-                       data = marked;
-               }
        }
        else
        {
index 39ba473..ec61e61 100644 (file)
@@ -477,7 +477,7 @@ METHOD(socket_t, sender, status_t,
        host_t *src, *dst;
        int port, family;
        ssize_t len;
-       chunk_t data, marked;
+       chunk_t data;
        struct msghdr msg;
        struct cmsghdr *cmsg;
        struct iovec iov;
@@ -495,19 +495,6 @@ METHOD(socket_t, sender, status_t,
        data = packet->get_data(packet);
        DBG2(DBG_NET, "sending packet: from %#H to %#H", src, dst);
 
-       /* use non-ESP marker if none of the ports is 500, not for keep alives */
-       if (port != IKEV2_UDP_PORT && dst->get_port(dst) != IKEV2_UDP_PORT &&
-               !(data.len == 1 && data.ptr[0] == 0xFF))
-       {
-               /* add non esp marker to packet */
-               marked = chunk_alloc(data.len + MARKER_LEN);
-               memset(marked.ptr, 0, MARKER_LEN);
-               memcpy(marked.ptr + MARKER_LEN, data.ptr, data.len);
-               /* let the packet do the clean up for us */
-               packet->set_data(packet, marked);
-               data = marked;
-       }
-
        memset(&msg, 0, sizeof(struct msghdr));
        msg.msg_name = dst->get_sockaddr(dst);;
        msg.msg_namelen = *dst->get_sockaddr_len(dst);
index f363671..600f545 100644 (file)
@@ -303,7 +303,7 @@ METHOD(socket_t, sender, status_t,
 {
        int sport, skt, family;
        ssize_t bytes_sent;
-       chunk_t data, marked;
+       chunk_t data;
        host_t *src, *dst;
        struct msghdr msg;
        struct cmsghdr *cmsg;
@@ -339,17 +339,6 @@ METHOD(socket_t, sender, status_t,
                {
                        skt = this->send6_natt;
                }
-               /* NAT keepalives without marker */
-               if (data.len != 1 || data.ptr[0] != 0xFF)
-               {
-                       /* add non esp marker to packet */
-                       marked = chunk_alloc(data.len + MARKER_LEN);
-                       memset(marked.ptr, 0, MARKER_LEN);
-                       memcpy(marked.ptr + MARKER_LEN, data.ptr, data.len);
-                       /* let the packet do the clean up for us */
-                       packet->set_data(packet, marked);
-                       data = marked;
-               }
        }
        else
        {