Handle Non-ESP marker in receiver and not individual socket plugins.
authorTobias Brunner <tobias@strongswan.org>
Thu, 23 Feb 2012 10:35:16 +0000 (11:35 +0100)
committerTobias Brunner <tobias@strongswan.org>
Wed, 8 Aug 2012 13:12:24 +0000 (15:12 +0200)
src/libcharon/network/receiver.c
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 dff76e2..6a39489 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Tobias Brunner
+ * Copyright (C) 2008-2012 Tobias Brunner
  * Copyright (C) 2005-2006 Martin Willi
  * Copyright (C) 2005 Jan Hutter
  * Hochschule fuer Technik Rapperswil
@@ -400,6 +400,7 @@ static job_requeue_t receive_packets(private_receiver_t *this)
        ike_sa_id_t *id;
        packet_t *packet;
        message_t *message;
+       host_t *src, *dst;
        status_t status;
        bool supported = TRUE;
 
@@ -415,6 +416,28 @@ static job_requeue_t receive_packets(private_receiver_t *this)
                return JOB_REQUEUE_FAIR;
        }
 
+       /* if neither source nor destination port is 500 we assume an IKE packet
+        * with Non-ESP marker or an ESP packet */
+       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);
+               if (memeq(data.ptr, marker.ptr, marker.len))
+               {       /* remove Non-ESP marker */
+                       data = chunk_skip(data, marker.len);
+                       packet->set_data(packet, chunk_clone(data));
+               }
+               else
+               {       /* this seems to be an ESP packet */
+                       packet->destroy(packet);
+                       return JOB_REQUEUE_DIRECT;
+               }
+       }
+
        /* parse message header */
        message = message_create_from_packet(packet);
        if (message->parse_header(message) != SUCCESS)
index 0df040e..a0b8e0b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2010 Tobias Brunner
+ * Copyright (C) 2006-2012 Tobias Brunner
  * Copyright (C) 2006 Daniel Roethlisberger
  * Copyright (C) 2005-2010 Martin Willi
  * Copyright (C) 2005 Jan Hutter
@@ -133,7 +133,7 @@ METHOD(socket_t, receiver, status_t,
        chunk_t data;
        packet_t *pkt;
        host_t *source = NULL, *dest = NULL;
-       int bytes_read = 0, data_offset;
+       int bytes_read = 0;
        bool oldstate;
 
        fd_set rfds;
@@ -297,17 +297,8 @@ METHOD(socket_t, receiver, status_t,
                pkt->set_source(pkt, source);
                pkt->set_destination(pkt, dest);
                DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
-               data_offset = 0;
-               /* remove non esp marker */
-               if (dest->get_port(dest) == CHARON_NATT_PORT)
-               {
-                       data_offset += MARKER_LEN;
-               }
-               /* fill in packet */
-               data.len = bytes_read - data_offset;
-               data.ptr = malloc(data.len);
-               memcpy(data.ptr, buffer + data_offset, data.len);
-               pkt->set_data(pkt, data);
+               data = chunk_create(buffer, bytes_read);
+               pkt->set_data(pkt, chunk_clone(data));
        }
        else
        {
index d4a9552..39ba473 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2010 Tobias Brunner
+ * Copyright (C) 2006-2012 Tobias Brunner
  * Copyright (C) 2006 Daniel Roethlisberger
  * Copyright (C) 2005-2010 Martin Willi
  * Copyright (C) 2005 Jan Hutter
@@ -297,12 +297,6 @@ static packet_t *receive_packet(private_socket_dynamic_socket_t *this,
        packet = packet_create();
        packet->set_source(packet, source);
        packet->set_destination(packet, dest);
-       /* we assume a non-ESP marker if none of the ports is on 500 */
-       if (dest->get_port(dest) != IKEV2_UDP_PORT &&
-               source->get_port(source) != IKEV2_UDP_PORT)
-       {
-               data = chunk_skip(data, MARKER_LEN);
-       }
        packet->set_data(packet, chunk_clone(data));
        return packet;
 }
index 5394113..f363671 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2010 Tobias Brunner
+ * Copyright (C) 2006-2012 Tobias Brunner
  * Copyright (C) 2005-2010 Martin Willi
  * Copyright (C) 2006 Daniel Roethlisberger
  * Copyright (C) 2005 Jan Hutter
@@ -203,16 +203,9 @@ METHOD(socket_t, receiver, status_t,
                pkt->set_destination(pkt, dest);
                DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
                data_offset = IP_LEN + UDP_LEN;
-               /* remove non esp marker */
-               if (dest->get_port(dest) == CHARON_NATT_PORT)
-               {
-                       data_offset += MARKER_LEN;
-               }
-               /* fill in packet */
                data.len = bytes_read - data_offset;
-               data.ptr = malloc(data.len);
-               memcpy(data.ptr, buffer + data_offset, data.len);
-               pkt->set_data(pkt, data);
+               data.ptr = buffer + data_offset;
+               pkt->set_data(pkt, chunk_clone(data));
        }
        else if (this->recv6 && FD_ISSET(this->recv6, &rfds))
        {
@@ -290,16 +283,9 @@ METHOD(socket_t, receiver, status_t,
                pkt->set_destination(pkt, dest);
                DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
                data_offset = UDP_LEN;
-               /* remove non esp marker */
-               if (dest->get_port(dest) == CHARON_NATT_PORT)
-               {
-                       data_offset += MARKER_LEN;
-               }
-               /* fill in packet */
                data.len = bytes_read - data_offset;
-               data.ptr = malloc(data.len);
-               memcpy(data.ptr, buffer + data_offset, data.len);
-               pkt->set_data(pkt, data);
+               data.ptr = buffer + data_offset;
+               pkt->set_data(pkt, chunk_clone(data));
        }
        else
        {