OpenFlow 프로토콜

이 장에서는 OpenFlow 프로토콜에 정의된 매치(match), 명령(instruction) 및 액션(action)에 대해 설명합니다.

매치

매치에 사용할 수 있는 조건에는 여러 가지가 있으며, OpenFlow의 버전이 올라갈 때 마다 그 종류는 증가하고 있습니다. OpenFlow 1.0에서는 12 종류 였지만, OpenFlow 1.3 는 40 가지의 조건이 정의되어 있습니다.

개별적인 자세한 내용은 OpenFlow 스펙 등을 참조하시면 됩니다. 여기에서는 OpenFlow 1.3 Match 필드를 간단하게 소개합니다.

Match 필드 이름 설명
in_port 수신 포트의 포트 번호
in_phy_port 수신 포트의 물리적 포트 번호
metadata 테이블간에 정보를 전달하는 데 사용되는 메타 데이터
eth_dst Ethernet 대상 MAC 주소
eth_src Ethernet 원본 MAC 주소
eth_type Ethernet 프레임 타입
vlan_vid VLAN ID
vlan_pcp VLAN PCP
ip_dscp IP DSCP
ip_ecn IP ECN
ip_proto IP 프로토콜 종류
ipv4_src IPv4의 소스 IP 주소
ipv4_dst IPv4의 대상 IP 주소
tcp_src TCPd 원본 포트 번호
tcp_dst TCP 목적지 포트 번호
udp_src UDP 소스 포트 번호
udp_dst UDP 대상 포트 번호
sctp_src SCTP의 원본 포트 번호
sctp_dst SCTP 목적지 포트 번호
icmpv4_type ICMP의 Type
icmpv4_code ICMP의 Code
arp_op ARP의 작동 코드
arp_spa ARP의 소스 IP 주소
arp_tpa ARP의 대상 IP 주소
arp_sha ARP의 소스 MAC 주소
arp_tha ARP의 대상 MAC 주소
ipv6_src IPv6의 소스 IP 주소
ipv6_dst IPv6의 대상 IP 주소
ipv6_flabel IPv6의 플로우 레이블
icmpv6_type ICMPv6의 Type
icmpv6_code ICMPv6의 Code
ipv6_nd_target IPv6 네이버 디스커버리의 대상 주소
ipv6_nd_sll IPv6 네이버 디스커버리 원본 링크 계층 주소
ipv6_nd_tll IPv6 네이버 디스커버리 타겟 링크 계층 주소
mpls_label MPLS 레이블
mpls_tc MPLS 트래픽 클래스 (TC)
mpls_bos MPLS의 BoS 비트
pbb_isid 802.1ah PBB의 I-SID
tunnel_id 논리 포트에 대한 메타 데이터
ipv6_exthdr IPv6 확장 헤더의 의사 필드

MAC 주소와 IP 주소 등의 일부 필드는 또한 마스크를 지정할 수 있습니다.

명령

명령(instruction)은 매치에 해당하는 패킷을 수신했을 때의 동작을 정의하는 것으로, 다음과 같은 유형이 규정되어 있습니다.

명령 설명
Goto Table (필수)

OpenFlow 1.1 이상에서는 여러 개의 플로우 테이블을 합니다. Goto Table에 의해 일치된 패킷의 처리를 지정된 플로우 테이블에서 처리하도록 할 수 있습니다. 예를 들어, “포트 1에서 받은 패킷 에 VLAN-ID 200을 추가하여 테이블 2에 보냄」이라고 플로우 항목을 설정할 수 있습니다.

지정된 테이블 ID는 현재 테이블 ID보다 큰 값이 아니면 안됩니다.

Write Metadata (옵션) 이후의 테이블에서 볼 수 있는 메타 데이터를 설정합니 다.
Write Actions (필수) 현재 액션 세트에 지정된 액션을 추가 합니다. 동일한 유형의 액션이 이미 설정된 경우에는 새로운 액션으로 대체됩니다.
Apply Actions (옵션) 액션 세트는 변경하지 않고, 지정된 액션을 즉시 적용합니다.
Clear Actions (옵션) 현재 액션 세트에서 모든 액션을 제거합니다.
Meter (옵션) 지정된 미터에 패킷을 적용합니다.

Ryu는 각 명령어에 해당하는 다음 클래스가 구현되어 있습니다.

  • OFPInstructionGotoTable
  • OFPInstructionWriteMetadata
  • OFPInstructionActions
  • OFPInstructionMeter

Write/Apply/Clear Actions는 OPFInstructionActions에 정리하고 있고, 인스턴스 생성시에 선택합니다.

주석

Write Actions의 지원은 스펙에서 필수로 되어 있지만, 이전 버전의 Open vSwitch에서는 구현되지 않았으며, 대신 Apply Actions를 사용해야 했었습니다. Open vSwitch 2.1.0에서 Write Actions 지원이 추가되었습니다.

액션

OFPActionOutput 클래스는 Packet-Out 메시지와 Flow Mod 메시지를 사용하여 패킷 전송을 지정하는 것입니다. 생성자의 인수 대상과 컨트롤러에 보내려면 최대 데이터 크기 (max_len)을 지정합니다. 대상에는 스위치의 물리적 포트 번호 외에 몇 가지 정의된 값을 지정할 수 있습니다.

설명
OFPP_IN_PORT 수신 포트로 전송됩니다
OFPP_TABLE 첫번째 플로우 테이블에 적용됩니다
OFPP_NORMAL 스위치의 L2/L3 기능으로 전송됩니다
OFPP_FLOOD 수신 포트 또는 블록된 포트를 제외한 해당 VLAN의 모든 물리적 포트에 Flooding
OFPP_ALL 수신 포트를 제외한 모든 물리적 포트에 전송합니다
OFPP_CONTROLLER 컨트롤러에 Packet-In 메시지로 보냅니다
OFPP_LOCAL 스위치의 로컬 포트를 지정합니다
OFPP_ANY Flow Mod (delete) 메시지 및 Flow Stats Requests 메시지 에서 포트를 선택할 때 와일드 카드로 사용하는 것으로, 패킷 전송에서 사용되지 않습니다

max_len 0을 지정하면 Packet-In 메시지 패킷의 이진 데이터를 첨부하지 않습니다. OFPCML_NO_BUFFER 을 지정하면 OpenFlow 스위치 에서 패킷을 버퍼없이 Packet-In 메시지 패킷 전체가 첨부됩니다.