1/*	$NetBSD: test-pfkey.c,v 1.7 2006/10/06 12:02:27 manu Exp $	*/
2
3/*	$KAME: test-pfkey.c,v 1.4 2000/06/07 00:29:14 itojun Exp $	*/
4
5/*
6 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include <sys/types.h>
35#include <sys/param.h>
36#include <sys/socket.h>
37#include <net/route.h>
38#include <net/pfkeyv2.h>
39#include <netinet/in.h>
40#include <netkey/keydb.h>
41#include <netkey/key_var.h>
42#include <netkey/key_debug.h>
43
44#include <stdio.h>
45#include <stdlib.h>
46#include <limits.h>
47#include <string.h>
48#include <ctype.h>
49#include <unistd.h>
50#include <errno.h>
51#include <netdb.h>
52
53u_char m_buf[BUFSIZ];
54u_int m_len;
55char *pname;
56
57void Usage __P((void));
58int sendkeymsg __P((void));
59void key_setsadbmsg __P((u_int));
60void key_setsadbsens __P((void));
61void key_setsadbprop __P((void));
62void key_setsadbid __P((u_int, caddr_t));
63void key_setsadblft __P((u_int, u_int));
64void key_setspirange __P((void));
65void key_setsadbkey __P((u_int, caddr_t));
66void key_setsadbsa __P((void));
67void key_setsadbaddr __P((u_int, u_int, caddr_t));
68void key_setsadbextbuf __P((caddr_t, int, caddr_t, int, caddr_t, int));
69
70void
71Usage()
72{
73	printf("Usage:\t%s number\n", pname);
74	exit(0);
75}
76
77int
78main(ac, av)
79	int ac;
80	char **av;
81{
82	pname = *av;
83
84	if (ac == 1) Usage();
85
86	key_setsadbmsg(atoi(*(av+1)));
87	sendkeymsg();
88
89	exit(0);
90}
91
92/* %%% */
93int
94sendkeymsg()
95{
96	u_char rbuf[1024 * 32];	/* XXX: Enough ? Should I do MSG_PEEK ? */
97	int so, len;
98
99	if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) {
100		perror("socket(PF_KEY)");
101		goto end;
102	}
103#if 0
104    {
105#include <sys/time.h>
106	struct timeval tv;
107	tv.tv_sec = 1;
108	tv.tv_usec = 0;
109	if (setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
110		perror("setsockopt");
111		goto end;
112	}
113    }
114#endif
115
116	pfkey_sadump((struct sadb_msg *)m_buf);
117
118	if ((len = send(so, m_buf, m_len, 0)) < 0) {
119		perror("send");
120		goto end;
121	}
122
123	if ((len = recv(so, rbuf, sizeof(rbuf), 0)) < 0) {
124		perror("recv");
125		goto end;
126	}
127
128	pfkey_sadump((struct sadb_msg *)rbuf);
129
130end:
131	(void)close(so);
132	return(0);
133}
134
135void
136key_setsadbmsg(type)
137	u_int type;
138{
139	struct sadb_msg m_msg;
140
141	memset(&m_msg, 0, sizeof(m_msg));
142	m_msg.sadb_msg_version = PF_KEY_V2;
143	m_msg.sadb_msg_type = type;
144	m_msg.sadb_msg_errno = 0;
145	m_msg.sadb_msg_satype = SADB_SATYPE_ESP;
146#if 0
147	m_msg.sadb_msg_reserved = 0;
148#endif
149	m_msg.sadb_msg_seq = 0;
150	m_msg.sadb_msg_pid = getpid();
151
152	m_len = sizeof(struct sadb_msg);
153	memcpy(m_buf, &m_msg, m_len);
154
155	switch (type) {
156	case SADB_GETSPI:
157		/*<base, address(SD), SPI range>*/
158		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "10.0.3.4");
159		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "127.0.0.1");
160		key_setspirange();
161		/*<base, SA(*), address(SD)>*/
162		break;
163
164	case SADB_ADD:
165		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
166		   key(AE), (identity(SD),) (sensitivity)> */
167		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
168	case SADB_UPDATE:
169		key_setsadbsa();
170		key_setsadblft(SADB_EXT_LIFETIME_HARD, 10);
171		key_setsadblft(SADB_EXT_LIFETIME_SOFT, 5);
172		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
173		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
174		/* XXX key_setsadbkey(SADB_EXT_KEY_AUTH, "abcde"); */
175		key_setsadbkey(SADB_EXT_KEY_AUTH, "1234567812345678");
176		key_setsadbkey(SADB_EXT_KEY_ENCRYPT, "12345678");
177		key_setsadbid(SADB_EXT_IDENTITY_SRC, "hoge1234@hoge.com");
178		key_setsadbid(SADB_EXT_IDENTITY_DST, "hage5678@hage.net");
179		key_setsadbsens();
180		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
181		  (identity(SD),) (sensitivity)> */
182		break;
183
184	case SADB_DELETE:
185		/* <base, SA(*), address(SDP)> */
186		key_setsadbsa();
187		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
188		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
189		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
190		/* <base, SA(*), address(SDP)> */
191		break;
192
193	case SADB_GET:
194		/* <base, SA(*), address(SDP)> */
195		key_setsadbsa();
196		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
197		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
198		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
199		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
200		   key(AE), (identity(SD),) (sensitivity)> */
201		break;
202
203	case SADB_ACQUIRE:
204		/* <base, address(SD), (address(P),) (identity(SD),)
205		   (sensitivity,) proposal> */
206		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
207		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
208		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
209		key_setsadbid(SADB_EXT_IDENTITY_SRC, "hoge1234@hoge.com");
210		key_setsadbid(SADB_EXT_IDENTITY_DST, "hage5678@hage.net");
211		key_setsadbsens();
212		key_setsadbprop();
213		/* <base, address(SD), (address(P),) (identity(SD),)
214		   (sensitivity,) proposal> */
215		break;
216
217	case SADB_REGISTER:
218		/* <base> */
219		/* <base, supported> */
220		break;
221
222	case SADB_EXPIRE:
223	case SADB_FLUSH:
224		break;
225
226	case SADB_DUMP:
227		break;
228
229	case SADB_X_PROMISC:
230		/* <base> */
231		/* <base, base(, others)> */
232		break;
233
234	case SADB_X_PCHANGE:
235		break;
236
237	/* for SPD management */
238	case SADB_X_SPDFLUSH:
239	case SADB_X_SPDDUMP:
240		break;
241
242	case SADB_X_SPDADD:
243#if 0
244	    {
245		struct sadb_x_policy m_policy;
246
247		m_policy.sadb_x_policy_len = PFKEY_UNIT64(sizeof(m_policy));
248		m_policy.sadb_x_policy_exttype = SADB_X_EXT_POLICY;
249		m_policy.sadb_x_policy_type = SADB_X_PL_IPSEC;
250		m_policy.sadb_x_policy_esp_trans = 1;
251		m_policy.sadb_x_policy_ah_trans = 2;
252		m_policy.sadb_x_policy_esp_network = 3;
253		m_policy.sadb_x_policy_ah_network = 4;
254		m_policy.sadb_x_policy_reserved = 0;
255
256		memcpy(m_buf + m_len, &m_policy, sizeof(struct sadb_x_policy));
257		m_len += sizeof(struct sadb_x_policy);
258	    }
259#endif
260
261	case SADB_X_SPDDELETE:
262		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
263		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
264		break;
265	}
266
267	((struct sadb_msg *)m_buf)->sadb_msg_len = PFKEY_UNIT64(m_len);
268
269	return;
270}
271
272void
273key_setsadbsens()
274{
275	struct sadb_sens m_sens;
276	u_char buf[64];
277	u_int s, i, slen, ilen, len;
278
279	/* make sens & integ */
280	s = htonl(0x01234567);
281	i = htonl(0x89abcdef);
282	slen = sizeof(s);
283	ilen = sizeof(i);
284	memcpy(buf, &s, slen);
285	memcpy(buf + slen, &i, ilen);
286
287	len = sizeof(m_sens) + PFKEY_ALIGN8(slen) + PFKEY_ALIGN8(ilen);
288	m_sens.sadb_sens_len = PFKEY_UNIT64(len);
289	m_sens.sadb_sens_exttype = SADB_EXT_SENSITIVITY;
290	m_sens.sadb_sens_dpd = 1;
291	m_sens.sadb_sens_sens_level = 2;
292	m_sens.sadb_sens_sens_len = PFKEY_ALIGN8(slen);
293	m_sens.sadb_sens_integ_level = 3;
294	m_sens.sadb_sens_integ_len = PFKEY_ALIGN8(ilen);
295	m_sens.sadb_sens_reserved = 0;
296
297	key_setsadbextbuf(m_buf, m_len,
298			(caddr_t)&m_sens, sizeof(struct sadb_sens),
299			buf, slen + ilen);
300	m_len += len;
301
302	return;
303}
304
305void
306key_setsadbprop()
307{
308	struct sadb_prop m_prop;
309	struct sadb_comb *m_comb;
310	u_char buf[256];
311#if (defined(SADB_X_EALG_AESCBC) || defined(SADB_X_EALG_CAMELLIACBC)) && defined(SADB_X_AALG_SHA2_256)
312	u_int len = sizeof(m_prop) + sizeof(m_comb) * 3;
313#else
314	u_int len = sizeof(m_prop) + sizeof(m_comb) * 2;
315#endif
316
317	/* make prop & comb */
318	m_prop.sadb_prop_len = PFKEY_UNIT64(len);
319	m_prop.sadb_prop_exttype = SADB_EXT_PROPOSAL;
320	m_prop.sadb_prop_replay = 0;
321	m_prop.sadb_prop_reserved[0] = 0;
322	m_prop.sadb_prop_reserved[1] = 0;
323	m_prop.sadb_prop_reserved[2] = 0;
324
325	/* the 1st is ESP DES-CBC HMAC-MD5 */
326	m_comb = (struct sadb_comb *)buf;
327	m_comb->sadb_comb_auth = SADB_AALG_MD5HMAC;
328	m_comb->sadb_comb_encrypt = SADB_EALG_DESCBC;
329	m_comb->sadb_comb_flags = 0;
330	m_comb->sadb_comb_auth_minbits = 8;
331	m_comb->sadb_comb_auth_maxbits = 96;
332	m_comb->sadb_comb_encrypt_minbits = 64;
333	m_comb->sadb_comb_encrypt_maxbits = 64;
334	m_comb->sadb_comb_reserved = 0;
335	m_comb->sadb_comb_soft_allocations = 0;
336	m_comb->sadb_comb_hard_allocations = 0;
337	m_comb->sadb_comb_soft_bytes = 0;
338	m_comb->sadb_comb_hard_bytes = 0;
339	m_comb->sadb_comb_soft_addtime = 0;
340	m_comb->sadb_comb_hard_addtime = 0;
341	m_comb->sadb_comb_soft_usetime = 0;
342	m_comb->sadb_comb_hard_usetime = 0;
343
344	/* the 2st is ESP 3DES-CBC and AH HMAC-SHA1 */
345	m_comb = (struct sadb_comb *)(buf + sizeof(*m_comb));
346	m_comb->sadb_comb_auth = SADB_AALG_SHA1HMAC;
347	m_comb->sadb_comb_encrypt = SADB_EALG_3DESCBC;
348	m_comb->sadb_comb_flags = 0;
349	m_comb->sadb_comb_auth_minbits = 8;
350	m_comb->sadb_comb_auth_maxbits = 96;
351	m_comb->sadb_comb_encrypt_minbits = 64;
352	m_comb->sadb_comb_encrypt_maxbits = 64;
353	m_comb->sadb_comb_reserved = 0;
354	m_comb->sadb_comb_soft_allocations = 0;
355	m_comb->sadb_comb_hard_allocations = 0;
356	m_comb->sadb_comb_soft_bytes = 0;
357	m_comb->sadb_comb_hard_bytes = 0;
358	m_comb->sadb_comb_soft_addtime = 0;
359	m_comb->sadb_comb_hard_addtime = 0;
360	m_comb->sadb_comb_soft_usetime = 0;
361	m_comb->sadb_comb_hard_usetime = 0;
362
363	key_setsadbextbuf(m_buf, m_len,
364			(caddr_t)&m_prop, sizeof(struct sadb_prop),
365			buf, sizeof(*m_comb) * 2);
366	m_len += len;
367
368 #if defined(SADB_X_EALG_AESCBC) && defined(SADB_X_AALG_SHA2_256)
369 	/* the 3rd is ESP AES-CBC and AH HMAC-SHA256 */
370 	m_comb = (struct sadb_comb *)(buf + sizeof(*m_comb));
371 	m_comb->sadb_comb_auth = SADB_X_AALG_SHA2_256;
372 	m_comb->sadb_comb_encrypt = SADB_X_EALG_AESCBC;
373 	m_comb->sadb_comb_flags = 0;
374 	m_comb->sadb_comb_auth_minbits = 8;
375 	m_comb->sadb_comb_auth_maxbits = 96;
376 	m_comb->sadb_comb_encrypt_minbits = 128;
377 	m_comb->sadb_comb_encrypt_maxbits = 128;
378 	m_comb->sadb_comb_reserved = 0;
379 	m_comb->sadb_comb_soft_allocations = 0;
380 	m_comb->sadb_comb_hard_allocations = 0;
381 	m_comb->sadb_comb_soft_bytes = 0;
382 	m_comb->sadb_comb_hard_bytes = 0;
383 	m_comb->sadb_comb_soft_addtime = 0;
384 	m_comb->sadb_comb_hard_addtime = 0;
385 	m_comb->sadb_comb_soft_usetime = 0;
386 	m_comb->sadb_comb_hard_usetime = 0;
387
388 	key_setsadbextbuf(m_buf, m_len,
389 			(caddr_t)&m_prop, sizeof(struct sadb_prop),
390 			buf, sizeof(*m_comb) * 3);
391 	m_len += len;
392 #elif defined(SADB_X_EALG_CAMELLIACBC) && defined(SADB_X_AALG_SHA2_256)
393 	/* the 3rd is ESP CAMELLIA-CBC and AH HMAC-SHA256 */
394 	m_comb = (struct sadb_comb *)(buf + sizeof(*m_comb));
395 	m_comb->sadb_comb_auth = SADB_X_AALG_SHA2_256;
396 	m_comb->sadb_comb_encrypt = SADB_X_EALG_CAMELLIACBC;
397 	m_comb->sadb_comb_flags = 0;
398 	m_comb->sadb_comb_auth_minbits = 8;
399 	m_comb->sadb_comb_auth_maxbits = 96;
400 	m_comb->sadb_comb_encrypt_minbits = 128;
401 	m_comb->sadb_comb_encrypt_maxbits = 128;
402 	m_comb->sadb_comb_reserved = 0;
403 	m_comb->sadb_comb_soft_allocations = 0;
404 	m_comb->sadb_comb_hard_allocations = 0;
405 	m_comb->sadb_comb_soft_bytes = 0;
406 	m_comb->sadb_comb_hard_bytes = 0;
407 	m_comb->sadb_comb_soft_addtime = 0;
408 	m_comb->sadb_comb_hard_addtime = 0;
409 	m_comb->sadb_comb_soft_usetime = 0;
410 	m_comb->sadb_comb_hard_usetime = 0;
411
412 	key_setsadbextbuf(m_buf, m_len,
413 			(caddr_t)&m_prop, sizeof(struct sadb_prop),
414 			buf, sizeof(*m_comb) * 3);
415 	m_len += len;
416#else
417	key_setsadbextbuf(m_buf, m_len,
418			(caddr_t)&m_prop, sizeof(struct sadb_prop),
419			buf, sizeof(*m_comb) * 2);
420 	m_len += len;
421#endif
422	return;
423}
424
425void
426key_setsadbid(ext, str)
427	u_int ext;
428	caddr_t str;
429{
430	struct sadb_ident m_id;
431	u_int idlen = strlen(str), len;
432
433	len = sizeof(m_id) + PFKEY_ALIGN8(idlen);
434	m_id.sadb_ident_len = PFKEY_UNIT64(len);
435	m_id.sadb_ident_exttype = ext;
436	m_id.sadb_ident_type = SADB_IDENTTYPE_USERFQDN;
437	m_id.sadb_ident_reserved = 0;
438	m_id.sadb_ident_id = getpid();
439
440	key_setsadbextbuf(m_buf, m_len,
441			(caddr_t)&m_id, sizeof(struct sadb_ident),
442			str, idlen);
443	m_len += len;
444
445	return;
446}
447
448void
449key_setsadblft(ext, time)
450	u_int ext, time;
451{
452	struct sadb_lifetime m_lft;
453
454	m_lft.sadb_lifetime_len = PFKEY_UNIT64(sizeof(m_lft));
455	m_lft.sadb_lifetime_exttype = ext;
456	m_lft.sadb_lifetime_allocations = 0x2;
457	m_lft.sadb_lifetime_bytes = 0x1000;
458	m_lft.sadb_lifetime_addtime = time;
459	m_lft.sadb_lifetime_usetime = 0x0020;
460
461	memcpy(m_buf + m_len, &m_lft, sizeof(struct sadb_lifetime));
462	m_len += sizeof(struct sadb_lifetime);
463
464	return;
465}
466
467void
468key_setspirange()
469{
470	struct sadb_spirange m_spi;
471
472	m_spi.sadb_spirange_len = PFKEY_UNIT64(sizeof(m_spi));
473	m_spi.sadb_spirange_exttype = SADB_EXT_SPIRANGE;
474	m_spi.sadb_spirange_min = 0x00001000;
475	m_spi.sadb_spirange_max = 0x00002000;
476	m_spi.sadb_spirange_reserved = 0;
477
478	memcpy(m_buf + m_len, &m_spi, sizeof(struct sadb_spirange));
479	m_len += sizeof(struct sadb_spirange);
480
481	return;
482}
483
484void
485key_setsadbkey(ext, str)
486	u_int ext;
487	caddr_t str;
488{
489	struct sadb_key m_key;
490	u_int keylen = strlen(str);
491	u_int len;
492
493	len = sizeof(struct sadb_key) + PFKEY_ALIGN8(keylen);
494	m_key.sadb_key_len = PFKEY_UNIT64(len);
495	m_key.sadb_key_exttype = ext;
496	m_key.sadb_key_bits = keylen * 8;
497	m_key.sadb_key_reserved = 0;
498
499	key_setsadbextbuf(m_buf, m_len,
500			(caddr_t)&m_key, sizeof(struct sadb_key),
501			str, keylen);
502	m_len += len;
503
504	return;
505}
506
507void
508key_setsadbsa()
509{
510	struct sadb_sa m_sa;
511
512	m_sa.sadb_sa_len = PFKEY_UNIT64(sizeof(struct sadb_sa));
513	m_sa.sadb_sa_exttype = SADB_EXT_SA;
514	m_sa.sadb_sa_spi = htonl(0x12345678);
515	m_sa.sadb_sa_replay = 4;
516	m_sa.sadb_sa_state = 0;
517	m_sa.sadb_sa_auth = SADB_AALG_MD5HMAC;
518	m_sa.sadb_sa_encrypt = SADB_EALG_DESCBC;
519	m_sa.sadb_sa_flags = 0;
520
521	memcpy(m_buf + m_len, &m_sa, sizeof(struct sadb_sa));
522	m_len += sizeof(struct sadb_sa);
523
524	return;
525}
526
527void
528key_setsadbaddr(ext, af, str)
529	u_int ext, af;
530	caddr_t str;
531{
532	struct sadb_address m_addr;
533	u_int len;
534	struct addrinfo hints, *res;
535	const char *serv;
536	int plen;
537
538	switch (af) {
539	case AF_INET:
540		plen = sizeof(struct in_addr) << 3;
541		break;
542	case AF_INET6:
543		plen = sizeof(struct in6_addr) << 3;
544		break;
545	default:
546		/* XXX bark */
547		exit(1);
548	}
549
550	/* make sockaddr buffer */
551	memset(&hints, 0, sizeof(hints));
552	hints.ai_family = af;
553	hints.ai_socktype = SOCK_DGRAM;	/*dummy*/
554	hints.ai_flags = AI_NUMERICHOST;
555	serv = (ext == SADB_EXT_ADDRESS_PROXY ? "0" : "4660");	/*0x1234*/
556	if (getaddrinfo(str, serv, &hints, &res) != 0 || res->ai_next) {
557		/* XXX bark */
558		exit(1);
559	}
560
561	len = sizeof(struct sadb_address) + PFKEY_ALIGN8(res->ai_addrlen);
562	m_addr.sadb_address_len = PFKEY_UNIT64(len);
563	m_addr.sadb_address_exttype = ext;
564	m_addr.sadb_address_proto =
565		(ext == SADB_EXT_ADDRESS_PROXY ? 0 : IPPROTO_TCP);
566	m_addr.sadb_address_prefixlen = plen;
567	m_addr.sadb_address_reserved = 0;
568
569	key_setsadbextbuf(m_buf, m_len,
570			(caddr_t)&m_addr, sizeof(struct sadb_address),
571			(caddr_t)res->ai_addr, res->ai_addrlen);
572	m_len += len;
573
574	freeaddrinfo(res);
575
576	return;
577}
578
579void
580key_setsadbextbuf(dst, off, ebuf, elen, vbuf, vlen)
581	caddr_t dst, ebuf, vbuf;
582	int off, elen, vlen;
583{
584	memset(dst + off, 0, elen + vlen);
585	memcpy(dst + off, (caddr_t)ebuf, elen);
586	memcpy(dst + off + elen, vbuf, vlen);
587
588	return;
589}
590
591