Module Name: src
Committed By: tteras
Date: Fri Jul 3 06:41:47 UTC 2009
Modified Files:
src/crypto/dist/ipsec-tools/src/racoon: admin.c grabmyaddr.c handler.c
handler.h isakmp.c isakmp_cfg.c isakmp_inf.c isakmp_quick.c
nattraversal.c pfkey.c policy.c remoteconf.c remoteconf.h
sockmisc.c sockmisc.h throttle.c
Log Message:
Get rid of the evil CMPSADDR macro. Trac #295.
To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/crypto/dist/ipsec-tools/src/racoon/admin.c
cvs rdiff -u -r1.22 -r1.23 \
src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c
cvs rdiff -u -r1.28 -r1.29 src/crypto/dist/ipsec-tools/src/racoon/handler.c
cvs rdiff -u -r1.20 -r1.21 src/crypto/dist/ipsec-tools/src/racoon/handler.h
cvs rdiff -u -r1.57 -r1.58 src/crypto/dist/ipsec-tools/src/racoon/isakmp.c
cvs rdiff -u -r1.21 -r1.22 \
src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c
cvs rdiff -u -r1.40 -r1.41 \
src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c
cvs rdiff -u -r1.25 -r1.26 \
src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c
cvs rdiff -u -r1.11 -r1.12 \
src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c
cvs rdiff -u -r1.47 -r1.48 src/crypto/dist/ipsec-tools/src/racoon/pfkey.c
cvs rdiff -u -r1.10 -r1.11 src/crypto/dist/ipsec-tools/src/racoon/policy.c \
src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h \
src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h
cvs rdiff -u -r1.14 -r1.15 \
src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c
cvs rdiff -u -r1.15 -r1.16 src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c
cvs rdiff -u -r1.5 -r1.6 src/crypto/dist/ipsec-tools/src/racoon/throttle.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/crypto/dist/ipsec-tools/src/racoon/admin.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/admin.c:1.30 src/crypto/dist/ipsec-tools/src/racoon/admin.c:1.31
--- src/crypto/dist/ipsec-tools/src/racoon/admin.c:1.30 Mon Apr 20 13:22:00 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/admin.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: admin.c,v 1.30 2009/04/20 13:22:00 tteras Exp $ */
+/* $NetBSD: admin.c,v 1.31 2009/07/03 06:41:46 tteras Exp $ */
/* Id: admin.c,v 1.25 2006/04/06 14:31:04 manubsd Exp */
@@ -167,6 +167,14 @@
return error;
}
+static int admin_ph1_delete_sa(struct ph1handle *iph1, void *arg)
+{
+ if (iph1->status >= PHASE1ST_ESTABLISHED)
+ isakmp_info_send_d1(iph1);
+ purge_remote(iph1);
+ return 0;
+}
+
/*
* main child's process.
*/
@@ -257,7 +265,7 @@
break;
}
- iph1 = getph1byaddrwop(src, dst);
+ iph1 = getph1byaddr(src, dst, 0);
if (iph1 == NULL) {
l_ac_errno = ENOENT;
break;
@@ -292,30 +300,25 @@
case ADMIN_DELETE_SA: {
struct ph1handle *iph1;
- struct sockaddr *dst;
- struct sockaddr *src;
+ struct ph1selector sel;
char *loc, *rem;
- src = (struct sockaddr *)
+ memset(&sel, 0, sizeof(sel));
+ sel.local = (struct sockaddr *)
&((struct admin_com_indexes *)
((caddr_t)com + sizeof(*com)))->src;
- dst = (struct sockaddr *)
+ sel.remote = (struct sockaddr *)
&((struct admin_com_indexes *)
((caddr_t)com + sizeof(*com)))->dst;
- loc = racoon_strdup(saddrwop2str(src));
- rem = racoon_strdup(saddrwop2str(dst));
+ loc = racoon_strdup(saddr2str(sel.local));
+ rem = racoon_strdup(saddr2str(sel.remote));
STRDUP_FATAL(loc);
STRDUP_FATAL(rem);
- if ((iph1 = getph1byaddrwop(src, dst)) == NULL) {
- plog(LLV_ERROR, LOCATION, NULL,
- "phase 1 for %s -> %s not found\n", loc, rem);
- } else {
- if (iph1->status >= PHASE1ST_ESTABLISHED)
- isakmp_info_send_d1(iph1);
- purge_remote(iph1);
- }
+ plog(LLV_INFO, LOCATION, NULL,
+ "admin delete-sa %s %s\n", loc, rem);
+ enumph1(&sel, admin_ph1_delete_sa, NULL);
racoon_free(loc);
racoon_free(rem);
@@ -360,7 +363,7 @@
plog(LLV_INFO, LOCATION, NULL,
"Flushing all SAs for peer %s\n", rem);
- while ((iph1 = getph1bydstaddrwop(dst)) != NULL) {
+ while ((iph1 = getph1bydstaddr(dst)) != NULL) {
loc = racoon_strdup(saddrwop2str(iph1->local));
STRDUP_FATAL(loc);
@@ -429,7 +432,7 @@
l_ac_errno = -1;
/* connected already? */
- ph1 = getph1byaddrwop(src, dst);
+ ph1 = getph1byaddr(src, dst, 0);
if (ph1 != NULL) {
event_list = &ph1->evt_listeners;
if (ph1->status == PHASE1ST_ESTABLISHED)
Index: src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c:1.22 src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c:1.23
--- src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c:1.22 Tue Apr 21 18:38:31 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: grabmyaddr.c,v 1.22 2009/04/21 18:38:31 tteras Exp $ */
+/* $NetBSD: grabmyaddr.c,v 1.23 2009/07/03 06:41:46 tteras Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
* Copyright (C) 2008 Timo Teras <[email protected]>.
@@ -100,7 +100,7 @@
return TRUE;
LIST_FOREACH(cfg, &configured, chain) {
- if (cmpsaddrstrict(addr, (struct sockaddr *) &cfg->addr) == 0)
+ if (cmpsaddr(addr, (struct sockaddr *) &cfg->addr) == 0)
return TRUE;
}
@@ -116,7 +116,7 @@
/* Already open? */
LIST_FOREACH(my, &opened, chain) {
- if (cmpsaddrstrict(addr, (struct sockaddr *) &my->addr) == 0)
+ if (cmpsaddr(addr, (struct sockaddr *) &my->addr) == 0)
return TRUE;
}
@@ -156,7 +156,7 @@
LIST_FOREACH(cfg, &configured, chain) {
if (addr != NULL &&
- cmpsaddrwop(addr, (struct sockaddr *) &cfg->addr) != 0)
+ cmpsaddr(addr, (struct sockaddr *) &cfg->addr) != 0)
continue;
if (!myaddr_open((struct sockaddr *) &cfg->addr, cfg->udp_encap))
return FALSE;
@@ -187,8 +187,8 @@
for (my = LIST_FIRST(&opened); my; my = next) {
next = LIST_NEXT(my, chain);
- if (!cmpsaddrwop((struct sockaddr *) &addr,
- (struct sockaddr *) &my->addr))
+ if (!cmpsaddr((struct sockaddr *) &addr,
+ (struct sockaddr *) &my->addr))
myaddr_delete(my);
}
}
@@ -261,7 +261,7 @@
struct myaddr *my;
LIST_FOREACH(my, &opened, chain) {
- if (cmpsaddrstrict((struct sockaddr *) &my->addr, addr) == 0)
+ if (cmpsaddr((struct sockaddr *) &my->addr, addr) == 0)
return my->fd;
}
@@ -273,19 +273,13 @@
struct sockaddr *addr;
{
struct myaddr *my;
- int bestmatch_port = -1;
LIST_FOREACH(my, &opened, chain) {
- if (cmpsaddrstrict((struct sockaddr *) &my->addr, addr) == 0)
+ if (cmpsaddr((struct sockaddr *) &my->addr, addr) == 0)
return extract_port((struct sockaddr *) &my->addr);
- if (cmpsaddrwop((struct sockaddr *) &my->addr, addr) != 0)
- continue;
- if (bestmatch_port == -1 ||
- extract_port((struct sockaddr *) &my->addr) == PORT_ISAKMP)
- bestmatch_port = extract_port((struct sockaddr *) &my->addr);
}
- return bestmatch_port;
+ return PORT_ISAKMP;
}
void
Index: src/crypto/dist/ipsec-tools/src/racoon/handler.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/handler.c:1.28 src/crypto/dist/ipsec-tools/src/racoon/handler.c:1.29
--- src/crypto/dist/ipsec-tools/src/racoon/handler.c:1.28 Tue Apr 28 13:54:07 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/handler.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: handler.c,v 1.28 2009/04/28 13:54:07 tteras Exp $ */
+/* $NetBSD: handler.c,v 1.29 2009/07/03 06:41:46 tteras Exp $ */
/* Id: handler.c,v 1.28 2006/05/26 12:17:29 manubsd Exp */
@@ -120,11 +120,11 @@
LIST_FOREACH(p, &ph1tree, chain) {
if (sel != NULL) {
if (sel->local != NULL &&
- CMPSADDR(sel->local, p->local) != 0)
+ cmpsaddr(sel->local, p->local) != 0)
continue;
if (sel->remote != NULL &&
- CMPSADDR(sel->remote, p->remote) != 0)
+ cmpsaddr(sel->remote, p->remote) != 0)
continue;
}
@@ -201,17 +201,12 @@
"status %d, skipping\n", p->status);
continue;
}
- if (flags & GETPH1_F_WITHOUT_PORTS) {
- if (local != NULL && cmpsaddrwop(local, p->local) != 0)
- continue;
- if (remote != NULL && cmpsaddrwop(remote, p->remote) != 0)
- continue;
- } else {
- if (local != NULL && CMPSADDR(local, p->local) != 0)
- continue;
- if (remote != NULL && CMPSADDR(remote, p->remote) != 0)
- continue;
- }
+
+ if (local != NULL && cmpsaddr(local, p->local) != 0)
+ continue;
+
+ if (remote != NULL && cmpsaddr(remote, p->remote) != 0)
+ continue;
plog(LLV_DEBUG2, LOCATION, NULL, "matched\n");
return p;
@@ -287,8 +282,8 @@
if (p->status < PHASE1ST_DYING)
continue;
- if (CMPSADDR(iph1->local, p->local) == 0
- && CMPSADDR(iph1->remote, p->remote) == 0)
+ if (cmpsaddr(iph1->local, p->local) == 0
+ && cmpsaddr(iph1->remote, p->remote) == 0)
migrate_ph12(p, iph1);
}
}
@@ -518,11 +513,11 @@
continue;
if (sel->src != NULL &&
- CMPSADDR(sel->src, p->src) != 0)
+ cmpsaddr(sel->src, p->src) != 0)
continue;
if (sel->dst != NULL &&
- CMPSADDR(sel->dst, p->dst) != 0)
+ cmpsaddr(sel->dst, p->dst) != 0)
continue;
}
@@ -586,8 +581,8 @@
LIST_FOREACH(p, &ph2tree, chain) {
if (spid == p->spid &&
- cmpsaddrwild(src, p->src) == 0 &&
- cmpsaddrwild(dst, p->dst) == 0){
+ cmpsaddr(src, p->src) == 0 &&
+ cmpsaddr(dst, p->dst) == 0){
/* Sanity check to detect zombie handlers
* XXX Sould be done "somewhere" more interesting,
* because we have lots of getph2byxxxx(), but this one
@@ -614,8 +609,8 @@
struct ph2handle *p;
LIST_FOREACH(p, &ph2tree, chain) {
- if (cmpsaddrstrict(src, p->src) == 0 &&
- cmpsaddrstrict(dst, p->dst) == 0)
+ if (cmpsaddr(src, p->src) == 0 &&
+ cmpsaddr(dst, p->dst) == 0)
return p;
}
@@ -918,7 +913,7 @@
struct contacted *p;
LIST_FOREACH(p, &ctdtree, chain) {
- if (cmpsaddrstrict(remote, p->remote) == 0)
+ if (cmpsaddr(remote, p->remote) == 0)
return p;
}
@@ -997,7 +992,7 @@
/*
* the packet was processed before, but the remote address mismatches.
*/
- if (cmpsaddrstrict(remote, r->remote) != 0)
+ if (cmpsaddr(remote, r->remote) != 0)
return 2;
/*
Index: src/crypto/dist/ipsec-tools/src/racoon/handler.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/handler.h:1.20 src/crypto/dist/ipsec-tools/src/racoon/handler.h:1.21
--- src/crypto/dist/ipsec-tools/src/racoon/handler.h:1.20 Thu Mar 12 10:57:26 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/handler.h Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: handler.h,v 1.20 2009/03/12 10:57:26 tteras Exp $ */
+/* $NetBSD: handler.h,v 1.21 2009/07/03 06:41:46 tteras Exp $ */
/* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */
@@ -467,7 +467,6 @@
void *enum_arg));
#define GETPH1_F_ESTABLISHED 0x0001
-#define GETPH1_F_WITHOUT_PORTS 0x0002
extern struct ph1handle *getph1 __P((struct remoteconf *rmconf,
struct sockaddr *local,
@@ -476,10 +475,8 @@
#define getph1byaddr(local, remote, est) \
getph1(NULL, local, remote, est ? GETPH1_F_ESTABLISHED : 0)
-#define getph1byaddrwop(local, remote) \
- getph1(NULL, local, remote, GETPH1_F_WITHOUT_PORTS)
-#define getph1bydstaddrwop(remote) \
- getph1(NULL, NULL, remote, GETPH1_F_WITHOUT_PORTS)
+#define getph1bydstaddr(remote) \
+ getph1(NULL, NULL, remote, 0)
#ifdef ENABLE_HYBRID
struct ph1handle *getph1bylogin __P((char *));
Index: src/crypto/dist/ipsec-tools/src/racoon/isakmp.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/isakmp.c:1.57 src/crypto/dist/ipsec-tools/src/racoon/isakmp.c:1.58
--- src/crypto/dist/ipsec-tools/src/racoon/isakmp.c:1.57 Fri Jul 3 06:40:10 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/isakmp.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: isakmp.c,v 1.57 2009/07/03 06:40:10 tteras Exp $ */
+/* $NetBSD: isakmp.c,v 1.58 2009/07/03 06:41:46 tteras Exp $ */
/* Id: isakmp.c,v 1.74 2006/05/07 21:32:59 manubsd Exp */
@@ -468,8 +468,8 @@
/* Floating ports for NAT-T */
if (NATT_AVAILABLE(iph1) &&
! (iph1->natt_flags & NAT_PORTS_CHANGED) &&
- ((cmpsaddrstrict(iph1->remote, remote) != 0) ||
- (cmpsaddrstrict(iph1->local, local) != 0)))
+ ((cmpsaddr(iph1->remote, remote) != 0) ||
+ (cmpsaddr(iph1->local, local) != 0)))
{
/* prevent memory leak */
racoon_free(iph1->remote);
@@ -510,7 +510,7 @@
#endif
/* must be same addresses in one stream of a phase at least. */
- if (cmpsaddrstrict(iph1->remote, remote) != 0) {
+ if (cmpsaddr(iph1->remote, remote) != 0) {
char *saddr_db, *saddr_act;
saddr_db = racoon_strdup(saddr2str(iph1->remote));
@@ -636,7 +636,7 @@
"exchange received.\n");
return -1;
}
- if (cmpsaddrstrict(iph1->remote, remote) != 0) {
+ if (cmpsaddr(iph1->remote, remote) != 0) {
plog(LLV_WARNING, LOCATION, remote,
"remote address mismatched. "
"db=%s\n",
@@ -1268,6 +1268,12 @@
}
#endif
+ /* fixup ph2 ports for this ph1 */
+ if (extract_port(iph2->src) == 0)
+ set_port(iph2->src, extract_port(iph1->local));
+ if (extract_port(iph2->dst) == 0)
+ set_port(iph2->dst, extract_port(iph1->remote));
+
/* found ISAKMP-SA. */
plog(LLV_DEBUG, LOCATION, NULL, "===\n");
plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
@@ -1346,15 +1352,6 @@
delph2(iph2);
return -1;
}
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
- if (set_port(iph2->dst, 0) == NULL ||
- set_port(iph2->src, 0) == NULL) {
- plog(LLV_ERROR, LOCATION, NULL,
- "invalid family: %d\n", iph2->dst->sa_family);
- delph2(iph2);
- return -1;
- }
-#endif
/* add new entry to isakmp status table */
insph2(iph2);
@@ -2179,23 +2176,12 @@
return 0;
}
- /*
- * Search isakmp status table by address and port
- * If NAT-T is in use, consider null ports as a
- * wildcard and use IKE ports instead.
+ /*
+ * XXX Searching by IP addresses + ports might fail on
+ * some cases, we should use the ISAKMP identity to search
+ * matching ISAKMP.
*/
-#ifdef ENABLE_NATT
- if (!extract_port(iph2->src) && !extract_port(iph2->dst)) {
- if ((iph1 = getph1byaddrwop(iph2->src, iph2->dst)) != NULL) {
- set_port(iph2->src, extract_port(iph1->local));
- set_port(iph2->dst, extract_port(iph1->remote));
- }
- } else {
- iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
- }
-#else
iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-#endif
/* no ISAKMP-SA found. */
if (iph1 == NULL) {
@@ -2373,26 +2359,8 @@
return;
}
- /*
- * Search isakmp status table by address and port
- * If NAT-T is in use, consider null ports as a
- * wildcard and use IKE ports instead.
- */
-#ifdef ENABLE_NATT
- if (!extract_port(iph2->src) && !extract_port(iph2->dst)) {
- plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: extract_port.\n");
- if( (iph1 = getph1byaddrwop(iph2->src, iph2->dst)) != NULL){
- plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: found a ph1 wop.\n");
- }
- } else {
- plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: searching byaddr.\n");
- iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
- if(iph1 != NULL)
- plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: found byaddr.\n");
- }
-#else
+ /* Search isakmp status table by address and port */
iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-#endif
/* XXX Even if ph1 as responder is there, should we not start
* phase 2 negotiation ? */
@@ -3314,20 +3282,10 @@
msg = next;
continue;
}
+ pk_fixup_sa_addresses(mhp);
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-#ifdef SADB_X_NAT_T_NEW_MAPPING
- if (PFKEY_ADDR_X_NATTYPE(mhp[SADB_X_EXT_NAT_T_TYPE])) {
- /* NAT-T is enabled for this SADB entry; copy
- * the ports from NAT-T extensions */
- if(mhp[SADB_X_EXT_NAT_T_SPORT] != NULL)
- set_port(src, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_SPORT]));
- if(mhp[SADB_X_EXT_NAT_T_DPORT] != NULL)
- set_port(dst, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_DPORT]));
- }
-#endif
-
if (sa->sadb_sa_state != SADB_SASTATE_LARVAL &&
sa->sadb_sa_state != SADB_SASTATE_MATURE &&
sa->sadb_sa_state != SADB_SASTATE_DYING) {
@@ -3339,22 +3297,14 @@
* check in/outbound SAs.
* Select only SAs where src == local and dst == remote (outgoing)
* or src == remote and dst == local (incoming).
- * XXX we sometime have src/dst ports set to 0 and want to match
- * iph1->local/remote with ports set to 500. This is a bug, see trac:2
*/
-#ifdef ENABLE_NATT
- if ((cmpsaddrmagic(iph1->local, src) || cmpsaddrmagic(iph1->remote, dst)) &&
- (cmpsaddrmagic(iph1->local, dst) || cmpsaddrmagic(iph1->remote, src))) {
- msg = next;
- continue;
- }
-#else
- if ((CMPSADDR(iph1->local, src) || CMPSADDR(iph1->remote, dst)) &&
- (CMPSADDR(iph1->local, dst) || CMPSADDR(iph1->remote, src))) {
+ if ((cmpsaddr(iph1->local, src) ||
+ cmpsaddr(iph1->remote, dst)) &&
+ (cmpsaddr(iph1->local, dst) ||
+ cmpsaddr(iph1->remote, src))) {
msg = next;
continue;
}
-#endif
proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
Index: src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c:1.21 src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c:1.22
--- src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c:1.21 Fri Jan 23 08:23:51 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/isakmp_cfg.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: isakmp_cfg.c,v 1.21 2009/01/23 08:23:51 tteras Exp $ */
+/* $NetBSD: isakmp_cfg.c,v 1.22 2009/07/03 06:41:46 tteras Exp $ */
/* Id: isakmp_cfg.c,v 1.55 2006/08/22 18:17:17 manubsd Exp */
@@ -1151,15 +1151,6 @@
goto end;
}
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
- if (set_port(iph2->dst, 0) == NULL ||
- set_port(iph2->src, 0) == NULL) {
- plog(LLV_ERROR, LOCATION, NULL,
- "invalid family: %d\n", iph1->remote->sa_family);
- delph2(iph2);
- goto end;
- }
-#endif
iph2->side = INITIATOR;
iph2->status = PHASE2ST_START;
Index: src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c:1.40 src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c:1.41
--- src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c:1.40 Fri Jul 3 06:40:10 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/isakmp_inf.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: isakmp_inf.c,v 1.40 2009/07/03 06:40:10 tteras Exp $ */
+/* $NetBSD: isakmp_inf.c,v 1.41 2009/07/03 06:41:46 tteras Exp $ */
/* Id: isakmp_inf.c,v 1.44 2006/05/06 20:45:52 manubsd Exp */
@@ -899,15 +899,6 @@
delph2(iph2);
goto end;
}
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
- if (set_port(iph2->dst, 0) == NULL ||
- set_port(iph2->src, 0) == NULL) {
- plog(LLV_ERROR, LOCATION, NULL,
- "invalid family: %d\n", iph1->remote->sa_family);
- delph2(iph2);
- goto end;
- }
-#endif
iph2->side = INITIATOR;
iph2->status = PHASE2ST_START;
iph2->msgid = isakmp_newmsgid2(iph1);
@@ -1123,9 +1114,6 @@
u_int64_t created;
size_t i;
caddr_t mhp[SADB_EXT_MAX + 1];
-#ifdef ENABLE_NATT
- int natt_port_forced;
-#endif
plog(LLV_DEBUG2, LOCATION, NULL,
"purge_ipsec_spi:\n");
@@ -1165,6 +1153,7 @@
msg = next;
continue;
}
+ pk_fixup_sa_addresses(mhp);
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
@@ -1178,28 +1167,7 @@
msg = next;
continue;
}
-#ifdef ENABLE_NATT
- if (PFKEY_ADDR_X_NATTYPE(mhp[SADB_X_EXT_NAT_T_TYPE])) {
- /* NAT-T is enabled for this SADB entry; copy
- * the ports from NAT-T extensions */
- if (extract_port(src) == 0 &&
- mhp[SADB_X_EXT_NAT_T_SPORT] != NULL) {
- set_port(src, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_SPORT]));
- }
- if (extract_port(dst) == 0 &&
- mhp[SADB_X_EXT_NAT_T_DPORT] != NULL) {
- set_port(dst, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_DPORT]));
- }
- natt_port_forced = 0;
- } else {
- /* Force default UDP ports, so
- * CMPSADDR will match SAs with NO encapsulation */
- set_port(src, PORT_ISAKMP);
- set_port(dst, PORT_ISAKMP);
- natt_port_forced = 1;
- }
-#endif
plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(src));
plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(dst));
@@ -1207,19 +1175,11 @@
/* don't delete inbound SAs at the moment */
/* XXX should we remove SAs with opposite direction as well? */
- if (CMPSADDR(dst0, dst)) {
+ if (cmpsaddr(dst0, dst)) {
msg = next;
continue;
}
-#ifdef ENABLE_NATT
- if (natt_port_forced) {
- /* Set back port to 0 if it was forced
- * to default UDP port */
- set_port(src, 0);
- set_port(dst, 0);
- }
-#endif
for (i = 0; i < n; i++) {
plog(LLV_DEBUG, LOCATION, NULL,
"check spi(packet)=%u spi(db)=%u.\n",
@@ -1350,37 +1310,33 @@
msg = (struct sadb_msg *)buf->v;
end = (struct sadb_msg *)(buf->v + buf->l);
- while (msg < end) {
+ for (; msg < end; msg = next) {
if ((msg->sadb_msg_len << 3) < sizeof(*msg))
break;
+
next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
- if (msg->sadb_msg_type != SADB_DUMP) {
- msg = next;
+ if (msg->sadb_msg_type != SADB_DUMP)
continue;
- }
if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
plog(LLV_ERROR, LOCATION, NULL,
"pfkey_check (%s)\n", ipsec_strerror());
- msg = next;
continue;
}
if (mhp[SADB_EXT_SA] == NULL
|| mhp[SADB_EXT_ADDRESS_SRC] == NULL
- || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
- msg = next;
+ || mhp[SADB_EXT_ADDRESS_DST] == NULL)
continue;
- }
+
sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
+ pk_fixup_sa_addresses(mhp);
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
if (sa->sadb_sa_state != SADB_SASTATE_MATURE
- && sa->sadb_sa_state != SADB_SASTATE_DYING) {
- msg = next;
+ && sa->sadb_sa_state != SADB_SASTATE_DYING)
continue;
- }
/*
* RFC2407 4.6.3.3 INITIAL-CONTACT is the message that
@@ -1390,39 +1346,18 @@
* racoon only deletes SA which is matched both the
* source address and the destination accress.
*/
-#ifdef ENABLE_NATT
- /*
- * XXX RFC 3947 says that whe MUST NOT use IP+port to find old SAs
- * from this peer !
- */
- if(iph1->natt_flags & NAT_DETECTED){
- if (CMPSADDR(iph1->local, src) == 0 &&
- CMPSADDR(iph1->remote, dst) == 0)
- ;
- else if (CMPSADDR(iph1->remote, src) == 0 &&
- CMPSADDR(iph1->local, dst) == 0)
- ;
- else {
- msg = next;
- continue;
- }
- } else
-#endif
- /* If there is no NAT-T, we don't have to check addr + port...
- * XXX what about a configuration with a remote peers which is not
- * NATed, but which NATs some other peers ?
- * Here, the INITIAl-CONTACT would also flush all those NATed peers !!
- */
- if (cmpsaddrwop(iph1->local, src) == 0 &&
- cmpsaddrwop(iph1->remote, dst) == 0)
- ;
- else if (cmpsaddrwop(iph1->remote, src) == 0 &&
- cmpsaddrwop(iph1->local, dst) == 0)
- ;
- else {
- msg = next;
+
+ /*
+ * Check that the IP and port match. But this is not optimal,
+ * since NAT-T can make the peer have multiple different
+ * ports. Correct thing to do is delete all entries with
+ * same identity. -TT
+ */
+ if ((cmpsaddr(iph1->local, src) != 0 ||
+ cmpsaddr(iph1->remote, dst) != 0) &&
+ (cmpsaddr(iph1->local, dst) != 0 ||
+ cmpsaddr(iph1->remote, src) != 0))
continue;
- }
/*
* Make sure this is an SATYPE that we manage.
@@ -1434,10 +1369,8 @@
msg->sadb_msg_satype)
break;
}
- if (i == pfkey_nsatypes) {
- msg = next;
+ if (i == pfkey_nsatypes)
continue;
- }
plog(LLV_INFO, LOCATION, NULL,
"purging spi=%u.\n", ntohl(sa->sadb_sa_spi));
@@ -1457,8 +1390,6 @@
remph2(iph2);
delph2(iph2);
}
-
- msg = next;
}
vfree(buf);
Index: src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c:1.25 src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c:1.26
--- src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c:1.25 Thu Mar 12 10:57:26 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/isakmp_quick.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: isakmp_quick.c,v 1.25 2009/03/12 10:57:26 tteras Exp $ */
+/* $NetBSD: isakmp_quick.c,v 1.26 2009/07/03 06:41:46 tteras Exp $ */
/* Id: isakmp_quick.c,v 1.29 2006/08/22 18:17:17 manubsd Exp */
@@ -610,17 +610,19 @@
error = ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED;
goto end;
}
+#ifdef ENABLE_NATT
+ set_port(iph2->natoa_src,
+ extract_port((struct sockaddr *) &proposed_addr));
+#endif
- if (cmpsaddrstrict((struct sockaddr *) &proposed_addr,
- (struct sockaddr *) &got_addr) == 0) {
+ if (cmpsaddr((struct sockaddr *) &proposed_addr,
+ (struct sockaddr *) &got_addr) == 0) {
plog(LLV_DEBUG, LOCATION, NULL,
"IDci matches proposal.\n");
#ifdef ENABLE_NATT
} else if (iph2->natoa_src != NULL
- && cmpsaddrwop(iph2->natoa_src,
- (struct sockaddr *) &got_addr) == 0
- && extract_port((struct sockaddr *) &proposed_addr) ==
- extract_port((struct sockaddr *) &got_addr)) {
+ && cmpsaddr(iph2->natoa_src,
+ (struct sockaddr *) &got_addr) == 0) {
plog(LLV_DEBUG, LOCATION, NULL,
"IDci matches NAT-OAi.\n");
#endif
@@ -656,16 +658,19 @@
goto end;
}
- if (cmpsaddrstrict((struct sockaddr *) &proposed_addr,
- (struct sockaddr *) &got_addr) == 0) {
+#ifdef ENABLE_NATT
+ set_port(iph2->natoa_dst,
+ extract_port((struct sockaddr *) &proposed_addr));
+#endif
+
+ if (cmpsaddr((struct sockaddr *) &proposed_addr,
+ (struct sockaddr *) &got_addr) == 0) {
plog(LLV_DEBUG, LOCATION, NULL,
"IDcr matches proposal.\n");
#ifdef ENABLE_NATT
} else if (iph2->natoa_dst != NULL
- && cmpsaddrwop(iph2->natoa_dst,
- (struct sockaddr *) &got_addr) == 0
- && extract_port((struct sockaddr *) &proposed_addr) ==
- extract_port((struct sockaddr *) &got_addr)) {
+ && cmpsaddr(iph2->natoa_dst,
+ (struct sockaddr *) &got_addr) == 0) {
plog(LLV_DEBUG, LOCATION, NULL,
"IDcr matches NAT-OAr.\n");
#endif
Index: src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c:1.11 src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c:1.12
--- src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c:1.11 Mon May 18 17:00:42 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/nattraversal.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: nattraversal.c,v 1.11 2009/05/18 17:00:42 tteras Exp $ */
+/* $NetBSD: nattraversal.c,v 1.12 2009/07/03 06:41:46 tteras Exp $ */
/*
* Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
@@ -379,8 +379,8 @@
struct natt_ka_addrs *ka = NULL, *new_addr;
TAILQ_FOREACH (ka, &ka_tree, chain) {
- if (cmpsaddrstrict(ka->src, src) == 0 &&
- cmpsaddrstrict(ka->dst, dst) == 0) {
+ if (cmpsaddr(ka->src, src) == 0 &&
+ cmpsaddr(ka->dst, dst) == 0) {
ka->in_use++;
plog (LLV_INFO, LOCATION, NULL, "KA found: %s (in_use=%u)\n",
saddr2str_fromto("%s->%s", src, dst), ka->in_use);
@@ -443,8 +443,8 @@
plog (LLV_DEBUG, LOCATION, NULL, "KA tree dump: %s (in_use=%u)\n",
saddr2str_fromto("%s->%s", src, dst), ka->in_use);
- if (cmpsaddrstrict(ka->src, src) == 0 &&
- cmpsaddrstrict(ka->dst, dst) == 0 &&
+ if (cmpsaddr(ka->src, src) == 0 &&
+ cmpsaddr(ka->dst, dst) == 0 &&
-- ka->in_use <= 0) {
plog (LLV_DEBUG, LOCATION, NULL, "KA removing this one...\n");
Index: src/crypto/dist/ipsec-tools/src/racoon/pfkey.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.47 src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.48
--- src/crypto/dist/ipsec-tools/src/racoon/pfkey.c:1.47 Fri Jul 3 06:40:10 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/pfkey.c Fri Jul 3 06:41:46 2009
@@ -1,6 +1,6 @@
-/* $NetBSD: pfkey.c,v 1.47 2009/07/03 06:40:10 tteras Exp $ */
+/* $NetBSD: pfkey.c,v 1.48 2009/07/03 06:41:46 tteras Exp $ */
-/* $Id: pfkey.c,v 1.47 2009/07/03 06:40:10 tteras Exp $ */
+/* $Id: pfkey.c,v 1.48 2009/07/03 06:41:46 tteras Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -774,8 +774,12 @@
caddr_t *mhp;
{
struct sockaddr *src, *dst;
+
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
+ set_port(src, PORT_ISAKMP);
+ set_port(dst, PORT_ISAKMP);
+
#ifdef ENABLE_NATT
if (PFKEY_ADDR_X_NATTYPE(mhp[SADB_X_EXT_NAT_T_TYPE])) {
/* NAT-T is enabled for this SADB entry; copy
@@ -785,9 +789,6 @@
if(mhp[SADB_X_EXT_NAT_T_DPORT] != NULL)
set_port(dst, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_DPORT]));
}
-#else
- set_port(src, 0);
- set_port(dst, 0);
#endif
}
@@ -949,10 +950,6 @@
dport=extract_port(dst);
}
#endif
- /* Always remove port information, it will be sent in
- * SADB_X_EXT_NAT_T_[S|D]PORT if needed */
- set_port(src, 0);
- set_port(dst, 0);
plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_getspi\n");
if (pfkey_send_getspi_nat(
@@ -1009,6 +1006,7 @@
}
msg = (struct sadb_msg *)mhp[0];
sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
+ pk_fixup_sa_addresses(mhp);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); /* note SA dir */
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
@@ -1183,18 +1181,14 @@
#ifdef ENABLE_NATT
if (pr->udp_encap) {
sa_args.l_natt_type = iph2->ph1->natt_options->encaps_type;
- sa_args.l_natt_sport = extract_port (iph2->ph1->remote);
- sa_args.l_natt_dport = extract_port (iph2->ph1->local);
+ sa_args.l_natt_sport = extract_port(iph2->ph1->remote);
+ sa_args.l_natt_dport = extract_port(iph2->ph1->local);
sa_args.l_natt_oa = iph2->natoa_src;
#ifdef SADB_X_EXT_NAT_T_FRAG
sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag;
#endif
}
#endif
- /* Always remove port information, it will be sent in
- * SADB_X_EXT_NAT_T_[S|D]PORT if needed */
- set_port(sa_args.src, 0);
- set_port(sa_args.dst, 0);
/* more info to fill in */
sa_args.spi = pr->spi;
@@ -1358,14 +1352,6 @@
/* turn off schedule */
sched_cancel(&iph2->scr);
- /* Force the update of ph2's ports, as there is at least one
- * situation where they'll mismatch with ph1's values
- */
-#ifdef ENABLE_NATT
- set_port(iph2->src, extract_port(iph2->ph1->local));
- set_port(iph2->dst, extract_port(iph2->ph1->remote));
-#endif
-
/*
* since we are going to reuse the phase2 handler, we need to
* remain it and refresh all the references between ph1 and ph2 to use.
@@ -1418,7 +1404,7 @@
racoon_free(sa_args.src);
racoon_free(sa_args.dst);
return -1;
- }
+ }
for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
/* validity check */
@@ -1490,11 +1476,6 @@
#endif
}
#endif
- /* Always remove port information, it will be sent in
- * SADB_X_EXT_NAT_T_[S|D]PORT if needed */
- set_port(sa_args.src, 0);
- set_port(sa_args.dst, 0);
-
/* more info to fill in */
sa_args.spi = pr->spi_p;
sa_args.reqid = pr->reqid_out;
@@ -1559,6 +1540,7 @@
return -1;
}
msg = (struct sadb_msg *)mhp[0];
+ pk_fixup_sa_addresses(mhp);
src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
@@ -1749,7 +1731,9 @@
}
msg = (struct sadb_msg *)mhp[0];
xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
- pk_fixup_sa_addresses(mhp);
+ /* acquire does not have nat-t ports; so do not bother setting
+ * the default port 500; just use the port zero for wildcard
+ * matching the get a valid natted destination */
sp_src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
sp_dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
@@ -2884,8 +2868,8 @@
u_int16_t port;
/* Already up-to-date? */
- if (cmpsaddrwop(iph1->local, ma->local) == 0 &&
- cmpsaddrwop(iph1->remote, ma->remote) == 0)
+ if (cmpsaddr(iph1->local, ma->local) == 0 &&
+ cmpsaddr(iph1->remote, ma->remote) == 0)
return 0;
if (iph1->status < PHASE1ST_ESTABLISHED) {
@@ -2985,8 +2969,8 @@
migrate_ph1_ike_addresses(iph2->ph1, arg);
/* Already up-to-date? */
- if (CMPSADDR(iph2->src, ma->local) == 0 &&
- CMPSADDR(iph2->dst, ma->remote) == 0)
+ if (cmpsaddr(iph2->src, ma->local) == 0 &&
+ cmpsaddr(iph2->dst, ma->remote) == 0)
return 0;
/* save src/dst as sa_src/sa_dst before rewriting */
@@ -3206,8 +3190,8 @@
"changing address families (%d to %d) for endpoints.\n",
osaddr->sa_family, nsaddr->sa_family);
- if (CMPSADDR(osaddr, (struct sockaddr *)&saidx->src) ||
- CMPSADDR(odaddr, (struct sockaddr *)&saidx->dst)) {
+ if (cmpsaddr(osaddr, (struct sockaddr *) &saidx->src) ||
+ cmpsaddr(odaddr, (struct sockaddr *) &saidx->dst)) {
plog(LLV_DEBUG, LOCATION, NULL, "SADB_X_MIGRATE: "
"mismatch of addresses in saidx and xisr.\n");
return -1;
Index: src/crypto/dist/ipsec-tools/src/racoon/policy.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/policy.c:1.10 src/crypto/dist/ipsec-tools/src/racoon/policy.c:1.11
--- src/crypto/dist/ipsec-tools/src/racoon/policy.c:1.10 Fri Dec 5 06:02:20 2008
+++ src/crypto/dist/ipsec-tools/src/racoon/policy.c Fri Jul 3 06:41:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: policy.c,v 1.10 2008/12/05 06:02:20 tteras Exp $ */
+/* $NetBSD: policy.c,v 1.11 2009/07/03 06:41:46 tteras Exp $ */
/* $KAME: policy.c,v 1.46 2001/11/16 04:08:10 sakane Exp $ */
@@ -141,16 +141,18 @@
saddr2str(iph2->src));
plog(LLV_DEBUG, LOCATION, NULL, "src2: %s\n",
saddr2str((struct sockaddr *)&spidx->src));
- if (cmpsaddrwop(iph2->src, (struct sockaddr *)&spidx->src)
- || spidx->prefs != prefixlen)
+
+ if (cmpsaddr(iph2->src, (struct sockaddr *) &spidx->src) ||
+ spidx->prefs != prefixlen)
return NULL;
plog(LLV_DEBUG, LOCATION, NULL, "dst1: %s\n",
saddr2str(iph2->dst));
plog(LLV_DEBUG, LOCATION, NULL, "dst2: %s\n",
saddr2str((struct sockaddr *)&spidx->dst));
- if (cmpsaddrwop(iph2->dst, (struct sockaddr *)&spidx->dst)
- || spidx->prefd != prefixlen)
+
+ if (cmpsaddr(iph2->dst, (struct sockaddr *) &spidx->dst) ||
+ spidx->prefd != prefixlen)
return NULL;
plog(LLV_DEBUG, LOCATION, NULL, "looks to be transport mode\n");
@@ -198,11 +200,11 @@
|| a->ul_proto != b->ul_proto)
return 1;
- if (cmpsaddrstrict((struct sockaddr *)&a->src,
- (struct sockaddr *)&b->src))
+ if (cmpsaddr((struct sockaddr *) &a->src,
+ (struct sockaddr *) &b->src))
return 1;
- if (cmpsaddrstrict((struct sockaddr *)&a->dst,
- (struct sockaddr *)&b->dst))
+ if (cmpsaddr((struct sockaddr *) &a->dst,
+ (struct sockaddr *) &b->dst))
return 1;
#ifdef HAVE_SECCTX
@@ -259,7 +261,7 @@
a, b->prefs, saddr2str((struct sockaddr *)&sa1));
plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
b, b->prefs, saddr2str((struct sockaddr *)&sa2));
- if (cmpsaddrwild((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
+ if (cmpsaddr((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
return 1;
#ifndef __linux__
@@ -277,7 +279,7 @@
a, b->prefd, saddr2str((struct sockaddr *)&sa1));
plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
b, b->prefd, saddr2str((struct sockaddr *)&sa2));
- if (cmpsaddrwild((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
+ if (cmpsaddr((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
return 1;
#ifdef HAVE_SECCTX
Index: src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h:1.10 src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h:1.11
--- src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h:1.10 Fri Mar 13 04:49:16 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/remoteconf.h Fri Jul 3 06:41:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: remoteconf.h,v 1.10 2009/03/13 04:49:16 tteras Exp $ */
+/* $NetBSD: remoteconf.h,v 1.11 2009/07/03 06:41:47 tteras Exp $ */
/* Id: remoteconf.h,v 1.26 2006/05/06 15:52:44 manubsd Exp */
@@ -189,8 +189,7 @@
void *enum_arg));
#define GETRMCONF_F_NO_ANONYMOUS 0x0001
-#define GETRMCONF_F_NO_PORTS 0x0002
-#define GETRMCONF_F_NO_PASSIVE 0x0004
+#define GETRMCONF_F_NO_PASSIVE 0x0002
#define RMCONF_ERR_MULTIPLE ((struct remoteconf *) -1)
Index: src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h
diff -u src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h:1.10 src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h:1.11
--- src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h:1.10 Mon May 18 17:40:38 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/sockmisc.h Fri Jul 3 06:41:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sockmisc.h,v 1.10 2009/05/18 17:40:38 tteras Exp $ */
+/* $NetBSD: sockmisc.h,v 1.11 2009/07/03 06:41:47 tteras Exp $ */
/* Id: sockmisc.h,v 1.9 2005/10/05 16:55:41 manubsd Exp */
@@ -56,16 +56,11 @@
extern const int niflags;
-extern int cmpsaddrwop __P((const struct sockaddr *, const struct sockaddr *));
-extern int cmpsaddrwild __P((const struct sockaddr *, const struct sockaddr *));
-extern int cmpsaddrstrict __P((const struct sockaddr *, const struct sockaddr *));
-extern int cmpsaddrmagic __P((const struct sockaddr *, const struct sockaddr *));
-
-#ifdef ENABLE_NATT
-#define CMPSADDR(saddr1, saddr2) cmpsaddrstrict((saddr1), (saddr2))
-#else
-#define CMPSADDR(saddr1, saddr2) cmpsaddrwop((saddr1), (saddr2))
-#endif
+#define CMPSADDR_MATCH 0
+#define CMPSADDR_WOP_MATCH 1
+#define CMPSADDR_MISMATCH 2
+
+extern int cmpsaddr __P((const struct sockaddr *, const struct sockaddr *));
extern struct sockaddr *getlocaladdr __P((struct sockaddr *));
Index: src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c:1.14 src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c:1.15
--- src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c:1.14 Thu Mar 12 23:05:27 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/remoteconf.c Fri Jul 3 06:41:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: remoteconf.c,v 1.14 2009/03/12 23:05:27 he Exp $ */
+/* $NetBSD: remoteconf.c,v 1.15 2009/07/03 06:41:47 tteras Exp $ */
/* Id: remoteconf.c,v 1.38 2006/05/06 15:52:44 manubsd Exp */
@@ -200,15 +200,9 @@
/* Check address */
if (rmsel->remote != NULL) {
if (rmconf->remote->sa_family != AF_UNSPEC) {
- if (rmsel->flags & GETRMCONF_F_NO_PORTS) {
- if (cmpsaddrwop(rmsel->remote,
- rmconf->remote) != 0)
- return 0;
- } else {
- if (cmpsaddrstrict(rmsel->remote,
- rmconf->remote) != 0)
- return 0;
- }
+ if (cmpsaddr(rmsel->remote, rmconf->remote) != 0)
+ return 0;
+
/* Address matched */
ret = 2;
}
@@ -262,7 +256,7 @@
struct ph1handle *iph1;
{
memset(rmsel, 0, sizeof(*rmsel));
- rmsel->flags = GETRMCONF_F_NO_PORTS;
+ rmsel->flags = 0;
rmsel->remote = iph1->remote;
rmsel->etype = iph1->etype;
rmsel->approval = iph1->approval;
@@ -357,22 +351,8 @@
int n = 0;
memset(&ctx, 0, sizeof(ctx));
- ctx.sel.flags = flags | GETRMCONF_F_NO_PORTS;
+ ctx.sel.flags = flags;
ctx.sel.remote = remote;
-#ifndef ENABLE_NATT
- /*
- * We never have ports set in our remote configurations, but when
- * NAT-T is enabled, the kernel can have policies with ports and
- * send us an acquire message for a destination that has a port set.
- * If we do this port check here, we don't find the remote config.
- *
- * In an ideal world, we would be able to have remote conf with
- * port, and the port could be a wildcard. That test could be used.
- */
- if (remote->sa_family != AF_UNSPEC &&
- extract_port(remote) != IPSEC_PORT_ANY)
- ctx.sel.flags &= ~GETRMCONF_F_NO_PORTS;
-#endif /* ENABLE_NATT */
if (enumrmconf(&ctx.sel, rmconf_find, &ctx) != 0) {
plog(LLV_ERROR, LOCATION, remote,
Index: src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c:1.15 src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c:1.16
--- src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c:1.15 Mon May 18 17:40:38 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/sockmisc.c Fri Jul 3 06:41:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sockmisc.c,v 1.15 2009/05/18 17:40:38 tteras Exp $ */
+/* $NetBSD: sockmisc.c,v 1.16 2009/07/03 06:41:47 tteras Exp $ */
/* Id: sockmisc.c,v 1.24 2006/05/07 21:32:59 manubsd Exp */
@@ -80,87 +80,28 @@
const int niflags = 0;
/*
- * compare two sockaddr without port number.
- * OUT: 0: equal.
- * 1: not equal.
- */
-int
-cmpsaddrwop(addr1, addr2)
- const struct sockaddr *addr1;
- const struct sockaddr *addr2;
-{
- caddr_t sa1, sa2;
-
- if (addr1 == 0 && addr2 == 0)
- return 0;
- if (addr1 == 0 || addr2 == 0)
- return 1;
-
-#ifdef __linux__
- if (addr1->sa_family != addr2->sa_family)
- return 1;
-#else
- if (addr1->sa_len != addr2->sa_len
- || addr1->sa_family != addr2->sa_family)
- return 1;
-
-#endif /* __linux__ */
-
- switch (addr1->sa_family) {
- case AF_UNSPEC:
- break;
- case AF_INET:
- sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
- sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
- if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
- return 1;
- break;
-#ifdef INET6
- case AF_INET6:
- sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
- sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
- if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
- return 1;
- if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
- ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
- return 1;
- break;
-#endif
- default:
- return 1;
- }
-
- return 0;
-}
-
-/*
* compare two sockaddr with port, taking care wildcard.
* addr1 is a subject address, addr2 is in a database entry.
* OUT: 0: equal.
* 1: not equal.
*/
int
-cmpsaddrwild(addr1, addr2)
+cmpsaddr(addr1, addr2)
const struct sockaddr *addr1;
const struct sockaddr *addr2;
{
caddr_t sa1, sa2;
u_short port1, port2;
- if (addr1 == 0 && addr2 == 0)
- return 0;
- if (addr1 == 0 || addr2 == 0)
- return 1;
+ if (addr1 == NULL && addr2 == NULL)
+ return CMPSADDR_MATCH;
-#ifdef __linux__
- if (addr1->sa_family != addr2->sa_family)
- return 1;
-#else
- if (addr1->sa_len != addr2->sa_len
- || addr1->sa_family != addr2->sa_family)
- return 1;
+ if (addr1 == NULL || addr2 == NULL)
+ return CMPSADDR_MISMATCH;
-#endif /* __linux__ */
+ if (addr1->sa_family != addr2->sa_family ||
+ sysdep_sa_len(addr1) != sysdep_sa_len(addr2))
+ return CMPSADDR_MISMATCH;
switch (addr1->sa_family) {
case AF_UNSPEC:
@@ -170,12 +111,8 @@
sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
port1 = ((struct sockaddr_in *)addr1)->sin_port;
port2 = ((struct sockaddr_in *)addr2)->sin_port;
- if (!(port1 == IPSEC_PORT_ANY ||
- port2 == IPSEC_PORT_ANY ||
- port1 == port2))
- return 1;
if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
- return 1;
+ return CMPSADDR_MISMATCH;
break;
#ifdef INET6
case AF_INET6:
@@ -183,155 +120,23 @@
sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
port1 = ((struct sockaddr_in6 *)addr1)->sin6_port;
port2 = ((struct sockaddr_in6 *)addr2)->sin6_port;
- if (!(port1 == IPSEC_PORT_ANY ||
- port2 == IPSEC_PORT_ANY ||
- port1 == port2))
- return 1;
if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
- return 1;
+ return CMPSADDR_MISMATCH;
if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
((struct sockaddr_in6 *)addr2)->sin6_scope_id)
- return 1;
+ return CMPSADDR_MISMATCH;
break;
#endif
default:
- return 1;
+ return CMPSADDR_MISMATCH;
}
- return 0;
-}
+ if (port1 == port2 ||
+ port1 == IPSEC_PORT_ANY ||
+ port2 == IPSEC_PORT_ANY)
+ return CMPSADDR_MATCH;
-/*
- * compare two sockaddr with port, taking care specific situation:
- * one addr has 0 as port, and the other has 500 (network order), return equal
- * OUT: 0: equal.
- * 1: not equal.
- */
-int
-cmpsaddrmagic(addr1, addr2)
- const struct sockaddr *addr1;
- const struct sockaddr *addr2;
-{
- caddr_t sa1, sa2;
- u_short port1, port2;
-
- if (addr1 == 0 && addr2 == 0)
- return 0;
- if (addr1 == 0 || addr2 == 0)
- return 1;
-
-#ifdef __linux__
- if (addr1->sa_family != addr2->sa_family)
- return 1;
-#else
- if (addr1->sa_len != addr2->sa_len
- || addr1->sa_family != addr2->sa_family)
- return 1;
-
-#endif /* __linux__ */
-
- switch (addr1->sa_family) {
- case AF_UNSPEC:
- break;
- case AF_INET:
- sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
- sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
- port1 = ((struct sockaddr_in *)addr1)->sin_port;
- port2 = ((struct sockaddr_in *)addr2)->sin_port;
- plog(LLV_DEBUG, LOCATION, NULL, "cmpsaddr_magic: port1 == %d, port2 == %d\n", port1, port2);
- if (!((port1 == IPSEC_PORT_ANY && port2 == ntohs(PORT_ISAKMP)) ||
- (port2 == IPSEC_PORT_ANY && port1 == ntohs(PORT_ISAKMP)) ||
- (port1 == port2))){
- plog(LLV_DEBUG, LOCATION, NULL, "cmpsaddr_magic: ports mismatch\n");
- return 1;
- }
- plog(LLV_DEBUG, LOCATION, NULL, "cmpsaddr_magic: ports matched\n");
- if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
- return 1;
- break;
-#ifdef INET6
- case AF_INET6:
- sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
- sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
- port1 = ((struct sockaddr_in6 *)addr1)->sin6_port;
- port2 = ((struct sockaddr_in6 *)addr2)->sin6_port;
- if (!((port1 == IPSEC_PORT_ANY && port2 == PORT_ISAKMP) ||
- (port2 == IPSEC_PORT_ANY && port1 == PORT_ISAKMP) ||
- (port1 == port2)))
- return 1;
- if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
- return 1;
- if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
- ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
- return 1;
- break;
-#endif
- default:
- return 1;
- }
-
- return 0;
-}
-
-/*
- * compare two sockaddr with strict match on port.
- * OUT: 0: equal.
- * 1: not equal.
- */
-int
-cmpsaddrstrict(addr1, addr2)
- const struct sockaddr *addr1;
- const struct sockaddr *addr2;
-{
- caddr_t sa1, sa2;
- u_short port1, port2;
-
- if (addr1 == 0 && addr2 == 0)
- return 0;
- if (addr1 == 0 || addr2 == 0)
- return 1;
-
-#ifdef __linux__
- if (addr1->sa_family != addr2->sa_family)
- return 1;
-#else
- if (addr1->sa_len != addr2->sa_len
- || addr1->sa_family != addr2->sa_family)
- return 1;
-
-#endif /* __linux__ */
-
- switch (addr1->sa_family) {
- case AF_INET:
- sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
- sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
- port1 = ((struct sockaddr_in *)addr1)->sin_port;
- port2 = ((struct sockaddr_in *)addr2)->sin_port;
- if (port1 != port2)
- return 1;
- if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
- return 1;
- break;
-#ifdef INET6
- case AF_INET6:
- sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
- sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
- port1 = ((struct sockaddr_in6 *)addr1)->sin6_port;
- port2 = ((struct sockaddr_in6 *)addr2)->sin6_port;
- if (port1 != port2)
- return 1;
- if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
- return 1;
- if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
- ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
- return 1;
- break;
-#endif
- default:
- return 1;
- }
-
- return 0;
+ return CMPSADDR_WOP_MATCH;
}
/* get local address against the destination. */
@@ -1128,7 +933,7 @@
free(a2);
free(a3);
}
- if (cmpsaddrwop(&sa, &naddr->sa.sa) == 0)
+ if (cmpsaddr(&sa, &naddr->sa.sa) == 0)
return naddr->prefix + port_score;
return -1;
Index: src/crypto/dist/ipsec-tools/src/racoon/throttle.c
diff -u src/crypto/dist/ipsec-tools/src/racoon/throttle.c:1.5 src/crypto/dist/ipsec-tools/src/racoon/throttle.c:1.6
--- src/crypto/dist/ipsec-tools/src/racoon/throttle.c:1.5 Fri Jan 23 08:25:07 2009
+++ src/crypto/dist/ipsec-tools/src/racoon/throttle.c Fri Jul 3 06:41:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: throttle.c,v 1.5 2009/01/23 08:25:07 tteras Exp $ */
+/* $NetBSD: throttle.c,v 1.6 2009/07/03 06:41:47 tteras Exp $ */
/* Id: throttle.c,v 1.5 2006/04/05 20:54:50 manubsd Exp */
@@ -104,7 +104,7 @@
goto restart;
}
- if (cmpsaddrwop(addr, (struct sockaddr *)&te->host) == 0) {
+ if (cmpsaddr(addr, (struct sockaddr *) &te->host) == 0) {
found = 1;
break;
}