...
- INT란?
- MRI는 INT의 축소판 및 간편한 방법이라고 생각하면 된다. 튜토리얼 예시 같은 경우 토폴로지를 S1,S2,S3의 스위치가 있고, S1 = h1,h11. S2 = h2,h22. S3=h3 이렇게 연결 되어있으며, 각각의 스위치는 서로 연결 되어 있다. 그러하여 h1 → h2로 패킷을 보낼시에 MRI에 측정되는 SwitchTrace는 2개이며, 카운트 또한 2로 나오게 되는것이다.
코드 블럭 title MRI(Multi-Hop Route Inspection) header ipv4_option_t { //MRI를 이용하기 위한 헤더 선언// bit<1> copyFlag; bit<2> optClass; bit<5> option; bit<8> optionLength; } header mri_t { // mri작동을 위한 count수 설정을 통해 스위치 수 카운트 // bit<16> count; } header switch_t { //MRI를 이용하면서 지나는 switch의 이름과 qdepth를 저장하기 위한 헤더 선언// switchID_t swid; qdepth_t qdepth; } state parse_ipv4_option { //패킷을 수신한 후에 분석을 위해 헤더를 하나씩 분해 할 경우에 MRI 헤더가 있을 경우에 parse_mri를 이용// packet.extract(hdr.ipv4_option); transition select(hdr.ipv4_option.option) { IPV4_OPTION_MRI: parse_mri; default: accept; } } state parse_mri { //mri 패킷 수신후 헤더를 분해하여 parse_swtrace의 상태로 보내는 함수 // packet.extract(hdr.mri); meta.parser_metadata.remaining = hdr.mri.count; transition select(meta.parser_metadata.remaining) { 0 : accept; default: parse_swtrace; } } state parse_swtrace { //parse_swtrace로 보내진 패킷의 헤더의 값을 수정 후 0이 될때까지 반복하는 상태 함수// packet.extract(hdr.swtraces.next); meta.parser_metadata.remaining = meta.parser_metadata.remaining - 1; transition select(meta.parser_metadata.remaining) { 0 : accept; default: parse_swtrace; } } action add_swtrace(switchID_t swid) { //switch를 지날때의 스위치의 이름과 수를 저장하기 위한 함수// hdr.mri.count = hdr.mri.count + 1; hdr.swtraces.push_front(1); // According to the P4_16 spec, pushed elements are invalid, so we need // to call setValid(). Older bmv2 versions would mark the new header(s) // valid automatically (P4_14 behavior), but starting with version 1.11, // bmv2 conforms with the P4_16 spec. hdr.swtraces[0].setValid(); hdr.swtraces[0].swid = swid; hdr.swtraces[0].qdepth = (qdepth_t)standard_metadata.deq_qdepth; hdr.ipv4.ihl = hdr.ipv4.ihl + 2; hdr.ipv4_option.optionLength = hdr.ipv4_option.optionLength + 8; hdr.ipv4.totalLen = hdr.ipv4.totalLen + 8; } table swtrace { actions = { add_swtrace; NoAction; } default_action = NoAction(); }
- Source Routing
- Source Routing이란?
코드 블럭 title Source Routing header srcRoute_t { //Source Routing을 위한 헤더 선언// bit<1> bos; bit<15> port; } state parse_ethernet { // 이전의 경우는 이더넷 헤더 분석후 IPV4로 갔지만 소스 라운팅 헤터가 생김으로써 소스라우팅 헤더를 먼저 분석 한 후 헤더가 없을 시에 IPV4로 진행된다. packet.extract(hdr.ethernet); transition select(hdr.ethernet.etherType) { TYPE_SRCROUTING: parse_srcRouting; default: accept; } } state parse_srcRouting { packet.extract(hdr.srcRoutes.next); transition select(hdr.srcRoutes.last.bos) { 1: parse_ipv4; default: parse_srcRouting; } } action srcRoute_nhop() { //소스 라우팅에서 카운트를 통해 헤더 분석시에 필요한 갯수를 저장한다.// standard_metadata.egress_spec = (bit<9>)hdr.srcRoutes[0].port; hdr.srcRoutes.pop_front(1); } action srcRoute_finish() { hdr.ethernet.etherType = TYPE_IPV4; } apply { //nhop에 따라서 ipv4가 유효할경우에 ipv4 액션으로 넘어가게 한다.// if (hdr.srcRoutes[0].isValid()){ if (hdr.srcRoutes[0].bos == 1){ srcRoute_finish(); } srcRoute_nhop(); if (hdr.ipv4.isValid()){ update_ttl(); } }else{ drop(); } }
...