드라이버를 본딩하는 방법에 대해 노예화 된 인터페이스에서 RX 패킷을받는 방법에 관한 질문이 있습니다. 나는 bonding이 LACPDU와 ARP 패킷에 대한 핸들러를 설정하기 위해 dev_add_pack()을 사용하지만 다른 핸들러를 찾지 못했음을 발견했다.본딩 드라이버가 노예화 인터페이스에서 RX 패킷을 가져 오는 방법
이 질문을 해결할 수 있도록 도와 주시겠습니까?
드라이버를 본딩하는 방법에 대해 노예화 된 인터페이스에서 RX 패킷을받는 방법에 관한 질문이 있습니다. 나는 bonding이 LACPDU와 ARP 패킷에 대한 핸들러를 설정하기 위해 dev_add_pack()을 사용하지만 다른 핸들러를 찾지 못했음을 발견했다.본딩 드라이버가 노예화 인터페이스에서 RX 패킷을 가져 오는 방법
이 질문을 해결할 수 있도록 도와 주시겠습니까?
본딩 드라이버는, 자신의 수신 핸들러를 등록() 당신이 볼 수 bond_handle_frame()는 패킷 수신 납치됩니다에 따라서
res = netdev_rx_handler_register(slave_dev, bond_handle_frame,
new_slave);
을 슬레이브 인터페이스에서 보이드 마스터가 패킷을 수신하게하려면 다음을 입력하십시오.
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.net에서 업데이트 한 후 너무 오래 된 본딩 버전을 확인한 것 같다. 위에 쓴 –
본딩 코드를 확인한 결과 드라이버가 이러한 모드에서 작동 할 경우 일부 드라이버는 유형 (LACPDU, ARP)없이 들어오는 RX 패킷을 검사하지 않았습니다. 드라이버는 dev_add_pack() 함수를 사용하여이 패킷에 대한 핸들러를 설정합니다.
실용적인 세트 글로벌 훅의 경우, 인터셉트 패킷을위한 자체 인터넷 필터 프로 시저 설정을위한 인터페이스를 제공하는 nf_register_hook()을 사용할 수 있습니다. nf_register_hook()이 dev_add_pack()보다 강력하지만, nf_register_hook()을 사용할 때 더 많은주의가 필요하다고 생각합니다. 잘못된 조건이 발생할 경우를 대비해 많은 패킷을 삭제할 수 있기 때문입니다. 슬레이브 인터페이스가 bond_enslave에, 채권 마스터에 노예가 될 때
+1, 제가 도와 드리겠습니다. –
좋아, 고맙다, 내가 대답을 찾은 것 같다, 내가 나중에 여기에 추가 할 것이라고 생각한다. –