Hallo,

der Patch wurde von Horst Laschinsky (Uni Erlangen) erstellt und kann auf die netbsd-current version angewendet werden. Er modifiziert nur die Datei if_tun.c des netbsd kernels. Leider haben sich die netbsd Entwickler noch nicht erweichen lassen den patch in die offiziellen sourcen einzubauen. ein tap device fuer netbsd gibt es nicht.

Hier in Leipzig arbeiten wir bei unserem tunnelbroker nicht mit Zertifikaten sondern mit PSK. Hat zufaellig jemand eine config/howto wo beschrieben wird wir man mit bsd/racoon eine IPsec Einwahl fuer road warrior konfiguriert? geht das ueberhaupt oder brauch ich zwingend zertifikate? ich hab bisher leider nur beispiele fuer freeswan/openswan gefunden die sowas machen.

cu
Uwe


###################### hier endlich der patch ########################

--- if_tun/if_tun.c     2004-10-28 18:27:36.000000000 +0100
+++ if_tun_new/if_tun.c 2004-10-28 18:27:18.000000000 +0100
@@ -54,6 +54,11 @@
 #include <netinet/if_inarp.h>
 #endif

+#ifdef INET6
+#include <netinet/ip6.h>
+#include <netinet6/in6_var.h>
+#endif
+
 #ifdef NS
 #include <netns/ns.h>
 #include <netns/ns_if.h>
@@ -211,7 +216,7 @@
 #ifdef ALTQ
        ifp->if_start = tunstart;
 #endif
-       ifp->if_flags = IFF_POINTOPOINT;
+       ifp->if_flags = IFF_POINTOPOINT|IFF_MULTICAST;
        ifp->if_type = IFT_TUNNEL;
        ifp->if_snd.ifq_maxlen = ifqmaxlen;
        ifp->if_collisions = 0;
@@ -369,6 +374,14 @@
                                                        : 0);
                                }
 #endif
+#ifdef INET6
+                               if (ifa->ifa_addr->sa_family == AF_INET6) {
+                                       rtinit(ifa, (int)RTM_DELETE,
+                                                       tp->tun_flags & 
TUN_DSTADDR
+                                                       ? RTF_HOST
+                                                       : 0);
+                               }
+#endif
                        }
                }
        }
@@ -413,6 +426,21 @@
                        }
                }
 #endif
+#ifdef INET6
+               if (ifa->ifa_addr->sa_family == AF_INET6) {
+                       struct sockaddr_in6 *sin6;
+
+                       sin6 = satosin6(ifa->ifa_addr);
+                       if (sin6 && !IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
+                               tp->tun_flags |= TUN_IASET;
+
+                       if (ifp->if_flags & IFF_POINTOPOINT) {
+                               sin6 = satosin6(ifa->ifa_dstaddr);
+                               if (sin6 && 
!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
+                                       tp->tun_flags |= TUN_DSTADDR;
+                       }
+               }
+#endif
        }

        return;
@@ -463,6 +491,9 @@
                        break;
                }
                switch (ifr->ifr_addr.sa_family) {
+#ifdef INET6
+               case AF_INET6:
+#endif
 #ifdef INET
                case AF_INET:
                        break;
@@ -526,6 +557,9 @@
 #endif

        switch(dst->sa_family) {
+#ifdef INET6
+       case AF_INET6:
+#endif
 #ifdef INET
        case AF_INET:
                if (tp->tun_flags & TUN_PREPADDR) {
@@ -613,7 +647,7 @@
                                goto out;
                        }
                        tp->tun_if.if_flags &=
-                               ~(IFF_BROADCAST|IFF_POINTOPOINT|IFF_MULTICAST);
+                               ~(IFF_BROADCAST|IFF_POINTOPOINT);
                        tp->tun_if.if_flags |= *(int *)data;
                        break;
                default:
@@ -778,10 +812,12 @@
 {
        struct tun_softc *tp;
        struct ifnet    *ifp;
-       struct mbuf     *top, **mp, *m;
+       struct mbuf     *top, **mp, *m, *auxbuf;
        struct ifqueue  *ifq;
        struct sockaddr dst;
        int             isr, error = 0, s, tlen, mlen;
+       caddr_t         packetdata;
+       char            ipversion=0;

        s = splnet();
        tp = tun_find_unit(dev);
@@ -815,10 +851,6 @@
                                        goto out0;
                                }
                }
-       } else {
-#ifdef INET
-               dst.sa_family = AF_INET;
-#endif
        }

        if (uio->uio_resid > TUNMTU) {
@@ -828,18 +860,6 @@
                goto out0;
        }

-       switch (dst.sa_family) {
-#ifdef INET
-       case AF_INET:
-               ifq = &ipintrq;
-               isr = NETISR_IP;
-               break;
-#endif
-       default:
-               error = EAFNOSUPPORT;
-               goto out0;
-       }
-
        tlen = uio->uio_resid;

        /* get a header mbuf */
@@ -850,6 +870,7 @@
        }
        mlen = MHLEN;

+       auxbuf = m;
        top = NULL;
        mp = &top;
        while (error == 0 && uio->uio_resid > 0) {
@@ -866,6 +887,33 @@
                        mlen = MLEN;
                }
        }
+
+       packetdata=mtod (auxbuf, caddr_t);
+       ipversion=*(packetdata)>>4;
+
+       switch(ipversion) {
+#ifdef INET
+       case 4:
+               dst.sa_family = AF_INET;
+               ifq = &ipintrq;
+               isr = NETISR_IP;
+               break;
+#endif
+#ifdef INET6
+       case 6:
+               dst.sa_family = AF_INET6;
+               ifq = &ip6intrq;
+               isr = NETISR_IPV6;
+               break;
+#endif
+       default:
+               if(top)
+                       m_freem(top);
+               simple_unlock(&tp->tun_lock);
+               error=EAFNOSUPPORT;
+               goto out0;
+       }
+
        if (error) {
                if (top != NULL)
                        m_freem (top);
@@ -878,7 +926,7 @@

 #if NBPFILTER > 0
        if (ifp->if_bpf)
-               bpf_mtap_af(ifp->if_bpf, AF_INET, top);
+               bpf_mtap_af(ifp->if_bpf, dst.sa_family, top);
 #endif

        s = splnet();

_______________________________________________
ipv6 mailing list
[email protected]
http://listserv.uni-muenster.de/mailman/listinfo/ipv6

Antwort per Email an