리눅스애서 source routing 에 관련된 질문입니다.

trymp의 이미지


리눅스 라우팅과 관련된 질문입니다.

제가 알기로는 forward 되는 packet 은 ip_route_input() 함수에서 routing 이 decision 되고

local 에서 output 되는 packet 은 ip_output_key() 인가 하는 함수에서 routing decision

되는 것으로 알고 있습니다.

이 때 foward 되는 packet 에 대해서 source routing 을 걸었을 때,

제가 인위적으로 dev_queue_xmit() 을 호출하기 전에 skb 의 source IP 를 다른 것으로 바뀌치기 했습니다.

그러면 바뀐 source IP 에 따라서 routing 이 바뀌었습니다.

L2 level 인 dev_queue_xmit 에서도 routing decision 이 이루어지나요??

테스트 결과로만 봐서는 dev_queue_xmit 에서 routing 이 결정나서 다른 next hop 으로 보내는데,

제가 알고 있는 지식과는 많이 달라서 혼돈이됩니다.

리눅스 라우팅에 대해 알고 계신 고수님의 도움을 요청합니다.

pak2536의 이미지

dev_queue_xmit 실행 전에 skb->dev 에 할당한 netdevice 로 일단 내보냅니다.
그리고 ipv4 라면, ip_finish_output2 에서 L2주소를 완성해서 내려보내는데 L2는 라우팅이 아니라 ARP 캐시나 ARP를 쏴서 L2 주소를 skb 에 박아 넣는 역할입니다. ipv6 에서는 arp 가 사라지고 ND 메세지중에 neighbour solicitation (icmpv6)가 생겼죠.

결과적으로 다음홉 지정하는 라우팅은 dev_queue_xmit 에서 안납니다. skb 에서 주소를 아무리 바꿔도 메타정보인 skb->dev를 안바꾸면 안된다는 말이죠. 이말인 즉슨, dev_queue_xmit에서 skb->dev를 내보낼 netdevice 로 인식하는 하나의 파라미터라고 보면 됩니다.