2 * Copyright (C) 2012 Tobias Brunner
3 * Copyright (C) 2012 Giuliano Grassi
4 * Copyright (C) 2012 Ralf Sager
5 * Hochschule fuer Technik Rapperswil
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "android_ipsec.h"
18 #include "../charonservice.h"
25 typedef struct private_kernel_android_ipsec_t private_kernel_android_ipsec_t
;
27 struct private_kernel_android_ipsec_t
{
30 * Public kernel interface
32 kernel_android_ipsec_t
public;
35 * Listener for lifetime expire events
37 ipsec_event_listener_t ipsec_listener
;
41 * Callback registrered with libipsec.
43 void expire(u_int32_t reqid
, u_int8_t protocol
, u_int32_t spi
, bool hard
)
45 hydra
->kernel_interface
->expire(hydra
->kernel_interface
, reqid
, protocol
,
49 METHOD(kernel_ipsec_t
, get_spi
, status_t
,
50 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
51 u_int8_t protocol
, u_int32_t reqid
, u_int32_t
*spi
)
53 return ipsec
->sas
->get_spi(ipsec
->sas
, src
, dst
, protocol
, reqid
, spi
);
56 METHOD(kernel_ipsec_t
, get_cpi
, status_t
,
57 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
58 u_int32_t reqid
, u_int16_t
*cpi
)
63 METHOD(kernel_ipsec_t
, add_sa
, status_t
,
64 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
65 u_int32_t spi
, u_int8_t protocol
, u_int32_t reqid
, mark_t mark
,
66 u_int32_t tfc
, lifetime_cfg_t
*lifetime
, u_int16_t enc_alg
, chunk_t enc_key
,
67 u_int16_t int_alg
, chunk_t int_key
, ipsec_mode_t mode
, u_int16_t ipcomp
,
68 u_int16_t cpi
, bool encap
, bool esn
, bool inbound
,
69 traffic_selector_t
*src_ts
, traffic_selector_t
*dst_ts
)
71 return ipsec
->sas
->add_sa(ipsec
->sas
, src
, dst
, spi
, protocol
, reqid
, mark
,
72 tfc
, lifetime
, enc_alg
, enc_key
, int_alg
, int_key
,
73 mode
, ipcomp
, cpi
, encap
, esn
, inbound
, src_ts
,
77 METHOD(kernel_ipsec_t
, update_sa
, status_t
,
78 private_kernel_android_ipsec_t
*this, u_int32_t spi
, u_int8_t protocol
,
79 u_int16_t cpi
, host_t
*src
, host_t
*dst
, host_t
*new_src
, host_t
*new_dst
,
80 bool encap
, bool new_encap
, mark_t mark
)
85 METHOD(kernel_ipsec_t
, query_sa
, status_t
,
86 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
87 u_int32_t spi
, u_int8_t protocol
, mark_t mark
, u_int64_t
*bytes
)
92 METHOD(kernel_ipsec_t
, del_sa
, status_t
,
93 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
94 u_int32_t spi
, u_int8_t protocol
, u_int16_t cpi
, mark_t mark
)
96 return ipsec
->sas
->del_sa(ipsec
->sas
, src
, dst
, spi
, protocol
, cpi
, mark
);
99 METHOD(kernel_ipsec_t
, flush_sas
, status_t
,
100 private_kernel_android_ipsec_t
*this)
102 return ipsec
->sas
->flush_sas(ipsec
->sas
);
105 METHOD(kernel_ipsec_t
, add_policy
, status_t
,
106 private_kernel_android_ipsec_t
*this, host_t
*src
, host_t
*dst
,
107 traffic_selector_t
*src_ts
, traffic_selector_t
*dst_ts
,
108 policy_dir_t direction
, policy_type_t type
, ipsec_sa_cfg_t
*sa
, mark_t mark
,
109 policy_priority_t priority
)
111 return ipsec
->policies
->add_policy(ipsec
->policies
, src
, dst
, src_ts
,
112 dst_ts
, direction
, type
, sa
, mark
,
116 METHOD(kernel_ipsec_t
, query_policy
, status_t
,
117 private_kernel_android_ipsec_t
*this, traffic_selector_t
*src_ts
,
118 traffic_selector_t
*dst_ts
, policy_dir_t direction
, mark_t mark
,
121 return NOT_SUPPORTED
;
124 METHOD(kernel_ipsec_t
, del_policy
, status_t
,
125 private_kernel_android_ipsec_t
*this, traffic_selector_t
*src_ts
,
126 traffic_selector_t
*dst_ts
, policy_dir_t direction
, u_int32_t reqid
,
127 mark_t mark
, policy_priority_t priority
)
129 return ipsec
->policies
->del_policy(ipsec
->policies
, src_ts
, dst_ts
,
130 direction
, reqid
, mark
, priority
);
133 METHOD(kernel_ipsec_t
, flush_policies
, status_t
,
134 private_kernel_android_ipsec_t
*this)
136 ipsec
->policies
->flush_policies(ipsec
->policies
);
140 METHOD(kernel_ipsec_t
, bypass_socket
, bool,
141 private_kernel_android_ipsec_t
*this, int fd
, int family
)
143 return charonservice
->bypass_socket(charonservice
, fd
, family
);
146 METHOD(kernel_ipsec_t
, enable_udp_decap
, bool,
147 private_kernel_android_ipsec_t
*this, int fd
, int family
, u_int16_t port
)
149 return NOT_SUPPORTED
;
152 METHOD(kernel_ipsec_t
, destroy
, void,
153 private_kernel_android_ipsec_t
*this)
155 ipsec
->events
->unregister_listener(ipsec
->events
, &this->ipsec_listener
);
160 * Described in header.
162 kernel_android_ipsec_t
*kernel_android_ipsec_create()
164 private_kernel_android_ipsec_t
*this;
172 .update_sa
= _update_sa
,
173 .query_sa
= _query_sa
,
175 .flush_sas
= _flush_sas
,
176 .add_policy
= _add_policy
,
177 .query_policy
= _query_policy
,
178 .del_policy
= _del_policy
,
179 .flush_policies
= _flush_policies
,
180 .bypass_socket
= _bypass_socket
,
181 .enable_udp_decap
= _enable_udp_decap
,
190 ipsec
->events
->register_listener(ipsec
->events
, &this->ipsec_listener
);
192 return &this->public;