Open vSwitch 패킷 처리 구조

21
Open vSwitch 패킷 처리 구조 2015.03.20 ㈜파이오링크 SDN개발실 백승훈 ([email protected])

Transcript of Open vSwitch 패킷 처리 구조

Page 1: Open vSwitch 패킷 처리 구조

Open vSwitch 패킷 처리 구조

2015.03.20

㈜파이오링크

SDN개발실 백승훈 ([email protected])

Page 2: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

목차

Open vSwitch Overview

Architecture Diagram

- Architecture Diagram

- Interface Diagram

Packet Processing

- Slow Path & Fast Path

- Unknown Packet Processing

- Flow Rule Update

References

Page 3: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Open vSwitch Overview

OVS(Open vSwitch)

-리눅스 기반의 가상 소프트웨어 스위치

- Open source Apache 2 License

-네트워크를 추상화하여 동적으로 자원을 제어할 수 있음

- OpenFlow를 지원하여 SDN Switch로 사용 가능

- OVSDB 프로토콜 지원

•OVS의 설정 값을 저장한 DB를 관리하기 위한 프로토콜

-터널링 프로토콜 지원 (GRE, VXLAN, IPsec 등)

-모니터링 기능 지원 (NetFlow, sFlow, IPFIX, SPAN, RSPAN 등)

-분산 가상 스위치 기능 제공

•다른 물리 서버에 위치한 가상 서버(VM)를 서로 연결

-최신 버전 : 2.3.1 (2014/12/3)

Network

VM VM …

Hypervisor Hypervisor

VM VM …

ETH ETH

Hypervisor

VM VM …

ETH

Physical Server Physical Server Physical Server

OVS OVS

Page 4: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Open vSwitch Overview

OVS 내부 구조

ovs-vswitchd(vswitchd)

openvswitch(datapath)

Network

ovsdb-server

ovsdb

ovs-dpctl ovs-appctl ovs-vsctl ovsdb-client ovsdb-tool

ovs-ofctl

Kernel space

User space

Remote

Network Device

OpenFlow를 이용한

OVS 관리 툴

Page 5: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Open vSwitch Overview

OVS 데몬 관리 툴

ovs-vswitchd(vswitchd)

openvswitch(datapath)

Network

ovsdb-server

ovsdb

ovs-dpctl ovs-appctl ovs-vsctl ovsdb-client ovsdb-tool

ovs-ofctl

Kernel space

User space

Remote

Network Device

datapath 관리 툴

OVS 데몬

vswitchd 제어를

위한 경량화된 툴

OVS 커널 모듈

ovsdb-server를 이용한

vswitchd 관리 툴

Page 6: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Open vSwitch Overview

OVS DB 관리 툴

ovs-vswitchd(vswitchd)

openvswitch(datapath)

Network

ovsdb-server

ovsdb

ovs-dpctl ovs-appctl ovs-vsctl ovsdb-client ovsdb-tool

ovs-ofctl

Kernel space

User space

Remote

Network Device

odvdb-server에 대한

CLI 제공 ovsdb 관리를 위한

CLI 제공

ovsdb를 관리하기 위한

RPC 인터페이스를 제공

Page 7: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Architecture Diagram

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

Controller로부터 flow rule을 받아 flow

table을 업데이트하고 datapath에게 기존 flow rule을 삭제하도록 명령함

datapath가 packet 처리를 위해 rule을 요청하면 flow rule을 제공함

Network 장비와 packet을 교환함

Packet은 갖고 있는 flow rule에 따라 처리됨

입력된 packet과 매치(match)되는 flow rule을 갖고 있지 않은 경우 upcall 과정을 통해 flow rule을 가져옴

(Upcall : datapath에서 vswitchd에게 요청하는 작업)

Page 8: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Interface Diagram

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

Netlink를 이용해 정보를 교환함 (Netlink : Socket을 이용한 IPC)

Network device를 지원하는 커널 API를 사용함

OVS가 지원하는 network 제어 프로토콜을 이용함 (OpenFlow, OVSDB) * 본 ppt는 OpenFlow를 기준으로 설명

Page 9: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Slow Path & Fast Path

datapath의 packet 처리 방식에는

Slow Path와 Fast Path 두 가지가 존재함

1. Slow Path : vswitchd에게 flow

rule을 받아 packet을 처리함.

(datapath가 packet에 대한 flow

rule을 갖고 있지 않은 경우)

2. Fast Path : Slow Path를 통해

가져온 flow rule로 datapath에서

바로 packet을 처리함

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1. Slow Path

2. Fast Path

*뒷장의 unknown packet processing과 같음

Page 10: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Unknown Packet Processing

datapath가 수신한 packet의 flow rule을

갖고 있지 않은 경우 vswitchd 로부터

flow rule을 가져오는 과정

1. Packet 수신을 위한 device 및

이벤트 핸들러 등록

2. Packet 수신 후 unknown packet을

판별해 upcall 처리

3. vswitchd가 unknown packet에

대한 flow rule 결정

4. Flow rule을 datapath에 전달

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2.

3.

4.

*뒷장부터 위 순서를 OVS 함수로 정리

Page 11: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Unknown Packet Processing

1. Packet 수신을 위한 device 및

이벤트 핸들러 등록 Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2.

3.

4.

① ovs_dp_cmd_new() 또는 ovs_vport_cmd_new() : vport(가상의 port)를 생성하는 과정 시작

② new_vport()

: vport 생성

③ ovs_vport_add()

: 요청에 대한 ops(ovs_netdev_vport_ops) 등록

④ netdev_create()

: vport에 대한 설정 및 수신 이벤트에 대한 핸들러 등록

⑤ netdev_frame_hook()

: packet 수신에 대한 이벤트 핸들러로 Network에서 오는 packet을 수신

함수 호출

Page 12: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Unknown Packet Processing

2. Packet 수신 후 unknown packet을

판별해 upcall 처리 Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2.

3.

4.

① netdev_frame_hook()

: packet 수신

② netdev_port_receive()

③ ovs_vport_receive()

④ ovs_dp_process_pacekt()

: flow table과 매치 후 unknown packet이면 upcall 동작을 수행

⑤ ovs_dp_upcall()

⑥ queue_userspace_packet()

⑦ genlmsg_unicast()

: user space로 메시지 전달

Page 13: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Unknown Packet Processing

3. vswitchd가 unknown packet에 대한

flow rule 결정 Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2.

3.

4.

① updif_upcall_handler()

: 폴링 방식으로 upcall을 대기하는 스레드

② recv_upcalls()

→ dpif_recv()

: datapath에서 data를 수신 → process_upcall()

: unknown packet에 대한 upcall 인지 확인

③ handle_upcall()

: 새로운 flow rule을 datapath로 전달하기 위한 명령어 생성

④ dpif_operate() : 새로운 flow rule을 datapath로 전달하는 작업 시작

Page 14: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Unknown Packet Processing

4. Flow rule을 datapath에 전달 Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2.

3.

4.

① dpif_operate() : Flow rule을 datapath로 전달하는 작업 시작

② dpif_netlink_operate() = dpif->dpif_class->operate()

③ dpif_netlink_operate__()

→ dpif_netlink_init_flow_put() : datapath로 전달할 메시지에 flow 추가 명령과 정보를 입력

④ nl_transact_multiple()

⑤ nl_sock_transact_multiple()

⑥ nl_sock_transact_multiple__()

: datapath에게 flow rule 전달

Page 15: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Flow Rule Update

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

vswitchd가 controller로부터 기존 flow

rule을 변경하는 제어 메시지를 수신해 datapath의 flow rule을 갱신하는 과정

1. OpenFlow Controller로 부터 제어 메시지를 수신

2. vswitchd의 flow table 갱신

3. Flow table 업데이트 정보 체크

4. datapath의 기존 flow rule을 삭제

5. flow rule을 삭제한 후에는 unknown packet으로 처리함

2.

3.

4.

5.

* 앞의 unknown packet processing과 같아 뒤에 설명은 생략함

Page 16: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Flow Rule Update

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

1. OpenFlow Controller로 부터

제어 메시지를 수신

① ofproto_run()

② connmgr_run()

③ ofconn_run()

④ rconn_recv()

⑤ vconn_recv()

⑥ do_recv()

⑦ vconn_stream_recv__()

⑧ stream_recv()

⑨ fd_recv()

: controller로부터 메시지를 수신

2.

3.

4.

5.

Page 17: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Flow Rule Update

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

2. vswitchd의 flow table 갱신

① ofconn_run()

② handle_openflow()

③ handle_openflow__()

④ handle_flow_mod()

⑤ handle_flow_mod__()

⑥ add_flow()

: vswitchd의 flow table에 controller로부터 받은 새로운 flow rule을 추가 또는 수정

2.

3.

4.

5.

Page 18: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Flow Rule Update

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

3. Flow table 업데이트 정보 체크

① udpif_revalidator() : 주기적으로 flow table을 체크하는 스레드

② revalidate() : flow table 체크 시작

③ revalidate_ukey()

→ xlate_actions() : flow table에서 정보 가져옴

④ ofpbuf_equal()

: flow table 업데이트 유무 확인

2.

3.

4.

5.

Page 19: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

Flow Rule Update

Controller

vswitchd

(user space)

datapath

(kernel space)

Network

Open vSwitch

1.

4. datapath의 기존 flow rule을 삭제

① revalidate()

→ delete_op_init()

② push_ukey_ops__()

③ dpif_operate()

④ dpif_netlink_operate()

= dpif->dpif_class->operate()

⑤ dpif_netlink_operate__()

→ dpif_netlink_init_flow_del() : datapath에게 전달하는 메시지에 flow 삭제 명령과 필요한 정보를 입력

⑥ nl_transact_multiple()

⑦ nl_sock_transact_multiple()

⑧ nl_sock_transact_multiple__()

: datapath에게 삭제 명령 전달

2.

3.

4.

5.

Page 20: Open vSwitch 패킷 처리 구조

© PIOLINK, Inc. SDN No.1

References

http://www.openvswitch.org/

https://github.com/openvswitch/ovs/

http://en.wikipedia.org/wiki/Open_vSwitch

http://www.slideshare.net/rajdeep/openvswitch-deep-dive

http://dpdk.org/

http://www.apache.org/

http://www.xenproject.org/

https://www.openstack.org/

http://www.linux-kvm.org/page/Main_Page

https://www.opennetworking.org/sdn-resources/openflow

Page 21: Open vSwitch 패킷 처리 구조

감사합니다. ㈜파이오링크

서울시 금천구 가산디지털2로 98

(가산동 550-1) IT캐슬 1동 401호

TEL: 02-2025-6900

FAX: 02-2025-6901

www.PIOLINK.com