Port range support in updown script

This commit is contained in:
Andreas Steffen
2016-03-04 09:52:34 +01:00
parent 6abae81f86
commit 0d7202c7c5
+37 -13
View File
@@ -1,7 +1,8 @@
/* /*
* Copyright (C) 2013 Tobias Brunner * Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2008 Martin Willi * Copyright (C) 2008 Martin Willi
* Hochschule fuer Technik Rapperswil * Copyright (C) 2016 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@@ -204,25 +205,47 @@ static void push_vip_env(private_updown_listener_t *this, ike_sa_t *ike_sa,
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
} }
#define PORT_BUF_LEN 12
/** /**
* Determine proper values for port env variable * Determine proper values for port env variable
*/ */
static u_int16_t get_port(traffic_selector_t *me, static char* get_port(traffic_selector_t *me, traffic_selector_t *other,
traffic_selector_t *other, bool local) char *port_buf, bool local)
{ {
uint16_t port, to, from;
switch (max(me->get_protocol(me), other->get_protocol(other))) switch (max(me->get_protocol(me), other->get_protocol(other)))
{ {
case IPPROTO_ICMP: case IPPROTO_ICMP:
case IPPROTO_ICMPV6: case IPPROTO_ICMPV6:
{ {
u_int16_t port = me->get_from_port(me); port = max(me->get_from_port(me), other->get_from_port(other));
snprintf(port_buf, PORT_BUF_LEN, "%u",
port = max(port, other->get_from_port(other)); local ? traffic_selector_icmp_type(port)
return local ? traffic_selector_icmp_type(port) : traffic_selector_icmp_code(port));
: traffic_selector_icmp_code(port); return port_buf;
} }
} }
return local ? me->get_from_port(me) : other->get_from_port(other); if (local)
{
from = me->get_from_port(me);
to = me->get_to_port(me);
}
else
{
from = other->get_from_port(other);
to = other->get_to_port(other);
}
if (from == to)
{
snprintf(port_buf, PORT_BUF_LEN, "%u", from);
}
else
{
snprintf(port_buf, PORT_BUF_LEN, "%u:%u", from, to);
}
return port_buf;
} }
/** /**
@@ -240,6 +263,7 @@ static void invoke_once(private_updown_listener_t *this, ike_sa_t *ike_sa,
int out; int out;
FILE *shell; FILE *shell;
process_t *process; process_t *process;
char port_buf[PORT_BUF_LEN];
char *envp[128] = {}; char *envp[128] = {};
me = ike_sa->get_my_host(ike_sa); me = ike_sa->get_my_host(ike_sa);
@@ -292,8 +316,8 @@ static void invoke_once(private_updown_listener_t *this, ike_sa_t *ike_sa,
push_env(envp, countof(envp), "PLUTO_MY_CLIENT=%+H/%u", host, mask); push_env(envp, countof(envp), "PLUTO_MY_CLIENT=%+H/%u", host, mask);
host->destroy(host); host->destroy(host);
} }
push_env(envp, countof(envp), "PLUTO_MY_PORT=%u", push_env(envp, countof(envp), "PLUTO_MY_PORT=%s",
get_port(my_ts, other_ts, TRUE)); get_port(my_ts, other_ts, port_buf, TRUE));
push_env(envp, countof(envp), "PLUTO_MY_PROTOCOL=%u", push_env(envp, countof(envp), "PLUTO_MY_PROTOCOL=%u",
my_ts->get_protocol(my_ts)); my_ts->get_protocol(my_ts));
push_env(envp, countof(envp), "PLUTO_PEER=%H", other); push_env(envp, countof(envp), "PLUTO_PEER=%H", other);
@@ -304,8 +328,8 @@ static void invoke_once(private_updown_listener_t *this, ike_sa_t *ike_sa,
push_env(envp, countof(envp), "PLUTO_PEER_CLIENT=%+H/%u", host, mask); push_env(envp, countof(envp), "PLUTO_PEER_CLIENT=%+H/%u", host, mask);
host->destroy(host); host->destroy(host);
} }
push_env(envp, countof(envp), "PLUTO_PEER_PORT=%u", push_env(envp, countof(envp), "PLUTO_PEER_PORT=%s",
get_port(my_ts, other_ts, FALSE)); get_port(my_ts, other_ts, port_buf, FALSE));
push_env(envp, countof(envp), "PLUTO_PEER_PROTOCOL=%u", push_env(envp, countof(envp), "PLUTO_PEER_PROTOCOL=%u",
other_ts->get_protocol(other_ts)); other_ts->get_protocol(other_ts));
if (ike_sa->has_condition(ike_sa, COND_EAP_AUTHENTICATED) || if (ike_sa->has_condition(ike_sa, COND_EAP_AUTHENTICATED) ||