Handle Non-ESP marker in receiver and not individual socket plugins.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2008 Tobias Brunner
|
* Copyright (C) 2008-2012 Tobias Brunner
|
||||||
* Copyright (C) 2005-2006 Martin Willi
|
* Copyright (C) 2005-2006 Martin Willi
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
* Hochschule fuer Technik Rapperswil
|
* Hochschule fuer Technik Rapperswil
|
||||||
@@ -400,6 +400,7 @@ static job_requeue_t receive_packets(private_receiver_t *this)
|
|||||||
ike_sa_id_t *id;
|
ike_sa_id_t *id;
|
||||||
packet_t *packet;
|
packet_t *packet;
|
||||||
message_t *message;
|
message_t *message;
|
||||||
|
host_t *src, *dst;
|
||||||
status_t status;
|
status_t status;
|
||||||
bool supported = TRUE;
|
bool supported = TRUE;
|
||||||
|
|
||||||
@@ -415,6 +416,28 @@ static job_requeue_t receive_packets(private_receiver_t *this)
|
|||||||
return JOB_REQUEUE_FAIR;
|
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 */
|
/* parse message header */
|
||||||
message = message_create_from_packet(packet);
|
message = message_create_from_packet(packet);
|
||||||
if (message->parse_header(message) != SUCCESS)
|
if (message->parse_header(message) != SUCCESS)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2006-2010 Tobias Brunner
|
* Copyright (C) 2006-2012 Tobias Brunner
|
||||||
* Copyright (C) 2006 Daniel Roethlisberger
|
* Copyright (C) 2006 Daniel Roethlisberger
|
||||||
* Copyright (C) 2005-2010 Martin Willi
|
* Copyright (C) 2005-2010 Martin Willi
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
@@ -133,7 +133,7 @@ METHOD(socket_t, receiver, status_t,
|
|||||||
chunk_t data;
|
chunk_t data;
|
||||||
packet_t *pkt;
|
packet_t *pkt;
|
||||||
host_t *source = NULL, *dest = NULL;
|
host_t *source = NULL, *dest = NULL;
|
||||||
int bytes_read = 0, data_offset;
|
int bytes_read = 0;
|
||||||
bool oldstate;
|
bool oldstate;
|
||||||
|
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
@@ -297,17 +297,8 @@ METHOD(socket_t, receiver, status_t,
|
|||||||
pkt->set_source(pkt, source);
|
pkt->set_source(pkt, source);
|
||||||
pkt->set_destination(pkt, dest);
|
pkt->set_destination(pkt, dest);
|
||||||
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
||||||
data_offset = 0;
|
data = chunk_create(buffer, bytes_read);
|
||||||
/* remove non esp marker */
|
pkt->set_data(pkt, chunk_clone(data));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2006-2010 Tobias Brunner
|
* Copyright (C) 2006-2012 Tobias Brunner
|
||||||
* Copyright (C) 2006 Daniel Roethlisberger
|
* Copyright (C) 2006 Daniel Roethlisberger
|
||||||
* Copyright (C) 2005-2010 Martin Willi
|
* Copyright (C) 2005-2010 Martin Willi
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
@@ -297,12 +297,6 @@ static packet_t *receive_packet(private_socket_dynamic_socket_t *this,
|
|||||||
packet = packet_create();
|
packet = packet_create();
|
||||||
packet->set_source(packet, source);
|
packet->set_source(packet, source);
|
||||||
packet->set_destination(packet, dest);
|
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));
|
packet->set_data(packet, chunk_clone(data));
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2006-2010 Tobias Brunner
|
* Copyright (C) 2006-2012 Tobias Brunner
|
||||||
* Copyright (C) 2005-2010 Martin Willi
|
* Copyright (C) 2005-2010 Martin Willi
|
||||||
* Copyright (C) 2006 Daniel Roethlisberger
|
* Copyright (C) 2006 Daniel Roethlisberger
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
@@ -203,16 +203,9 @@ METHOD(socket_t, receiver, status_t,
|
|||||||
pkt->set_destination(pkt, dest);
|
pkt->set_destination(pkt, dest);
|
||||||
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
||||||
data_offset = IP_LEN + UDP_LEN;
|
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.len = bytes_read - data_offset;
|
||||||
data.ptr = malloc(data.len);
|
data.ptr = buffer + data_offset;
|
||||||
memcpy(data.ptr, buffer + data_offset, data.len);
|
pkt->set_data(pkt, chunk_clone(data));
|
||||||
pkt->set_data(pkt, data);
|
|
||||||
}
|
}
|
||||||
else if (this->recv6 && FD_ISSET(this->recv6, &rfds))
|
else if (this->recv6 && FD_ISSET(this->recv6, &rfds))
|
||||||
{
|
{
|
||||||
@@ -290,16 +283,9 @@ METHOD(socket_t, receiver, status_t,
|
|||||||
pkt->set_destination(pkt, dest);
|
pkt->set_destination(pkt, dest);
|
||||||
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
DBG2(DBG_NET, "received packet: from %#H to %#H", source, dest);
|
||||||
data_offset = UDP_LEN;
|
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.len = bytes_read - data_offset;
|
||||||
data.ptr = malloc(data.len);
|
data.ptr = buffer + data_offset;
|
||||||
memcpy(data.ptr, buffer + data_offset, data.len);
|
pkt->set_data(pkt, chunk_clone(data));
|
||||||
pkt->set_data(pkt, data);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user