我有一個關於如何綁定驅動程序從服務器接口接收數據包的問題。我發現綁定使用dev_add_pack()爲LACPDU和ARP數據包設置處理程序,但我沒有找到其他處理程序(用於其他數據包類型)。綁定驅動程序如何從服務器接口接收RX數據包
你能幫我解決這個問題嗎?
我有一個關於如何綁定驅動程序從服務器接口接收數據包的問題。我發現綁定使用dev_add_pack()爲LACPDU和ARP數據包設置處理程序,但我沒有找到其他處理程序(用於其他數據包類型)。綁定驅動程序如何從服務器接口接收RX數據包
你能幫我解決這個問題嗎?
綁定驅動程序註冊自己的Rx處理程序,當從接口受制於債券主,在bond_enslave(),你可以看到:
res = netdev_rx_handler_register(slave_dev, bond_handle_frame,
new_slave);
在bond_handle_frame(),它會劫持收到的數據包
所以由奴隸接口,以便債券主將接收數據包,而不是:
static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
{
struct sk_buff *skb = *pskb;
struct slave *slave;
struct bonding *bond;
int (*recv_probe)(const struct sk_buff *, struct bonding *,
struct slave *);
int ret = RX_HANDLER_ANOTHER;
skb = skb_share_check(skb, GFP_ATOMIC);
if (unlikely(!skb))
return RX_HANDLER_CONSUMED;
*pskb = skb;
slave = bond_slave_get_rcu(skb->dev);
bond = slave->bond;
if (bond->params.arp_interval)
slave->dev->last_rx = jiffies;
recv_probe = ACCESS_ONCE(bond->recv_probe);
if (recv_probe) {
ret = recv_probe(skb, bond, slave);
if (ret == RX_HANDLER_CONSUMED) {
consume_skb(skb);
return ret;
}
}
if (bond_should_deliver_exact_match(skb, slave, bond)) {
return RX_HANDLER_EXACT;
}
skb->dev = bond->dev;
if (bond->params.mode == BOND_MODE_ALB &&
bond->dev->priv_flags & IFF_BRIDGE_PORT &&
skb->pkt_type == PACKET_HOST) {
if (unlikely(skb_cow_head(skb,
skb->data - skb_mac_header(skb)))) {
kfree_skb(skb);
return RX_HANDLER_CONSUMED;
}
memcpy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, ETH_ALEN);
}
return ret;
}
謝謝,似乎我被檢查過舊的綁定版本,從kernel.org更新後,我發現有關你的代碼上面寫道 – 2013-03-01 19:17:51
我檢查了綁定代碼,發現當驅動程序在這些模式下工作時,驅動程序沒有在沒有某些類型(LACPDU,ARP)的情況下檢查傳入的RX數據包。驅動程序使用dev_add_pack()函數爲此數據包設置處理程序。
爲了在實踐中設置全局鉤子,您可以使用nf_register_hook(),它爲攔截數據包提供設置自己的網絡過濾器過程的接口。 似乎nf_register_hook()比dev_add_pack()更強大,但我認爲在使用nf_register_hook()時需要更加小心,因爲在鉤子中出現錯誤條件的情況下,它可能會丟失很多數據包。
+1,我希望我可以幫你在那裏。 – 2013-02-27 18:12:33
好的,謝謝,似乎我找到了答案,我想我會在這裏添加它,但稍後 – 2013-02-28 11:45:22