Annotation of embedaddon/ipsec-tools/src/setkey/test-pfkey.c, revision 1.1.1.1
1.1 misho 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:
53: u_char m_buf[BUFSIZ];
54: u_int m_len;
55: char *pname;
56:
57: void Usage __P((void));
58: int sendkeymsg __P((void));
59: void key_setsadbmsg __P((u_int));
60: void key_setsadbsens __P((void));
61: void key_setsadbprop __P((void));
62: void key_setsadbid __P((u_int, caddr_t));
63: void key_setsadblft __P((u_int, u_int));
64: void key_setspirange __P((void));
65: void key_setsadbkey __P((u_int, caddr_t));
66: void key_setsadbsa __P((void));
67: void key_setsadbaddr __P((u_int, u_int, caddr_t));
68: void key_setsadbextbuf __P((caddr_t, int, caddr_t, int, caddr_t, int));
69:
70: void
71: Usage()
72: {
73: printf("Usage:\t%s number\n", pname);
74: exit(0);
75: }
76:
77: int
78: main(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: /* %%% */
93: int
94: sendkeymsg()
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:
130: end:
131: (void)close(so);
132: return(0);
133: }
134:
135: void
136: key_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:
272: void
273: key_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:
305: void
306: key_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:
425: void
426: key_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:
448: void
449: key_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:
467: void
468: key_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:
484: void
485: key_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:
507: void
508: key_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:
527: void
528: key_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:
579: void
580: key_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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>