Hello.

I'll take care of this.

Regards,

--yoshfuji

In article <[EMAIL PROTECTED]> (at Tue, 20 Nov 2007 09:36:26 -0800), "Templin, 
Fred L" <[EMAIL PROTECTED]> says:

> From: Fred L. Templin <[EMAIL PROTECTED]>
> 
> This patch includes support for the Intra-Site Automatic Tunnel
> Addressing Protocol (ISATAP) per RFC4214. It uses the SIT
> module, and is configured using extensions to the "iproute2"
> utility. The diffs are specific to the Linux 2.6.24-rc2 kernel
> distribution.
> 
> This version reflects changes based on netdev list discussions
> on 11/14/07 thru 11/15/07. It does away with in-the-kernel RS/RA
> pinging and now asks that the task be performed by an application.
> The application will essentially entail a port of the FreeBSD 'rtsold'
> daemon, and will use the standard socket API.
> 
> Signed-off-by: Fred L. Templin <[EMAIL PROTECTED]>
> 
> ---
> 
> --- linux-2.6.24-rc2/include/linux/if_tunnel.h.orig   2007-11-19 
> 03:54:12.000000000 -0800
> +++ linux-2.6.24-rc2/include/linux/if_tunnel.h        2007-11-19 
> 03:55:58.000000000 -0800
> @@ -17,6 +17,9 @@
>  #define GRE_FLAGS    __constant_htons(0x00F8)
>  #define GRE_VERSION  __constant_htons(0x0007)
>  
> +/* i_flags values for SIT mode */
> +#define      SIT_ISATAP      0x0001
> +
>  struct ip_tunnel_parm
>  {
>       char                    name[IFNAMSIZ];
> --- linux-2.6.24-rc2/include/linux/in.h.orig  2007-11-09 08:00:32.000000000 
> -0800
> +++ linux-2.6.24-rc2/include/linux/in.h       2007-11-12 07:37:05.000000000 
> -0800
> @@ -253,6 +253,14 @@ struct sockaddr_in {
>  #define ZERONET(x)   (((x) & htonl(0xff000000)) == htonl(0x00000000))
>  #define LOCAL_MCAST(x)       (((x) & htonl(0xFFFFFF00)) == htonl(0xE0000000))
>  
> +/* Special-Use IPv4 Addresses (RFC3330) */
> +#define PRIVATE_10(x)        (((x) & htonl(0xff000000)) == htonl(0x0A000000))
> +#define LINKLOCAL_169(x) (((x) & htonl(0xffff0000)) == htonl(0xA9FE0000))
> +#define PRIVATE_172(x)       (((x) & htonl(0xfff00000)) == htonl(0xAC100000))
> +#define TEST_192(x)  (((x) & htonl(0xffffff00)) == htonl(0xC0000200))
> +#define ANYCAST_6TO4(x)      (((x) & htonl(0xffffff00)) == htonl(0xC0586300))
> +#define PRIVATE_192(x)       (((x) & htonl(0xffff0000)) == htonl(0xC0A80000))
> +#define TEST_198(x)  (((x) & htonl(0xfffe0000)) == htonl(0xC6120000))
>  #endif
>  
>  #endif       /* _LINUX_IN_H */
> --- linux-2.6.24-rc2/include/net/addrconf.h.orig      2007-11-08 
> 12:06:17.000000000 -0800
> +++ linux-2.6.24-rc2/include/net/addrconf.h   2007-11-19 05:47:48.000000000 
> -0800
> @@ -17,6 +17,7 @@
>  
>  #define IPV6_MAX_ADDRESSES           16
>  
> +#include <linux/in.h>
>  #include <linux/in6.h>
>  
>  struct prefix_info {
> @@ -241,6 +242,24 @@ static inline int ipv6_addr_is_ll_all_ro
>               addr->s6_addr32[3] == htonl(0x00000002));
>  }
>  
> +static inline int ipv6_isatap_eui64(u8 *eui, __be32 addr)
> +{
> +     eui[0] = (ZERONET(addr) || PRIVATE_10(addr) || LOOPBACK(addr) ||
> +               LINKLOCAL_169(addr) || PRIVATE_172(addr) || TEST_192(addr) ||
> +               ANYCAST_6TO4(addr) || PRIVATE_192(addr) || TEST_198(addr) ||
> +               MULTICAST(addr) || BADCLASS(addr)) ? 0x00 : 0x02;
> +     eui[1] = 0;
> +     eui[2] = 0x5E;
> +     eui[3] = 0xFE;
> +     memcpy (eui+4, &addr, 4);
> +     return 0;
> +}
> +
> +static inline int ipv6_addr_is_isatap(const struct in6_addr *addr)
> +{
> +     return ((addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE));
> +}
> +
>  #ifdef CONFIG_PROC_FS
>  extern int if6_proc_init(void);
>  extern void if6_proc_exit(void);
> --- linux-2.6.24-rc2/net/ipv6/addrconf.c.orig 2007-11-19 03:43:06.000000000 
> -0800
> +++ linux-2.6.24-rc2/net/ipv6/addrconf.c      2007-11-19 13:29:36.000000000 
> -0800
> @@ -379,6 +379,13 @@ static struct inet6_dev * ipv6_add_dev(s
>                      "%s: Disabled Privacy Extensions\n",
>                      dev->name);
>               ndev->cnf.use_tempaddr = -1;
> +
> +             if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
> +                     printk(KERN_INFO
> +                            "%s: Disabled Multicast RS\n",
> +                            dev->name);
> +                     ndev->cnf.rtr_solicits = 0;
> +             }
>       } else {
>               in6_dev_hold(ndev);
>               ipv6_regen_rndid((unsigned long) ndev);
> @@ -1435,6 +1442,9 @@ static int ipv6_generate_eui64(u8 *eui, 
>               return addrconf_ifid_arcnet(eui, dev);
>       case ARPHRD_INFINIBAND:
>               return addrconf_ifid_infiniband(eui, dev);
> +     case ARPHRD_SIT:
> +             if (dev->priv_flags & IFF_ISATAP)
> +                     return ipv6_isatap_eui64(eui, *(__be32 *)dev->dev_addr);
>       }
>       return -1;
>  }
> @@ -1470,7 +1480,7 @@ regen:
>        *
>        *  - Reserved subnet anycast (RFC 2526)
>        *      11111101 11....11 1xxxxxxx
> -      *  - ISATAP (draft-ietf-ngtrans-isatap-13.txt) 5.1
> +      *  - ISATAP (RFC4214) 6.1
>        *      00-00-5E-FE-xx-xx-xx-xx
>        *  - value 0
>        *  - XXX: already assigned to an address on the device
> @@ -2201,6 +2211,16 @@ static void addrconf_sit_config(struct n
>               return;
>       }
>  
> +     if (dev->priv_flags & IFF_ISATAP) {
> +             struct in6_addr addr;
> +
> +             ipv6_addr_set(&addr,  htonl(0xFE800000), 0, 0, 0);
> +             addrconf_prefix_route(&addr, 64, dev, 0, 0);
> +             if (!ipv6_generate_eui64(addr.s6_addr + 8, dev))
> +                     addrconf_add_linklocal(idev, &addr);
> +             return;
> +     }
> +
>       sit_add_v4_addrs(idev);
>  
>       if (dev->flags&IFF_POINTOPOINT) {
> --- linux-2.6.24-rc2/net/ipv6/route.c.orig    2007-11-19 15:26:30.000000000 
> -0800
> +++ linux-2.6.24-rc2/net/ipv6/route.c 2007-11-19 16:06:00.000000000 -0800
> @@ -1668,6 +1668,8 @@ struct rt6_info *rt6_get_dflt_router(str
>       return rt;
>  }
>  
> +EXPORT_SYMBOL(rt6_get_dflt_router);
> +
>  struct rt6_info *rt6_add_dflt_router(struct in6_addr *gwaddr,
>                                    struct net_device *dev,
>                                    unsigned int pref)
> --- linux-2.6.24-rc2/net/ipv6/sit.c.orig      2007-11-08 12:03:41.000000000 
> -0800
> +++ linux-2.6.24-rc2/net/ipv6/sit.c   2007-11-19 16:15:01.000000000 -0800
> @@ -16,6 +16,7 @@
>   *   Changes:
>   * Roger Venning <[EMAIL PROTECTED]>:        6to4 support
>   * Nate Thompson <[EMAIL PROTECTED]>:                6to4 support
> + * Fred L. Templin <[EMAIL PROTECTED]>:              isatap support
>   */
>  
>  #include <linux/module.h>
> @@ -182,6 +183,9 @@ static struct ip_tunnel * ipip6_tunnel_l
>       dev->init = ipip6_tunnel_init;
>       nt->parms = *parms;
>  
> +     if (parms->i_flags & SIT_ISATAP)
> +             dev->priv_flags |= IFF_ISATAP;
> +
>       if (register_netdevice(dev) < 0) {
>               free_netdev(dev);
>               goto failed;
> @@ -364,6 +368,48 @@ static inline void ipip6_ecn_decapsulate
>               IP6_ECN_set_ce(ipv6_hdr(skb));
>  }
>  
> +/* ISATAP (RFC4214) - check source address */
> +static int
> +isatap_srcok(struct sk_buff *skb, struct iphdr *iph, struct net_device *dev)
> +{
> +     struct neighbour *neigh;
> +     struct dst_entry *dst;
> +     struct rt6_info *rt;
> +     struct flowi fl;
> +     struct in6_addr *addr6;
> +     struct in6_addr rtr;
> +     struct ipv6hdr *iph6;
> +     int ok = 0;
> +
> +     /* from onlink default router */
> +     ipv6_addr_set(&rtr,  htonl(0xFE800000), 0, 0, 0);
> +     ipv6_isatap_eui64(rtr.s6_addr + 8, iph->saddr);
> +     if ((rt = rt6_get_dflt_router(&rtr, dev))) {
> +             dst_release(&rt->u.dst);
> +             return 1;
> +     }
> +
> +     iph6 = ipv6_hdr(skb);
> +     memset(&fl, 0, sizeof(fl));
> +     fl.proto = iph6->nexthdr;
> +     ipv6_addr_copy(&fl.fl6_dst, &iph6->saddr);
> +     fl.oif = dev->ifindex;
> +     security_skb_classify_flow(skb, &fl);
> +
> +     dst = ip6_route_output(NULL, &fl);
> +     if (!dst->error && (dst->dev == dev) && (neigh = dst->neighbour)) {
> +
> +             addr6 = (struct in6_addr*)&neigh->primary_key;
> +
> +             /* from correct previous hop */
> +             if (ipv6_addr_is_isatap(addr6) &&
> +                 (addr6->s6_addr32[3] == iph->saddr))
> +                     ok = 1;
> +     }
> +     dst_release(dst);
> +     return ok;
> +}
> +
>  static int ipip6_rcv(struct sk_buff *skb)
>  {
>       struct iphdr *iph;
> @@ -382,6 +428,14 @@ static int ipip6_rcv(struct sk_buff *skb
>               IPCB(skb)->flags = 0;
>               skb->protocol = htons(ETH_P_IPV6);
>               skb->pkt_type = PACKET_HOST;
> +
> +             if ((tunnel->dev->priv_flags & IFF_ISATAP) &&
> +                 !isatap_srcok(skb, iph, tunnel->dev)) {
> +                     tunnel->stat.rx_errors++;
> +                     read_unlock(&ipip6_lock);
> +                     kfree_skb(skb);
> +                     return 0;
> +             }
>               tunnel->stat.rx_packets++;
>               tunnel->stat.rx_bytes += skb->len;
>               skb->dev = tunnel->dev;
> @@ -444,6 +498,29 @@ static int ipip6_tunnel_xmit(struct sk_b
>       if (skb->protocol != htons(ETH_P_IPV6))
>               goto tx_error;
>  
> +     /* ISATAP (RFC4214) - must come before 6to4 */
> +     if (dev->priv_flags & IFF_ISATAP) {
> +             struct neighbour *neigh = NULL;
> +
> +             if (skb->dst)
> +                     neigh = skb->dst->neighbour;
> +
> +             if (neigh == NULL) {
> +                     if (net_ratelimit())
> +                             printk(KERN_DEBUG "sit: nexthop == NULL\n");
> +                     goto tx_error;
> +             }
> +
> +             addr6 = (struct in6_addr*)&neigh->primary_key;
> +             addr_type = ipv6_addr_type(addr6);
> +
> +             if ((addr_type & IPV6_ADDR_UNICAST) &&
> +                  ipv6_addr_is_isatap(addr6))
> +                     dst = addr6->s6_addr32[3];
> +             else
> +                     goto tx_error;
> +     }
> +
>       if (!dst)
>               dst = try_6to4(&iph6->daddr);
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to