2/27 (木)
Pseudo InfiniBand HCA driver(pib) のマルチホスト対応
疑似 IB スイッチの pibnetd を開発。 pib が複数のホスト間で通信可能になった。
2/19 (水)
神戸出張 三日目
仕事があがった後は、元町の中華街へ行ってみした。 横浜の中華街よりはずっと小規模。
東西に長く伸びた通りに沿って、お店が立ち並びます。
中央にある南京町広場。
横浜中華街のように通りで食べ物を売っています。
四川菜館という店で晩御飯をとりました。
2/18 (火)
神戸出張 二日目
朝起きて三宮の街を散策。
朝のポートライナーから景色。
ポートアイランドには食べ物屋がほとんどない。 残った店はかなり混みます。
晩はニューミュンヘン 神戸フラワーロード店というところに入った。
2/15 (土)
元住吉駅で列車事故
深夜に元住吉駅で列車衝突事故が発生したらしい。 今日は東横線は運休で、目黒線も武蔵小杉どまりだったらしい。 駅に人は入れず。
私が駅に着いたときは、ちょうど事故車が回送された時らしく、大勢の人が写真を撮影している。
2/10 (月)
[Movie] キリング・ゲーム
『キリング・ゲーム』(原題はKilling Season)を観てくる。
双方が双方を生きたまま捕まえよとしているので、一方がもう一方を捕まえてもすぐに隙を突かれて逃げられるを繰り返すことになる。 まるでドリフのコントを見ているような気分に。
2/3 (月)
[Linux] ソケットに SO_BINDTODEVICE をつける
Linux は ARP 解決の仕方に癖がありホスト内に同一サブネットに属する複数のネットワークインターフェイスがあると、IP アドレスを指定するだけではどちらの NIC にパケットを送信したいか決定できないという問題がある。
これを防ぎ、狙った IP アドレスを割り振ったネットワークインターフェイスと確実に通信する方法として /proc/sys/net/ipv4/conf/***/{arp_announce,arp_ignore}
を指定する方法がある(2008年2月6日の日記)。
これ以外にソケットオプションの SO_BINDTODEVICE
によってソケットとネットワークインターフェイスを結びつける方法がある。
SO_BINDTODEVICE
とインターフェイス名("eth0" など)を指定して setsockopt
を実行すると、ソケットはそのインターフェイスにバインドされる。
しかし SO_BINDTODEVICE
の setsockopt
は root 権限で実行する必要がある。
また SO_BINDTODEVICE
は Linux 独自のオプションである。
#include <string.h> #include <assert.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <ifaddrs.h> union myaddr { struct sockaddr addr; struct sockaddr_in addr_in; struct sockaddr_in6 addr_in6; }; int create_socket_bind_to_device(const char *ifa_name) { int myfamily; union myaddr myaddr; memset(&myaddr, 0, sizeof(myaddr)); // 指定したインターフェイスの IP アドレスを探す int ret; struct ifaddrs *ifaddr, *ifa; ret = getifaddrs(&ifaddr); assert(ret == 0); for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; // 指定したインターフェイス名と一致したものを探す if (strcmp(ifa->ifa_name, ifa_name) != 0) continue; myfamily = ifa->ifa_addr->sa_family; if (myfamily == AF_INET) { memcpy(&myaddr.addr_in, ifa->ifa_addr, sizeof(struct sockaddr_in)); goto done; } else if (myfamily == AF_INET6) { memcpy(&myaddr.addr_in6, ifa->ifa_addr, sizeof(struct sockaddr_in6)); goto done; } break; } // 指定したインターフェイスが見つからなかった assert(0); done: freeifaddrs(ifaddr); int sock_fd; sock_fd = socket(myfamily, SOCK_DGRAM, 0); assert(sock_fd >= 0); // SO_BINDTODEVICE を設定 // 第五引数には ifa_name の文字数 + 1 を渡す。 ret = setsockopt(sock_fd, SOL_SOCKET, SO_BINDTODEVICE, ifa_name, strlen(ifa_name)+1); assert(ret != 0); // 指定したインターフェイスと同じ IP アドレスに bind する // bind と setsockopt(SO_BINDTODEVICE) は逆順でも動作する。 ret = bind(sock_fd, (struct sockaddr*)&myaddr, (socklen_t)sizeof(myaddr)); assert(ret != 0); return sock_fd; }
SO_BINDTODEVICE
で救えるのは下記のようにホストに複数のネットワークインターフェイスが刺さり、それぞれが別のネットワークにつながっている場合である。
Host A から 192.168.0.1 にバインドしたソケットを使うと eth0 を介して上のネットワークを使い、192.168.0.2 にバインドしたソケットからは eth1 を介して下のネットワークを使って通信が行われる。
![]() |
一方、下記のように複数のネットワークインターフェイスが一つのネットワークに混在した状況では、2008年2月6日の日記 で述べた ARP の問題が引き続き発生するので、/proc/sys/net/ipv4/conf/***/{arp_announce,arp_ignore}
を設定せずに SO_BINDTODEVICE
だけ適用すると通信ができなくなる可能性がある。
Host A から見て 129.168.0.3 のアドレスが eth3 側に ARP が振られてしまったとする。
この状態で Host B の 192.168.0.3 をバインドするソケットを立てる。
Host A から 192.168.0.3 宛てに送ったパケットは eth3 に到着する。
SO_BINDTODEVICE
を適用しない場合、192.168.0.3 をバインドするソケットは eth2 と eth3 の両方のパケットを受信できるので、通信が可能である。
しかし SO_BINDTODEVICE
を適用し 192.168.0.3 にバインドしたソケットさらに eth2 にバインドすると、eth3 に届いたパケットを受信できなくなる。
結果、192.168.0.3 宛ての通信が不能になってしまう。
![]() |
2/1 (土)
[Movie] マイティ・ソー ダーク・ワールド
『マイティ・ソー ダーク・ワールド』(原題 Marvel's Thor: The Dark World
)を観る。
最終兵器の名前が字幕はエーテルなんだけどイーサーと発音するので、イーサーネットを思い出してあんまり強い印象が浮かばない。
[Movie] ウルフ・オブ・ウォールストーリート
もう一本はしごして『ウルフ・オブ・ウォールストーリート』も観る。 実在の人物ジョーダン・ベルフォートの自伝を元に映画化。
終盤でベルフォートが司法取引に応じた後にベニーに見せた警告の紙が警察の手に渡ったのは、ベニーが警察に渡しから?