Skip to content

Commit

Permalink
added pfkey_send_spdadd2(). It can be set lifetime of its policy.
Browse files Browse the repository at this point in the history
  • Loading branch information
sakane committed Dec 27, 2000
1 parent 79a21f1 commit 150bf3e
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 10 deletions.
8 changes: 7 additions & 1 deletion kame/kame/libipsec/libpfkey.h
@@ -1,4 +1,4 @@
/* $KAME: libpfkey.h,v 1.3 2000/08/31 07:48:10 sakane Exp $ */
/* $KAME: libpfkey.h,v 1.4 2000/12/27 11:38:10 sakane Exp $ */

/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
Expand Down Expand Up @@ -60,8 +60,14 @@ int pfkey_send_dump __P((int, u_int));
int pfkey_send_promisc_toggle __P((int, int));
int pfkey_send_spdadd __P((int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, caddr_t, int, u_int32_t));
int pfkey_send_spdadd2 __P((int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, u_int64_t, u_int64_t,
caddr_t, int, u_int32_t));
int pfkey_send_spdupdate __P((int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, caddr_t, int, u_int32_t));
int pfkey_send_spdupdate2 __P((int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, u_int64_t, u_int64_t,
caddr_t, int, u_int32_t));
int pfkey_send_spddelete __P((int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, caddr_t, int, u_int32_t));
int pfkey_send_spddelete2 __P((int, u_int32_t));
Expand Down
76 changes: 73 additions & 3 deletions kame/kame/libipsec/pfkey.c
@@ -1,4 +1,4 @@
/* $KAME: pfkey.c,v 1.37 2000/12/05 09:05:08 sakane Exp $ */
/* $KAME: pfkey.c,v 1.38 2000/12/27 11:38:10 sakane Exp $ */

/*
* Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
Expand Down Expand Up @@ -59,7 +59,8 @@ static int pfkey_send_x2 __P((int, u_int, u_int, u_int,
struct sockaddr *, struct sockaddr *, u_int32_t));
static int pfkey_send_x3 __P((int, u_int, u_int));
static int pfkey_send_x4 __P((int, u_int, struct sockaddr *, u_int,
struct sockaddr *, u_int, u_int, char *, int, u_int32_t));
struct sockaddr *, u_int, u_int, u_int64_t, u_int64_t,
char *, int, u_int32_t));
static int pfkey_send_x5 __P((int, u_int, u_int32_t));

static caddr_t pfkey_setsadbmsg __P((caddr_t, caddr_t, u_int, u_int,
Expand Down Expand Up @@ -785,6 +786,35 @@ pfkey_send_spdadd(so, src, prefs, dst, prefd, proto, policy, policylen, seq)

if ((len = pfkey_send_x4(so, SADB_X_SPDADD,
src, prefs, dst, prefd, proto,
0, 0,
policy, policylen, seq)) < 0)
return -1;

return len;
}

/*
* sending SADB_X_SPDADD message to the kernel.
* OUT:
* positive: success and return length sent.
* -1 : error occured, and set errno.
*/
int
pfkey_send_spdadd2(so, src, prefs, dst, prefd, proto, ltime, vtime,
policy, policylen, seq)
int so;
struct sockaddr *src, *dst;
u_int prefs, prefd, proto;
u_int64_t ltime, vtime;
caddr_t policy;
int policylen;
u_int32_t seq;
{
int len;

if ((len = pfkey_send_x4(so, SADB_X_SPDADD,
src, prefs, dst, prefd, proto,
ltime, vtime,
policy, policylen, seq)) < 0)
return -1;

Expand All @@ -810,6 +840,35 @@ pfkey_send_spdupdate(so, src, prefs, dst, prefd, proto, policy, policylen, seq)

if ((len = pfkey_send_x4(so, SADB_X_SPDUPDATE,
src, prefs, dst, prefd, proto,
0, 0,
policy, policylen, seq)) < 0)
return -1;

return len;
}

/*
* sending SADB_X_SPDUPDATE message to the kernel.
* OUT:
* positive: success and return length sent.
* -1 : error occured, and set errno.
*/
int
pfkey_send_spdupdate2(so, src, prefs, dst, prefd, proto, ltime, vtime,
policy, policylen, seq)
int so;
struct sockaddr *src, *dst;
u_int prefs, prefd, proto;
u_int64_t ltime, vtime;
caddr_t policy;
int policylen;
u_int32_t seq;
{
int len;

if ((len = pfkey_send_x4(so, SADB_X_SPDUPDATE,
src, prefs, dst, prefd, proto,
ltime, vtime,
policy, policylen, seq)) < 0)
return -1;

Expand Down Expand Up @@ -840,6 +899,7 @@ pfkey_send_spddelete(so, src, prefs, dst, prefd, proto, policy, policylen, seq)

if ((len = pfkey_send_x4(so, SADB_X_SPDDELETE,
src, prefs, dst, prefd, proto,
0, 0,
policy, policylen, seq)) < 0)
return -1;

Expand Down Expand Up @@ -908,6 +968,7 @@ pfkey_send_spdsetidx(so, src, prefs, dst, prefd, proto, policy, policylen, seq)

if ((len = pfkey_send_x4(so, SADB_X_SPDSETIDX,
src, prefs, dst, prefd, proto,
0, 0,
policy, policylen, seq)) < 0)
return -1;

Expand Down Expand Up @@ -1264,10 +1325,12 @@ pfkey_send_x3(so, type, satype)

/* sending SADB_X_SPDADD message to the kernel */
static int
pfkey_send_x4(so, type, src, prefs, dst, prefd, proto, policy, policylen, seq)
pfkey_send_x4(so, type, src, prefs, dst, prefd, proto,
ltime, vtime, policy, policylen, seq)
int so;
struct sockaddr *src, *dst;
u_int type, prefs, prefd, proto;
u_int64_t ltime, vtime;
char *policy;
int policylen;
u_int32_t seq;
Expand Down Expand Up @@ -1310,6 +1373,7 @@ pfkey_send_x4(so, type, src, prefs, dst, prefd, proto, policy, policylen, seq)
+ PFKEY_ALIGN8(src->sa_len)
+ sizeof(struct sadb_address)
+ PFKEY_ALIGN8(src->sa_len)
+ sizeof(struct sadb_lifetime)
+ policylen;

if ((newmsg = CALLOC(len, struct sadb_msg *)) == NULL) {
Expand All @@ -1330,6 +1394,12 @@ pfkey_send_x4(so, type, src, prefs, dst, prefd, proto, policy, policylen, seq)
return -1;
}
p = pfkey_setsadbaddr(p, ep, SADB_EXT_ADDRESS_DST, dst, prefd, proto);
if (!p) {
free(newmsg);
return -1;
}
p = pfkey_setsadblifetime(p, ep, SADB_EXT_LIFETIME_HARD,
0, 0, ltime, vtime);
if (!p || p + policylen != ep) {
free(newmsg);
return -1;
Expand Down
11 changes: 10 additions & 1 deletion kame/kame/libipsec/pfkey_dump.c
@@ -1,4 +1,4 @@
/* $KAME: pfkey_dump.c,v 1.24 2000/10/16 08:05:44 itojun Exp $ */
/* $KAME: pfkey_dump.c,v 1.25 2000/12/27 11:38:10 sakane Exp $ */

/*
* Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
Expand Down Expand Up @@ -358,6 +358,7 @@ pfkey_spdump(m)
caddr_t mhp[SADB_EXT_MAX + 1];
struct sadb_address *m_saddr, *m_daddr;
struct sadb_x_policy *m_xpl;
struct sadb_lifetime *m_lft = NULL;
struct sockaddr *sa;
u_int16_t port;

Expand All @@ -374,6 +375,7 @@ pfkey_spdump(m)
m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
m_lft = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];

/* source address */
if (m_saddr == NULL) {
Expand Down Expand Up @@ -446,6 +448,13 @@ pfkey_spdump(m)
free(d_xpl);
}

/* lifetime */
if (m_lft) {
printf("\tlifetime:%lu validtime:%lu\n",
(u_long)m_lft->sadb_lifetime_addtime,
(u_long)m_lft->sadb_lifetime_usetime);
}

printf("\tspid=%ld seq=%ld pid=%ld\n",
(u_long)m_xpl->sadb_x_policy_id,
(u_long)m->sadb_msg_seq,
Expand Down
27 changes: 22 additions & 5 deletions kame/kame/libipsec/test-policy.c
@@ -1,4 +1,4 @@
/* $KAME: test-policy.c,v 1.13 2000/05/07 05:25:03 itojun Exp $ */
/* $KAME: test-policy.c,v 1.14 2000/12/27 11:38:11 sakane Exp $ */

/*
* Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
Expand Down Expand Up @@ -45,6 +45,8 @@
#include <errno.h>
#include <err.h>

#include "libpfkey.h"

struct req_t {
int result; /* expected result; 0:ok 1:ng */
char *str;
Expand Down Expand Up @@ -110,9 +112,9 @@ test1()

result = test1sub1(&reqs[i]);
if (result == 0 && reqs[i].result == 1) {
errx(1, "ERROR: expecting failure.\n");
warnx("ERROR: expecting failure.\n");
} else if (result == 1 && reqs[i].result == 0) {
errx(1, "ERROR: expecting success.\n");
warnx("ERROR: expecting success.\n");
}
}

Expand Down Expand Up @@ -244,7 +246,8 @@ test2()
errx(1, "ERROR: %s\n", ipsec_strerror());
m = pfkey_recv(so);
free(m);


#if 0
printf("spdsetidx()\n");
if (pfkey_send_spdsetidx(so, (struct sockaddr *)addr, 128,
(struct sockaddr *)addr, 128,
Expand All @@ -261,6 +264,8 @@ test2()
m = pfkey_recv(so);
free(m);

sleep(4);

printf("spddelete()\n");
if (pfkey_send_spddelete(so, (struct sockaddr *)addr, 128,
(struct sockaddr *)addr, 128,
Expand All @@ -282,19 +287,31 @@ test2()
m = pfkey_recv(so);
free(m);

sleep(4);

printf("spddelete2()\n");
if (pfkey_send_spddelete2(so, spid) < 0)
errx(1, "ERROR: %s\n", ipsec_strerror());
m = pfkey_recv(so);
free(m);
#endif

printf("spdadd() with lifetime's 10(s)\n");
if (pfkey_send_spdadd2(so, (struct sockaddr *)addr, 128,
(struct sockaddr *)addr, 128,
255, 0, 10, sp2, splen2, 0) < 0)
errx(1, "ERROR: %s\n", ipsec_strerror());
spid = test2sub(so);

#if 0
/* expecting failure */
printf("spdupdate()\n");
if (pfkey_send_spdupdate(so, (struct sockaddr *)addr, 128,
(struct sockaddr *)addr, 128,
255, sp2, splen2, 0) == 0) {
errx(1, "ERROR: expecting failure.\n");
warnx("ERROR: expecting failure.\n");
}
#endif

return 0;
}
Expand Down

0 comments on commit 150bf3e

Please sign in to comment.