커널 소스 코드를 보면 ARP 요청을 처리할 때 net_device
요청을 직접 검색한 skb
다음 응답이 장치로 전송되는 것으로 나타납니다(arp.c#L679):
static int arp_process(struct net *net, struct sock *sk, struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
...
arp_send_dst(ARPOP_REPLY, ETH_P_ARP,
sip, dev, tip, sha,
dev->dev_addr, sha,
reply_dst);
}
그러나 패킷이 브리지를 통과하면 skb
해당 장치를 가져옵니다 .브리징 장치로 덮기:
static int br_pass_frame_up(struct sk_buff *skb)
{
...
skb->dev = brdev;
...
}
원래 장치를 검색하고 그곳으로 응답을 보낼 수 있는 방법이 없을까요?
답변1
프레임이 브리지 포트에서 도착하면 이제뉴브리지 FDB 항목이 MAC 주소로 프레임을 보낼 때 동일한 브리지 포트가 사용됨을 나타냅니다. 응답은 쿼리가 도착한 동일한 브리지 포트로 전송됩니다.
따라서 ARP 계층의 관점에서 보면 패킷은 브리지 인터페이스에서 수신되고 응답은 브리지 인터페이스로 다시 전송됩니다.
응답이 하위 계층인 브리지에 도달하면 브리지 코드는 전달 데이터베이스(일명)에서 다음을 수행합니다.악의 없는 거짓말) 모든 포트에 대한 응답을 플러딩하는 대신 이전 수신 브리지 포트를 나가는 브리지 포트로 선택합니다(이러한 최근 항목을 찾을 수 있으므로).
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) { ... } else if ((dst = br_fdb_find_rcu(br, dest, vid)) != NULL) { br_forward(dst->dst, skb, false, true); } else { br_flood(br, skb, BR_PKT_UNICAST, false, true);
이전과 달리 skb의 장치 브리지 인터페이스는 브리지 포트로 보호됩니다.
static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb, bool local_orig) { ... skb->dev = to->dev; ...