on voit bien que la freebox lit les parametre xvid a priori en icmpv6 , a un moment on voit dans le code c la transition ip full ou prefix .
alors que l ip6 est deja cree .donc a priori deja ladresse ipv6 ne doit etre que le PD et non ffff:ffff.0
static void __ff_tun_read_params(void)
+{
+ union ff_tun_params tp;
+
+ if (!ff.tun_dev)
+ return;
+
+ if (!ff.wan_dev) {
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ memset(&tp, 0, sizeof (tp));
+
+ if (ff.tun_dev->type == ARPHRD_SIT) {
+ const struct ip_tunnel *tun = netdev_priv(ff.tun_dev);
+ const struct ip_tunnel_6rd_parm *ip6rd = &tun->ip6rd;
+
+ if (!ip6rd->prefixlen || ip6rd->prefixlen > 32) {
+ printk(KERN_DEBUG "ff: unsupported 6rd plen\n");
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ if (ff.tun_dev->mtu + sizeof (struct iphdr) >
+ ff.wan_dev->mtu) {
+ printk(KERN_DEBUG "ff: WAN mtu too "
+ "small for tunnel (%u => %u)\n",
+ ff.tun_dev->mtu, ff.wan_dev->mtu);
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ tp.sit.src = tun->parms.iph.saddr;
+ tp.sit.s6rd_prefix = ip6rd->prefix.s6_addr32[0];
+ tp.sit.s6rd_pmask = gen_netmask(ip6rd->prefixlen);
+ tp.sit.s6rd_plen = ip6rd->prefixlen;
+ __ff_tun_set_params(true, ff.tun_dev->mtu, &tp);
+ return;
+ }
+
+ if (ff.tun_dev->type == ARPHRD_TUNNEL6) {
+ const struct ip6_tnl *t = netdev_priv(ff.tun_dev);
+ const struct __ip6_tnl_parm *prm = &t->parms;
+ const struct __ip6_tnl_fmr *fmr;
+
+ if (ff.tun_dev->mtu + sizeof (struct ipv6hdr) >
+ ff.wan_dev->mtu) {
+ printk(KERN_DEBUG "ff: WAN mtu too "
+ "small for tunnel (%u => %u)\n",
+ ff.tun_dev->mtu, ff.wan_dev->mtu);
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ tp.map.src = prm->laddr;
+ tp.map.br = prm->raddr;
+
+ fmr = prm->fmrs;
+ if (!fmr) {
+ tp.map.ipv4_prefix = 0;
+ __ff_tun_set_params(true, ff.tun_dev->mtu, &tp);
+ return;
+ }
+
+ if (fmr->ip6_prefix_len < 32 ||
+ (fmr->ip6_prefix_len + 32 - fmr->ip4_prefix_len > 64)) {
+ printk(KERN_DEBUG "ff: unsupp MAP-E: eabits "
+ "span 32 bits\n");
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ if (fmr->offset) {
+ printk(KERN_DEBUG "ff: unsupp MAP-E: non zero "
+ "PSID offset\n");
+ __ff_tun_set_params(false, 0, NULL);
+ return;
+ }
+
+ tp.map.ipv4_prefix = fmr->ip4_prefix.s_addr;
+ tp.map.ipv4_pmask = gen_netmask(fmr->ip4_prefix_len);
+ tp.map.ipv4_plen = fmr->ip4_prefix_len;
+ tp.map.ipv6_plen = fmr->ip6_prefix_len;
+ memcpy(&tp.map.ipv6_prefix, &fmr->ip6_prefix, 8);
+
+ tp.map.ea_addr_mask = ~gen_netmask(fmr->ip4_prefix_len);
+ if (fmr->ea_len <= 32 - fmr->ip4_prefix_len) {
+ /* v4 prefix or full IP */
+ u32 addr_bits;
+
+ addr_bits = fmr->ip4_prefix_len + fmr->ea_len;
+ if (addr_bits != 32)
+ tp.map.ea_addr_mask &= gen_netmask(addr_bits);
+ tp.map.psid_len = 0;
+ } else {
+ u8 psid_len;
+
+ psid_len = fmr->ea_len - (32 - fmr->ip4_prefix_len);
+ tp.map.psid_len = psid_len;
+ tp.map.ea_port_mask = gen_netmask(psid_len);
+ }
+
+ tp.map.ea_lshift = 32 - (fmr->ip6_prefix_len - 32) -
+ fmr->ea_len;
+
+ __ff_tun_set_params(true, ff.tun_dev->mtu, &tp);
+ return;
+ }
+}
IF = SI
IF = condtion NOK = ELSE
THEN = instruction IF