Port range support in updown script
This commit is contained in:
@@ -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) ||
|
||||||
|
|||||||
Reference in New Issue
Block a user