libnl 3.7.0
template.c
1/* SPDX-License-Identifier: LGPL-2.1-only */
2/*
3 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
4 *
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
16 * distribution.
17 *
18 * Neither the name of Texas Instruments Incorporated nor the names of
19 * its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 */
35/**
36 * @ingroup xfrmnl
37 * @defgroup XFRM User Template Object
38 *
39 * Abstract data type representing XFRM SA properties
40 *
41 * @{
42 *
43 * Header
44 * ------
45 * ~~~~{.c}
46 * #include <netlink/xfrm/template.h>
47 * ~~~~
48 */
49
50#include <netlink/xfrm/template.h>
51#include <netlink-private/netlink.h>
52
53void xfrmnl_user_tmpl_free(struct xfrmnl_user_tmpl* utmpl)
54{
55 if (!utmpl)
56 return;
57
58 nl_addr_put (utmpl->id.daddr);
59 nl_addr_put (utmpl->saddr);
60 free(utmpl);
61}
62
63/**
64 * @name Creating User Template Object
65 * @{
66 */
67
68/**
69 * Allocate new user template object.
70 * @return Newly allocated user template object or NULL
71 */
72struct xfrmnl_user_tmpl* xfrmnl_user_tmpl_alloc()
73{
74 struct xfrmnl_user_tmpl* utmpl;
75
76 utmpl = calloc(1, sizeof(struct xfrmnl_user_tmpl));
77 if (!utmpl)
78 return NULL;
79
80 nl_init_list_head(&utmpl->utmpl_list);
81
82 return utmpl;
83}
84
85/**
86 * Clone existing user template object.
87 * @arg utmpl Selector object.
88 * @return Newly allocated user template object being a duplicate of the
89 * specified user template object or NULL if a failure occured.
90 */
91struct xfrmnl_user_tmpl* xfrmnl_user_tmpl_clone(struct xfrmnl_user_tmpl* utmpl)
92{
93 struct xfrmnl_user_tmpl* new;
94
96 if (!new)
97 return NULL;
98
99 memcpy(new, utmpl, sizeof(struct xfrmnl_user_tmpl));
100 new->id.daddr = nl_addr_clone (utmpl->id.daddr);
101 new->saddr = nl_addr_clone (utmpl->saddr);
102
103 return new;
104}
105
106/** @} */
107
108/**
109 * @name XFRM Template Mode Translations
110 * @{
111 */
112static const struct trans_tbl tmpl_modes[] = {
113 __ADD(XFRM_MODE_TRANSPORT, transport),
114 __ADD(XFRM_MODE_TUNNEL, tunnel),
115 __ADD(XFRM_MODE_ROUTEOPTIMIZATION, route optimization),
116 __ADD(XFRM_MODE_IN_TRIGGER, in trigger),
117 __ADD(XFRM_MODE_BEET, beet),
118};
119
120char* xfrmnl_user_tmpl_mode2str(int mode, char *buf, size_t len)
121{
122 return __type2str (mode, buf, len, tmpl_modes, ARRAY_SIZE(tmpl_modes));
123}
124
125int xfrmnl_user_tmpl_str2mode(const char *name)
126{
127 return __str2type (name, tmpl_modes, ARRAY_SIZE(tmpl_modes));
128}
129/** @} */
130
131/**
132 * @name Miscellaneous
133 * @{
134 */
135
136/**
137 * Compares two user template objects.
138 * @arg a A user template object.
139 * @arg b Another user template object.
140 *
141 * @return Non zero if difference is found, 0 otherwise if both
142 * the objects are identical.
143 */
144int xfrmnl_user_tmpl_cmp(struct xfrmnl_user_tmpl* a, struct xfrmnl_user_tmpl* b)
145{
146 /* Check for any differences */
147 if ((nl_addr_cmp_prefix (a->id.daddr, b->id.daddr) != 0) ||
148 (a->id.spi != b->id.spi) ||
149 (a->id.proto && (a->id.proto != b->id.proto)) ||
150 (nl_addr_cmp_prefix (a->saddr, b->saddr) != 0) ||
151 (a->family != b->family) ||
152 (a->reqid != b->reqid) ||
153 (a->mode != b->mode) ||
154 (a->share != b->share) ||
155 (a->aalgos != b->aalgos) ||
156 (a->ealgos != b->ealgos) ||
157 (a->calgos != b->calgos))
158 return 1;
159
160 /* The objects are identical */
161 return 0;
162}
163
164void xfrmnl_user_tmpl_dump(struct xfrmnl_user_tmpl* tmpl, struct nl_dump_params *p)
165{
166 char dst[INET6_ADDRSTRLEN+5], src[INET6_ADDRSTRLEN+5];
167 char buf [128];
168
169 nl_dump_line(p, "\t\tsrc %s dst %s family: %s \n",
170 nl_addr2str(tmpl->saddr, src, sizeof(src)),
171 nl_addr2str (tmpl->id.daddr, dst, sizeof (dst)),
172 nl_af2str (tmpl->family, buf, 128));
173 nl_dump_line (p, "\t\tprotocol: %s spi: 0x%x reqid: %u mode: %s\n",
174 nl_ip_proto2str (tmpl->id.proto, buf, sizeof(buf)),
175 tmpl->id.spi, tmpl->reqid,
176 xfrmnl_user_tmpl_mode2str (tmpl->mode, buf, 128));
177 nl_dump_line (p, "\t\tAuth Algo: 0x%x Crypto Algo: 0x%x Compr Algo: 0x%x\n",
178 tmpl->aalgos, tmpl->ealgos, tmpl->calgos);
179
180 return;
181}
182
183/** @} */
184
185/**
186 * @name Attributes
187 * @{
188 */
189struct nl_addr* xfrmnl_user_tmpl_get_daddr (struct xfrmnl_user_tmpl* utmpl)
190{
191 return utmpl->id.daddr;
192}
193
194int xfrmnl_user_tmpl_set_daddr (struct xfrmnl_user_tmpl* utmpl, struct nl_addr* addr)
195{
196 /* Increment reference counter on this to keep this address
197 * object around while user template in use */
198 nl_addr_get(addr);
199
200 utmpl->id.daddr = addr;
201
202 return 0;
203}
204
205int xfrmnl_user_tmpl_get_spi (struct xfrmnl_user_tmpl* utmpl)
206{
207 return utmpl->id.spi;
208}
209
210int xfrmnl_user_tmpl_set_spi (struct xfrmnl_user_tmpl* utmpl, unsigned int spi)
211{
212 utmpl->id.spi = spi;
213
214 return 0;
215}
216
217int xfrmnl_user_tmpl_get_proto (struct xfrmnl_user_tmpl* utmpl)
218{
219 return utmpl->id.proto;
220}
221
222int xfrmnl_user_tmpl_set_proto (struct xfrmnl_user_tmpl* utmpl, unsigned int protocol)
223{
224 utmpl->id.proto = protocol;
225
226 return 0;
227}
228
229int xfrmnl_user_tmpl_get_family(struct xfrmnl_user_tmpl *utmpl)
230{
231 return utmpl->family;
232}
233
234int xfrmnl_user_tmpl_set_family(struct xfrmnl_user_tmpl *utmpl, unsigned int family)
235{
236 utmpl->family = family;
237
238 return 0;
239}
240
241struct nl_addr* xfrmnl_user_tmpl_get_saddr (struct xfrmnl_user_tmpl* utmpl)
242{
243 return utmpl->saddr;
244}
245
246int xfrmnl_user_tmpl_set_saddr (struct xfrmnl_user_tmpl* utmpl, struct nl_addr* addr)
247{
248 /* Increment reference counter on this to keep this address
249 * object around while user template in use */
250 nl_addr_get(addr);
251
252 utmpl->saddr = addr;
253
254 return 0;
255}
256
257int xfrmnl_user_tmpl_get_reqid (struct xfrmnl_user_tmpl* utmpl)
258{
259 return utmpl->reqid;
260}
261
262int xfrmnl_user_tmpl_set_reqid (struct xfrmnl_user_tmpl* utmpl, unsigned int reqid)
263{
264 utmpl->reqid = reqid;
265
266 return 0;
267}
268
269int xfrmnl_user_tmpl_get_mode (struct xfrmnl_user_tmpl* utmpl)
270{
271 return utmpl->mode;
272}
273
274int xfrmnl_user_tmpl_set_mode (struct xfrmnl_user_tmpl* utmpl, unsigned int mode)
275{
276 utmpl->mode = mode;
277
278 return 0;
279}
280
281int xfrmnl_user_tmpl_get_share (struct xfrmnl_user_tmpl* utmpl)
282{
283 return utmpl->share;
284}
285
286int xfrmnl_user_tmpl_set_share (struct xfrmnl_user_tmpl* utmpl, unsigned int share)
287{
288 utmpl->share = share;
289
290 return 0;
291}
292
293int xfrmnl_user_tmpl_get_optional (struct xfrmnl_user_tmpl* utmpl)
294{
295 return utmpl->optional;
296}
297
298int xfrmnl_user_tmpl_set_optional (struct xfrmnl_user_tmpl* utmpl, unsigned int optional)
299{
300 utmpl->optional = optional;
301
302 return 0;
303}
304
305int xfrmnl_user_tmpl_get_aalgos (struct xfrmnl_user_tmpl* utmpl)
306{
307 return utmpl->aalgos;
308}
309
310int xfrmnl_user_tmpl_set_aalgos (struct xfrmnl_user_tmpl* utmpl, unsigned int aalgos)
311{
312 utmpl->aalgos = aalgos;
313
314 return 0;
315}
316
317int xfrmnl_user_tmpl_get_ealgos (struct xfrmnl_user_tmpl* utmpl)
318{
319 return utmpl->ealgos;
320}
321
322int xfrmnl_user_tmpl_set_ealgos (struct xfrmnl_user_tmpl* utmpl, unsigned int ealgos)
323{
324 utmpl->ealgos = ealgos;
325
326 return 0;
327}
328
329int xfrmnl_user_tmpl_get_calgos (struct xfrmnl_user_tmpl* utmpl)
330{
331 return utmpl->calgos;
332}
333
334int xfrmnl_user_tmpl_set_calgos (struct xfrmnl_user_tmpl* utmpl, unsigned int calgos)
335{
336 utmpl->calgos = calgos;
337
338 return 0;
339}
340
341/** @} */
struct xfrmnl_user_tmpl * xfrmnl_user_tmpl_clone(struct xfrmnl_user_tmpl *utmpl)
Clone existing user template object.
Definition: template.c:91
int xfrmnl_user_tmpl_cmp(struct xfrmnl_user_tmpl *a, struct xfrmnl_user_tmpl *b)
Compares two user template objects.
Definition: template.c:144
struct xfrmnl_user_tmpl * xfrmnl_user_tmpl_alloc()
Allocate new user template object.
Definition: template.c:72
struct nl_addr * nl_addr_get(struct nl_addr *addr)
Increase the reference counter of an abstract address.
Definition: addr.c:522
struct nl_addr * nl_addr_clone(const struct nl_addr *addr)
Clone existing abstract address object.
Definition: addr.c:492
int nl_addr_cmp_prefix(const struct nl_addr *a, const struct nl_addr *b)
Compare the prefix of two abstract addresses.
Definition: addr.c:623
char * nl_addr2str(const struct nl_addr *addr, char *buf, size_t size)
Convert abstract address object to character string.
Definition: addr.c:998
void nl_addr_put(struct nl_addr *addr)
Decrease the reference counter of an abstract address.
Definition: addr.c:538
Dumping parameters.
Definition: types.h:28