2007年2月28日水曜日

conntrackd の internal と external cache

include/conntrackd.h から

struct ct_sync_state {
struct cache *internal; /* internal events cache (netlink) */
struct cache *external; /* external events cache (mcast) */

internal の netlink って kernel conntrack table と同義?

IPS_ASSUREDって?

TCPの場合

struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 =
{
....
.packet = tcp_packet,

struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6 =
{
....
.packet = tcp_packet,
net/netfilter/nf_conntrack_proto_tcp.c::tcp_packet()にて

  • IPS_SEEN_REPLY が立っていて

  • IPS_ASSURED が立っていなくて

  • old_state が TCP_CONNTRACK_SYN_RECV か TCP_CONNTRACK_ESTABLISHED で new_state が TCP_CONNTRACK_ESTABLISHED

の場合 conntrack->status に IPS_ASSURED を立てる...とゆーことは IPS_SEEN_REPLY が前提。nf_conntrack_proto_tcp.c の頭の方に TCP の conntrack での状態遷移あり。機会があれば絵にしたいなぁ。

2007年2月22日木曜日

zd1211rw の Master mode

zd1211rw デバイスに対して iwconfig eth# mode Master とすると、エラー。ちょっと眺めると ioctl のリクエストコード SIOCSIWMODE については zd_mac.c:int zd_mac_set_mode() が処理。中を見ると
        switch (mode) {
case IW_MODE_AUTO:
case IW_MODE_ADHOC:
case IW_MODE_INFRA:
mac->netdev->type = ARPHRD_ETHER;
break;
case IW_MODE_MONITOR:
mac->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
break;
default:
dev_dbg_f(zd_mac_dev(mac), "wrong mode %u\n", mode);
return -EINVAL;
}
include/linux/wireless.h で定義されてる
#define IW_MODE_MASTER  3       /* Synchronisation master or Access Point */
は EINVAL 扱い。というわけで他力本願としては zd_mac.c をパッチの都度眺めるということで。

単身赴任者のネットワーク 1

仕事の都合上ウィークデイは独身貴族^H^H^H^H単身赴任という辛い状況なのです。で自宅からとアパートから、2箇所からインターネットに接続できる環境にあるので 簡単な VPN環境となっています。字ばっかの blog もなぁ。と図を書こうと dia を立ち上げたものの、上手いことイカン。

スクリプト書いて、それ実行すれば良いだけなのだけど、備忘録としてメモ。自宅の ISP IPV4 アドレスとアパートの ISP IPv4 アドレス間で IPSec の transparent モード。更に gre 掘る。何で gre にしたかとゆーと、IPv6 も使いたかったから。quagga で ospf6d 動かしたかったから。ハマッたのは MTU が違ったので、小さい方に合わせた点。いじょ。
ip link set gre1 up multicast on mtu 1388
# あ、木曜日定例の洗濯機のピーピー音が...

2007年2月21日水曜日

CIDRを class Bで。

やべっ。一週間以上経過。気にしない気にしない、一休み一休み。

VMWare の Server であれば、X動いていなくても GuestOS 走りっぱなしにできるっぽいけど UML の方が何の根拠もなく、リソース少なそうなので 2台の PC にて計 6つ GuestOS 動かしっぱなし。で bind でホスト名登録しようとしてプライベートで使っている class B を 2つの bind で管理するには CIDR, CIDR な〜んて...できるワケがない。そもそも /24 より小さなセグメント分けのためのものなので、無理矢理 CNAME でやろうとすると親の逆引き zone ファイルが 60,000以上のエントリに...

やるわけないって? やっちゃいました、無理矢理。最初スクリプト書いて 60,000 以上のエントリだったけど bind9 附属のドキュメント見たところ $GENERATE なるものが。で、こんな感じ


$ORIGIN 16.172.in-addr.arpa.
$GENERATE 1-254 $.1 CNAME $.1.foo
$GENERATE 1-254 $.2 CNAME $.2.foo
...
$GENERATE 1-254 $129 $.129.bar
$GENERATE 1-254 $130 $.130.bar


slave 側は当然 60,000 以上のエントリに。まねしないよーに...

2007年2月6日火曜日

UML の環境 その 2

udev入れたのに MACアドレス指定していなかった。で eth# が無いとエラー。 /etc/udev/rules.d/z25_persistent-net.rules を消すという姑息な手段で逃げる。ちょっと長くなるけど uml_switch の起動スクリプト。debian のものをちょこっと変更しただけ。

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/uml_switch
NAME=uml_switch
DESC="User-mode networking switch"

PIDFILE_0=/var/run/uml-utilities/$NAME.0.pid
PIDFILE_1=/var/run/uml-utilities/$NAME.1.pid
PIDFILE_2=/var/run/uml-utilities/$NAME.2.pid

test -x $DAEMON || exit 0

set -e

UML_SWITCH_USER="uml-net"

UML_SWITCH_CTL_0="/var/run/uml-utilities/switch.0"
UML_SWITCH_CTL_1="/var/run/uml-utilities/switch.1"
UML_SWITCH_CTL_2="/var/run/uml-utilities/switch.2"

OPTIONS_0="-tap tap0 -hub -unix $UML_SWITCH_CTL_0"
OPTIONS_1="-hub -unix $UML_SWITCH_CTL_1"
OPTIONS_2="-hub -unix $UML_SWITCH_CTL_2"


case "$1" in
start)
echo -n "Starting $DESC: "
if [ "x$UML_SWITCH_START" = "xfalse" ] ; then
echo " Disabled."
exit 0
else
echo -n " $NAME"
fi

for i in 0 1 2; do
eval start-stop-daemon --start --quiet --pidfile \$PIDFILE_${i} \
--make-pidfile --background --chuid \$UML_SWITCH_USER \
--exec $DAEMON -- \$OPTIONS_${i}

WAIT=5
while ! eval test -e \$UML_SWITCH_CTL_${i}; do
sleep 1
WAIT=$(($WAIT - 1))
if [ $WAIT -le 0 ]; then
eval echo "\$DAEMON never created control socket \$UML_SWITCH_CTL_${i}" >&2
exit 1
fi
done

eval chmod 777 \$UML_SWITCH_CTL_${i}
done
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
for i in 0 1 2; do
eval start-stop-daemon --stop --quiet --pidfile \$PIDFILE_${i} \
--oknodo --exec \$DAEMON
eval rm -f \$PIDFILE_${i} \$UML_SWITCH_CTL_${i}
done
echo "."
done
echo "."
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0
更に同じディレクトリに linux というバイナリがある前提の起動用

if [ -z $1 ]; then
echo "what number?" 1>&2
exit
fi

nohup ./linux \
ubda=rootfs_$1 \
ubdb=swap_$1 \
mem=64m \
eth0=daemon,26:4b:fb:b7:fb:0${1},,/var/run/uml-utilities/switch.0 \
eth1=daemon,26:4b:fb:b7:fb:1${1},,/var/run/uml-utilities/switch.1 \
eth2=daemon,26:4b:fb:b7:fb:2${1},,/var/run/uml-utilities/switch.2 \
con0=null > uml_${1}.log 2>&1 &
いや、こんなこと や dhcp の冗長とかやってみたくて...