Function added to send packets without Non-ESP marker.

This commit is contained in:
Tobias Brunner
2012-08-08 15:12:25 +02:00
parent fe4a152b85
commit fb6c52adcd
2 changed files with 36 additions and 20 deletions
+28 -20
View File
@@ -80,7 +80,7 @@ struct private_sender_t {
bool send_delay_response; bool send_delay_response;
}; };
METHOD(sender_t, send_, void, METHOD(sender_t, send_no_marker, void,
private_sender_t *this, packet_t *packet) private_sender_t *this, packet_t *packet)
{ {
host_t *src, *dst; host_t *src, *dst;
@@ -116,13 +116,37 @@ METHOD(sender_t, send_, void,
this->mutex->unlock(this->mutex); this->mutex->unlock(this->mutex);
} }
METHOD(sender_t, send_, void,
private_sender_t *this, packet_t *packet)
{
host_t *src, *dst;
/* if neither source nor destination port is 500 we add a Non-ESP marker */
src = packet->get_source(packet);
dst = packet->get_destination(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);
}
}
send_no_marker(this, packet);
}
/** /**
* Job callback function to send packets * Job callback function to send packets
*/ */
static job_requeue_t send_packets(private_sender_t * this) static job_requeue_t send_packets(private_sender_t *this)
{ {
packet_t *packet; packet_t *packet;
host_t *src, *dst;
bool oldstate; bool oldstate;
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
@@ -141,23 +165,6 @@ static job_requeue_t send_packets(private_sender_t * this)
this->sent->signal(this->sent); this->sent->signal(this->sent);
this->mutex->unlock(this->mutex); 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); charon->socket->send(charon->socket, packet);
packet->destroy(packet); packet->destroy(packet);
return JOB_REQUEUE_DIRECT; return JOB_REQUEUE_DIRECT;
@@ -195,6 +202,7 @@ sender_t * sender_create()
INIT(this, INIT(this,
.public = { .public = {
.send = _send_, .send = _send_,
.send_no_marker = _send_no_marker,
.flush = _flush, .flush = _flush,
.destroy = _destroy, .destroy = _destroy,
}, },
+8
View File
@@ -1,4 +1,5 @@
/* /*
* Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2005-2007 Martin Willi * Copyright (C) 2005-2007 Martin Willi
* Copyright (C) 2005 Jan Hutter * Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
@@ -43,6 +44,13 @@ struct sender_t {
*/ */
void (*send) (sender_t *this, packet_t *packet); void (*send) (sender_t *this, packet_t *packet);
/**
* The same as send() but does not add Non-ESP markers automatically.
*
* @param packet packet to send
*/
void (*send_no_marker) (sender_t *this, packet_t *packet);
/** /**
* Enforce a flush of the send queue. * Enforce a flush of the send queue.
* *