arp_process()는 올바른 장치에 어떻게 응답합니까?

arp_process()는 올바른 장치에 어떻게 응답합니까?

커널 소스 코드를 보면 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 계층의 관점에서 보면 패킷은 브리지 인터페이스에서 수신되고 응답도 브리지 인터페이스로 다시 전송됩니다.

응답이 하위 계층인 브리지에 도달하면 전달 데이터베이스(일명)에서 조회를 수행하는 브리지 코드입니다.악의 없는 거짓말) 모든 포트에 대한 응답을 플러딩하는 대신 이전 수신 브리지 포트를 나가는 브리지 포트로 선택합니다(최근 항목이 발견되었기 때문에).

br_device.c:

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의 장치 브리지 인터페이스를 브리지 포트로 덮어씁니다.

br_forward.c:

static void __br_forward(const struct net_bridge_port *to,
           struct sk_buff *skb, bool local_orig)
{
...
      skb->dev = to->dev;
...

관련 정보