버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

코드 블럭
titleBasic Tunneling
----------------------------------------------------------------- Basic Forwarding과 다르게 Tunnel에 관련된 헤더가 추가되어 패킷을 분석할때 Tunnel에 관련된 헤더도 분석하기 위해 경우를 추가.
state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
TYPE_MYTUNNEL: parse_myTunnel;
TYPE_IPV4: parse_ipv4;
default: accept;
    }
}

----------------------------------------------------------------------etherType 이 Tunnel인 경우 parse_myTunnel의 함수를 이용하여 패킷을 먼저 분리 그 다음에 Forwarding과 같이 IPV4에 관하여 분석.
state parse_myTunnel {
packet.extract(hdr.myTunnel);
transition select(hdr.myTunnel.proto_id) {
TYPE_IPV4: parse_ipv4;
default: accept;
   }
}

----------------------------------------------------------------------ingress하기 위해 터널 헤더에 맞는 테이블 값이 있을 시에 행동을 취하게 끔 분석 및 전송을 하는 함수.
action myTunnel_forward(egressSpec_t port) {
standard_metadata.egress_spec = port;
    }


table myTunnel_exact {
key = {
hdr.myTunnel.dst_id: exact;
      }
actions = {
myTunnel_forward;
drop;
      }
size = 1024;
default_action = drop();
 }  


  • P4Runtime - P4 스위치를 터널을 통해 송수신되는 패킷에 관련되어 테이블 작성 및 터널을 지나는 패킷에 관한 카운트 실행


코드 블럭
titleP4Runtime
# 1) Tunnel Ingress Rule                            -------- 터널을 통한 패킷 수신 시에 터널 포트에 관한 테이블 작성
table_entry = p4info_helper.buildTableEntry(
table_name="MyIngress.ipv4_lpm",
match_fields={
"hdr.ipv4.dstAddr": (dst_ip_addr, 32)
},
action_name="MyIngress.myTunnel_ingress",
action_params={
"dst_id": tunnel_id,
})
ingress_sw.WriteTableEntry(table_entry)
print("Installed ingress tunnel rule on %s" % ingress_sw.name)

#2) Tunnel Transit Rule                          --------- 테이블과의 매칭을 통해 패킷 전송에 관한 것
table_entry = p4info_helper.buildTableEntry(
table_name="MyIngress.myTunnel_exact",
match_fields={
"hdr.myTunnel.dst_id": tunnel_id
},
action_name="MyIngress.myTunnel_forward",
action_params={
"port": SWITCH_TO_SWITCH_PORT
})
ingress_sw.WriteTableEntry(table_entry)
print("Installed transit tunnel rule on %s" % ingress_sw.name)

# 3) Tunnel Egress Ruletable_entry = p4info_helper.buildTableEntry(                 -------- 패킷 송신 시에 터널 포트에 관한 테이블 작성
table_name="MyIngress.myTunnel_exact",
match_fields={
"hdr.myTunnel.dst_id": tunnel_id
},
action_name="MyIngress.myTunnel_egress",
action_params={
"dstAddr": dst_eth_addr,
"port": SWITCH_TO_HOST_PORT
})
egress_sw.WriteTableEntry(table_entry)
print("Installed egress tunnel rule on %s" % egress_sw.name) 

...