using own routing table for installed routes (table 100, prio 100)
This commit is contained in:
@@ -51,6 +51,14 @@
|
|||||||
#include <processing/jobs/callback_job.h>
|
#include <processing/jobs/callback_job.h>
|
||||||
#include <processing/jobs/roam_job.h>
|
#include <processing/jobs/roam_job.h>
|
||||||
|
|
||||||
|
/** routing table for routes installed by us */
|
||||||
|
#ifndef IPSEC_ROUTING_TABLE
|
||||||
|
#define IPSEC_ROUTING_TABLE 100
|
||||||
|
#endif
|
||||||
|
#ifndef IPSEC_ROUTING_TABLE_PRIO
|
||||||
|
#define IPSEC_ROUTING_TABLE_PRIO 100
|
||||||
|
#endif
|
||||||
|
|
||||||
/** kernel level protocol identifiers */
|
/** kernel level protocol identifiers */
|
||||||
#define KERNEL_ESP 50
|
#define KERNEL_ESP 50
|
||||||
#define KERNEL_AH 51
|
#define KERNEL_AH 51
|
||||||
@@ -1364,7 +1372,7 @@ static status_t manage_srcroute(private_kernel_interface_t *this, int nlmsg_type
|
|||||||
msg = (struct rtmsg*)NLMSG_DATA(hdr);
|
msg = (struct rtmsg*)NLMSG_DATA(hdr);
|
||||||
msg->rtm_family = route->src_ip->get_family(route->src_ip);
|
msg->rtm_family = route->src_ip->get_family(route->src_ip);
|
||||||
msg->rtm_dst_len = route->prefixlen;
|
msg->rtm_dst_len = route->prefixlen;
|
||||||
msg->rtm_table = RT_TABLE_MAIN;
|
msg->rtm_table = IPSEC_ROUTING_TABLE;
|
||||||
msg->rtm_protocol = RTPROT_STATIC;
|
msg->rtm_protocol = RTPROT_STATIC;
|
||||||
msg->rtm_type = RTN_UNICAST;
|
msg->rtm_type = RTN_UNICAST;
|
||||||
msg->rtm_scope = RT_SCOPE_UNIVERSE;
|
msg->rtm_scope = RT_SCOPE_UNIVERSE;
|
||||||
@@ -1381,6 +1389,40 @@ static status_t manage_srcroute(private_kernel_interface_t *this, int nlmsg_type
|
|||||||
return netlink_send_ack(this, this->socket_rt, hdr);
|
return netlink_send_ack(this, this->socket_rt, hdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create or delete an rule to use our routing table
|
||||||
|
*/
|
||||||
|
static status_t manage_rule(private_kernel_interface_t *this, int nlmsg_type,
|
||||||
|
u_int32_t table, u_int32_t prio)
|
||||||
|
{
|
||||||
|
unsigned char request[BUFFER_SIZE];
|
||||||
|
struct nlmsghdr *hdr;
|
||||||
|
struct rtmsg *msg;
|
||||||
|
chunk_t chunk;
|
||||||
|
|
||||||
|
memset(&request, 0, sizeof(request));
|
||||||
|
hdr = (struct nlmsghdr*)request;
|
||||||
|
hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
|
||||||
|
hdr->nlmsg_type = nlmsg_type;
|
||||||
|
if (nlmsg_type == RTM_NEWRULE)
|
||||||
|
{
|
||||||
|
hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
|
||||||
|
}
|
||||||
|
hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
|
||||||
|
|
||||||
|
msg = (struct rtmsg*)NLMSG_DATA(hdr);
|
||||||
|
msg->rtm_table = table;
|
||||||
|
msg->rtm_family = AF_INET;
|
||||||
|
msg->rtm_protocol = RTPROT_BOOT;
|
||||||
|
msg->rtm_scope = RT_SCOPE_UNIVERSE;
|
||||||
|
msg->rtm_type = RTN_UNICAST;
|
||||||
|
|
||||||
|
chunk = chunk_from_thing(prio);
|
||||||
|
add_attribute(hdr, RTA_PRIORITY, chunk, sizeof(request));
|
||||||
|
|
||||||
|
return netlink_send_ack(this, this->socket_rt, hdr);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the nexthop gateway for dest; or the source addr if gateway = FALSE
|
* Get the nexthop gateway for dest; or the source addr if gateway = FALSE
|
||||||
*/
|
*/
|
||||||
@@ -2340,6 +2382,8 @@ static status_t del_policy(private_kernel_interface_t *this,
|
|||||||
*/
|
*/
|
||||||
static void destroy(private_kernel_interface_t *this)
|
static void destroy(private_kernel_interface_t *this)
|
||||||
{
|
{
|
||||||
|
manage_rule(this, RTM_DELRULE, IPSEC_ROUTING_TABLE, IPSEC_ROUTING_TABLE_PRIO);
|
||||||
|
|
||||||
this->job->cancel(this->job);
|
this->job->cancel(this->job);
|
||||||
close(this->socket_xfrm_events);
|
close(this->socket_xfrm_events);
|
||||||
close(this->socket_xfrm);
|
close(this->socket_xfrm);
|
||||||
@@ -2442,6 +2486,12 @@ kernel_interface_t *kernel_interface_create()
|
|||||||
charon->kill(charon, "unable to get interface list");
|
charon->kill(charon, "unable to get interface list");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (manage_rule(this, RTM_NEWRULE, IPSEC_ROUTING_TABLE,
|
||||||
|
IPSEC_ROUTING_TABLE_PRIO) != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG1(DBG_KNL, "unable to create routing table rule");
|
||||||
|
}
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user