LinuxのBridge:ソース読み

---この記事には多くのうそが埋め込まれているはずです。ご注意を。---

Kernel 3.4.10 net/bridge

まずはメインっぽいbr.cから開いてみる。
[br.c]
br_init():
stp_proto_register(&br_stp_proto);
br_fdb_init();
register_pernet_subsys(&br_net_ops);
br_netfilter_init();
register_netdevice_notifier(&br_device_notifier);
brioctl_set(br_ioctl_deviceless_stub);

br_deinit():
(ry


次に関数名からなんとなく処理のわかったところへ。
Forwarding Databaseの略だそうで。
[br_fdb.c]
br_fdb_init():
データベース用の領域をページキャッシュとして確保してる(kmem_cache_create)
その他:
データベース操作関数とか


仮想ブリッジが動作するきっかけとなるパケット取得ハンドラ(?)みたいなのはどこかな?
Handle incoming frames
[br_input.c]
rx_handler_result_t br_handle_frame():
メインの関数っぽい。この関数から同ファイルの他の関数が呼ばれてる。戻り値の型から察するに、パケット受信時(つまり、ブリッジにパケットが入ってくるとき)に呼ばれるハンドラ。どこに登録される?

MACアドレスを見て、それぞれの処理にswitchしてる。
/*
* See IEEE 802.1D Table 7-10 Reserved addresses
*
* Assignment Value
* Bridge Group Address 01-80-C2-00-00-00
* (MAC Control) 802.3 01-80-C2-00-00-01
* (Link Aggregation) 802.3 01-80-C2-00-00-02
* 802.1X PAE address 01-80-C2-00-00-03
*
* 802.1AB LLDP 01-80-C2-00-00-0E
*
* Others reserved for future standardization
*/


転送処理はどこでされてる?
Forwarding decision
[br_forward.c]
br_dev_queue_push_xmit():
あっ!見たことある関数に似てる!
この関数内で"dev_queue_xmit()"を呼び出してパケットを実際に転送している模様。
http://www.ibm.com/developerworks/jp/linux/library/l-linux-networking-stack/
br_flood():
たぶん、この関数はブロードキャストしてると思う。

ユーザ空間のプロセスとのインターフェースは?
[br_if.c]


ソースファイル一覧
==> br.c <==
* Generic parts

==> br_device.c <==
* Device handling code

==> br_fdb.c <==
* Forwarding database

==> br_forward.c <==
* Forwarding decision

==> br_if.c <==
* Userspace interface

==> br_input.c <==
* Handle incoming frames

==> br_ioctl.c <==
* Ioctl handler

==> br_multicast.c <==
* Bridge multicast support.

==> br_netfilter.c <==
* Handle firewalling

==> br_netlink.c <==
* Bridge netlink control interface

==> br_notify.c <==
* Device event handling

==> br_private.h <==
* Linux ethernet bridge

==> br_private_stp.h <==
* Linux ethernet bridge

==> br_stp.c <==
* Spanning tree protocol; generic parts

==> br_stp_bpdu.c <==
* Spanning tree protocol; BPDU handling

==> br_stp_if.c <==
* Spanning tree protocol; interface code

==> br_stp_timer.c <==
* Spanning tree protocol; timer-related code

==> br_sysfs_br.c <==
* Sysfs attributes of bridge ports

==> br_sysfs_if.c <==
* Sysfs attributes of bridge ports