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 <timo.te...@iki.fi>. @@ -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; }