gretap을 통해 원시 소켓을 사용하여 데이터 보내기

gretap을 통해 원시 소켓을 사용하여 데이터 보내기

프로토콜 유형 ISO(0x00fe)를 사용하여 gretap 인터페이스에 IS-IS 패킷을 쓰려고 합니다. 이 경우 이더넷 헤더가 없으므로 원시 소켓을 사용합니다. gretap은 항상 GRE 헤더의 프로토콜 유형으로 0x6558을 확인합니다. 수신자가 GRE 헤더 바로 다음에(즉, 첫 번째 패킷 없이) IS-IS 패킷을 볼 것으로 예상하도록 gretap이 다른 프로토콜 유형(예: 0x00fe)을 사용하도록 하는 방법이 있습니까? 이더넷 헤더입니까)?

후속 조치:

프로토콜 유형이 하드코딩되어 있다고 생각합니다(예: 커널의 ip_gre.c에서).

 761 static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,
 762         struct net_device *dev)
 763 {
...
 776
 777   __gre_xmit(skb, dev, &tunnel->parms.iph, htons(ETH_P_TEB));
 778   return NETDEV_TX_OK;

ETH_P_TEB 기호는 투명 이더넷 브리지 유형(0x6558)이므로 이 값을 설정할 수 있는 옵션이 없습니다. 이는 원시 소켓을 사용하는 경우 GRE에서 다른 래퍼를 생성해야 할 수 있기 때문에 불행한 일입니다. 커널 모듈을 수정해 보겠습니다.

답변1

gretap 대신 IP gre 인터페이스와 원시 소켓을 사용하여 원하는 것을 달성할 수 있는 것 같습니다. 이 경우, sendto() 호출에 전달된 struct sockaddr_ll의 sll_protocol 필드를 사용하여 프로토콜 유형을 설정할 수 있으며 원시 소켓을 사용하여 캡슐화를 제어할 수 있습니다.

관련 정보