(備忘録)FreeBSDでIPv6 over UDP/IPv4 Tunnelを構築する

私の自宅では、DTCP Serverが立ち上がっているんだけど、今年の年明けにサーバーのOSをアップグレードして以来、IPv6 over UDP/IPv4 Tunnelが使えなくなってしまったので、調べていたら思い出したので備忘録。

現象としては、DTCP Serverは認証OKでDTCP ClientにIPv6アドレスを通知し、ng* I/Fが作られるんだけど、そこでトンネルが張られなくて、ng* I/Fが無限に増殖して、しまいにカーネルハングアップするという状態だった。dtcps とか、各種portsをアップデートしても改善されないので、これは何かあるな? と思い、困った時はumeさんのページを調べる(^^; あった。/usr/src/sys/netgraph/ng_ksocket.c にパッチを当てるんだったー。

って事で、FreeBSD 7.2-RC1用のng_ksocket.cのパッチを掲載。まぁ、umeさんのページのパッチも、オフセットが出るけど当たると思うんで、掲載する必要がないかもしれないけど、とりあえず差分掲載。次はXCAST6のパッチを当てないと…。
(って、XCAST6は最近動きがないけど、どうなってるんだろう?)

--- ng_ksocket.c.original 2009-04-15 12:14:26.000000000 +0900
+++ ng_ksocket.c 2009-04-18 21:40:19.000000000 +0900
@@ -88,6 +88,8 @@
u_int32_t flags;
u_int32_t response_token;
ng_ID_t response_addr;
+ struct sockaddr_in peer;
+ int have_peer;
};
typedef struct ng_ksocket_private *priv_p;

@@ -756,6 +758,14 @@
if (so == NULL)
ERROUT(ENXIO);

+ if (sa->sa_family == AF_INET &&
+ ((struct sockaddr_in *)sa)->sin_port == 0) {
+ bcopy(sa, &priv->peer,
+ sizeof(struct sockaddr_in));
+ priv->have_peer = TRUE;
+ break;
+ }
+
/* Do connect */
if ((so->so_state & SS_ISCONNECTING) != 0)
ERROUT(EALREADY);
@@ -919,6 +929,9 @@
NG_KSOCKET_TAG_SOCKADDR, NULL)) != NULL) &&
(stag->id == NG_NODE_ID(node) || stag->id == 0))
sa = &stag->sa;
+ else if (priv->have_peer && priv->peer.sin_port != 0)
+ sa = (struct sockaddr *)&priv->peer;
+

/* Reset specific mbuf flags to prevent addressing problems. */
m->m_flags &= ~(M_BCAST|M_MCAST);
@@ -1109,6 +1122,19 @@
break;
}

+ if (priv->have_peer) {
+ if (sa->sa_family != AF_INET ||
+ ((struct sockaddr_in *)sa)->sin_addr.s_addr !=
+ priv->peer.sin_addr.s_addr) {
+ FREE(sa, M_SONAME);
+ m_freem(m);
+ splx(s);
+ return;
+ }
+ priv->peer.sin_port =
+ ((struct sockaddr_in *)sa)->sin_port;
+ }
+
/*
* Don't trust the various socket layers to get the
* packet header and length correct (e.g. kern/15175).

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント