ちょっとソースを眺めてみました。
スイッチングハブがアドレスを覚えるタイミング
http://d.hatena.ne.jp/syasuda/20081204/1228403297
スイッチングハブのブリッジ機能は、『送られてくるパケットのMACアドレス情報』つまりパケットの送出元のアドレスを覚えるということのようです。
↑↑↑これをLinuxのブリッジについて追いかけます。
# 市販のスイッチングハブのブリッジ機能がLinuxかどうかは知りませんがね。
まず、Linuxブリッジの使い方です。
Bridging mini-Howto
http://www.linux.or.jp/JF/JFdocs/Bridge.html
ソースは、net/bridgeあたりです。
デバイスでパケットが受信されると、br_handle_frame() @ br_input.cが呼ばれるようです。一連の処理の中でbr_fdb_update() @ br_bfd.cが何かのキャッシュになっていることがわかります。
このキャッシュはfdb(Forwarding database)でbr_fdb.cで処理が記述されており、エントリの構造体はbr_private.hで定義されています。
struct net_bridge_fdb_entry
{
struct hlist_node hlist;
struct net_bridge_port *dst;struct rcu_head rcu;
atomic_t use_count;
unsigned long ageing_timer;
mac_addr addr;
unsigned char is_local;
unsigned char is_static;
};
これが、net_bridgeのhash[BR_HASH_SIZE]メンバに放り込まれるようです。ハッシュになってますな。ハッシュのサイズは256と読めます。@ br_private.h
#define BR_HASH_BITS 8
#define BR_HASH_SIZE (1 << BR_HASH_BITS)
でageing_timerでもってエントリの有効期限が決まり、これのデフォルト値は、
br->ageing_time = 300 * HZ;
つまり5分と読めます。@ br_if.c この5分という値についてはコメントでも書いてあります。ただしjiffies依存ぽいです。
addrメンバには、受信パケットのソースMACアドレスが格納されます。キャッシュを参照する際には__br_fdb_get()呼び出し元で宛先MACアドレスとの比較をおこなっているようです。
ただ、br_forward.cあたりを眺めると、キャッシュに残っていないか有効期限の切れた(has_expired @ br_fdb.cでテスト)MACアドレスへのパケットはブリッジを構成するすべてのインタフェースにパケットを投げるような実装に見えます。
ハブとは異なってブリッジにおいては、余計なパケットを流さないという目的のためにこのMACアドレスのキャッシュが使われると思います。ですのでキャッシュがなければハブと同じく、全てのインタフェースにパケットを垂れ流すのが正解のような気がします。
なので、有効期間を過ぎたら受信するだけのモノがつながっているポートへパケットが流れなくなる現象は起こらないような気がします。
これは、実験してみたほうがいいですかね。手元のubuntuのカーネルはブリッジがデフォルトで'M'になっているので、手動で設定すれば構成可能な気がします。
設定方法などについては、よさげな文書があります。
Net:Bridge
http://www.linuxfoundation.org/en/Net:Bridge
簡易的なメモを書いておられる方も発見。
Linux Bridge の設定方法(kernel 2.6 版)
ただし、netfilterと組み合わせて使うにはebtablesが必要のようです。古い情報ではカーネルにパッチが必要とのことですが、実際はどうでしょうか。
ebtables
http://ebtables.sourceforge.net/
net/brigde/netfilterにebtables.cなどがあります。
リンク
ネットワークの基礎を学習する CCNA対策講座
第17回 MACアドレスとフレームで、スイッチの基本動作を学ぶ
http://jibun.atmarkit.co.jp/lskill01/rensai/ccnatai17/ccnatai01.html
コメント