Linux Multicast Routing Cache

在 Linux 裡面,Multicast 的 Routing 會不同於一般的 Routing 方式,在公司實驗的時候,明明 Routing Table 都已經進行設定了,封包卻始終不按照自己所想的方式來轉送,於是跟同事進行研究後,得到下面的結論。

首先,先來看一張圖





當然,這張圖有點小,請按照連結去觀看原始大小

當網卡收到封包以後,處理順序會是
netif_receive_skb -> ip_rcv -> ip_rcv_finish -> ip_route_input -> ip_route_input_slow ...

在 ip_route_input 和 ip_input_route_slow 裡面會進行 routing 的動作
但其實在 ip_route_input 裡面有多加了一段判斷,是圖中所沒有的

/linux/net/ipv4/route.c

if (MULTICAST(daddr))
{
...
return ip_route_input_mc(skb, daddr, saddr, tos, dev, our);
}

很明顯的可以看到 multicast 是被例外處理的
而 MULTICAST 的定義如下:

/linux/include/linux/in.h

#define MULTICAST(x) (((x) & htonl(0xf0000000)) == htonl(0xe0000000))

很明顯的,可以看出是 Class D 的區段

總之,要 Linux 進行 Multicast Forwarding 的條件如下:

1. /proc/sys/net/ipv4/conf/all/mc_forwarding 要設成 1

請注意,這邊直接使用 echo 來設定是沒有用的
MRouterFD = socket( AF_INET, SOCK_RAW, IPPROTO_IGMP );
setsockopt( MRouterFD, IPPROTO_IP, MRT_INIT, (void *)&Va, sizeof( Va ) );

這是直接抄自 smcroute 的 code (當然我拿掉了 error protection 的部分)

2. /proc/net/ip_mr_cache 裡面要有資料

簡單來說,就是 multicast routing table 裡面要有資料
如何新增也可以參考 smcroute

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包

我弟家的新居感恩禮拜分享:善頌善禱