Date: Wed, 14 Dec 2011 02:07:07 +0900 From: Hajimu UMEMOTO <ume@mahoroba.org> To: "Daniel O'Connor" <doconnor@gsoft.com.au> Cc: freebsd-net@freebsd.org Subject: Re: FreeBSD 8 as an IPv6 router Message-ID: <yge39co5rk4.wl%ume@mahoroba.org> In-Reply-To: <58FFF22D-6578-447D-AAC0-9673057DAD84@gsoft.com.au> References: <2CECE1B6-98B6-4219-BDD7-220F83CAEC36@gsoft.com.au> <ygeaa6w25vy.wl%ume@mahoroba.org> <4F9821A6-673B-4DE6-A543-5F37BDD3F9B7@gsoft.com.au> <yge8vmg259x.wl%ume@mahoroba.org> <58FFF22D-6578-447D-AAC0-9673057DAD84@gsoft.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi,
>>>>> On Tue, 13 Dec 2011 20:11:45 +1030
>>>>> "Daniel O'Connor" <doconnor@gsoft.com.au> said:
doconnor> On 13/12/2011, at 19:54, Hajimu UMEMOTO wrote:
> doconnor> Is there a way to tweak it to do the right thing?
>
> Perhaps, sla-len should be 8.
doconnor> Ahh many thanks, that seems work work.
You are welcome.
doconnor> Such are the risk when you copy things off the internet :)
Yes, the sla-len depends on the prefixlen of the delegated prefix, and
the length depends on your ISP.
The DHCPv6 server announces the prefixlen, and the dhcp6c can know it.
However, the dhcp6c doesn't assume that the prefixlen of the
prefix-interface is 64. So, you still need to specify an appropriate
sla-len value. It seems inconvenient to me. So, I applied the
attached patch to calculate the sla-len automatically with the
assumption that the prefix-interface is 64, personally.
Sincerely,
[-- Attachment #2 --]
Index: config.c
diff -u -p config.c.orig config.c
--- config.c.orig Sat Sep 2 17:03:33 2006
+++ config.c Thu Oct 12 11:27:39 2006
@@ -470,7 +502,7 @@ add_pd_pif(iapdc, cfl0)
}
pif->ifid_len = IFID_LEN_DEFAULT;
- pif->sla_len = SLA_LEN_DEFAULT;
+ pif->sla_len = -1;
if (get_default_ifid(pif)) {
dprintf(LOG_NOTICE, FNAME,
"failed to get default IF ID for %s", pif->ifname);
@@ -483,13 +515,13 @@ add_pd_pif(iapdc, cfl0)
pif->sla_id = (u_int32_t)cfl->num;
break;
case IFPARAM_SLA_LEN:
- pif->sla_len = (int)cfl->num;
- if (pif->sla_len < 0 || pif->sla_len > 128) {
+ if ((int)cfl->num < 0 || (int)cfl->num > 128) {
dprintf(LOG_ERR, FNAME, "%s:%d "
"invalid SLA length: %d",
- configfilename, cfl->line, pif->sla_len);
+ configfilename, cfl->line, (int)cfl->num);
goto bad;
}
+ pif->sla_len = (int)cfl->num;
break;
default:
dprintf(LOG_ERR, FNAME, "%s:%d internal error: "
Index: config.h
diff -u config.h.orig config.h
--- config.h.orig Sun Jul 30 19:24:19 2006
+++ config.h Thu Oct 12 11:34:15 2006
@@ -174,7 +174,6 @@
char ifid[16]; /* Interface ID, up to 128bits */
};
#define IFID_LEN_DEFAULT 64
-#define SLA_LEN_DEFAULT 16
typedef enum { IATYPE_PD, IATYPE_NA } iatype_t;
struct ia_conf {
Index: dhcp6c.conf.5
diff -u dhcp6c.conf.5.orig dhcp6c.conf.5
--- dhcp6c.conf.5.orig Sun Jul 30 19:24:19 2006
+++ dhcp6c.conf.5 Wed Oct 11 14:48:16 2006
@@ -435,7 +458,7 @@
.Ar length
must be a decimal number between 0 and 128.
If the length is not specified by this statement,
-the default value 16 will be used.
+the value will be determined automatically.
.El
.El
.\"
Index: prefixconf.c
diff -u -p prefixconf.c.orig prefixconf.c
--- prefixconf.c.orig Mon Aug 7 13:35:32 2006
+++ prefixconf.c Wed Oct 11 14:48:16 2006
@@ -435,7 +459,7 @@ add_ifprefix(siteprefix, prefix, pconf)
struct in6_addr *a;
u_long sla_id;
char *sp;
- int b, i;
+ int b, i, sla_len;
if ((ifpfx = malloc(sizeof(*ifpfx))) == NULL) {
dprintf(LOG_NOTICE, FNAME,
@@ -451,7 +475,11 @@ add_ifprefix(siteprefix, prefix, pconf)
ifpfx->paddr.sin6_len = sizeof(struct sockaddr_in6);
#endif
ifpfx->paddr.sin6_addr = prefix->addr;
- ifpfx->plen = prefix->plen + pconf->sla_len;
+ if (pconf->sla_len >= 0)
+ sla_len = pconf->sla_len;
+ else
+ sla_len = 128 - pconf->ifid_len - prefix->plen;
+ ifpfx->plen = prefix->plen + sla_len;
/*
* XXX: our current implementation assumes ifid len is a multiple of 8
*/
@@ -464,7 +492,7 @@ add_ifprefix(siteprefix, prefix, pconf)
ifpfx->plen + pconf->ifid_len > 128) {
dprintf(LOG_INFO, FNAME,
"invalid prefix length %d + %d + %d",
- prefix->plen, pconf->sla_len, pconf->ifid_len);
+ prefix->plen, sla_len, pconf->ifid_len);
goto bad;
}
@@ -476,7 +504,7 @@ add_ifprefix(siteprefix, prefix, pconf)
sla_id = htonl(pconf->sla_id);
sp = ((char *)&sla_id + 3);
i = (128 - pconf->ifid_len) / 8;
- for (b = pconf->sla_len; b > 7; b -= 8, sp--)
+ for (b = sla_len; b > 7; b -= 8, sp--)
a->s6_addr[--i] = *sp;
if (b)
a->s6_addr[--i] |= *sp;
[-- Attachment #3 --]
--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@mahoroba.org ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?yge39co5rk4.wl%ume>
