본문 바로가기

Dev/ONOS & OF-DPA

[ONOS App] fwd 분석

ONOS App 중 org.onosproject.fwd은 ONOS 최초 실행시 자동으로 active되어진다.


fwd App의 동작은 다음과 같다.

1. Switch에 Flow Rule이 없는 패킷이 들어온다.

2. Switch는 Flow Rule이 정의 되어있지 않은 패킷을 ONOS로 올린다. (Packet_in)

3. fwd App은 패킷의 목적지를 확인한다. => 여기서 패킷의 어떤 정보를 확인하는지 코드 분석 필요

4. fwd App은 패킷의 목적지로 갈 수 있도록 Flow Rule을 Switch에 내린다. (Packet_out, Flow_mod)

5. 다음부터 스위치로 들어오는 패킷은 목적지로 향한다. 


fwd App이 내리는 Flow Rule은 idle timeout이 적용되어 몇 초간 들어오지 않은 경우 자동으로 사라진다.


ONOS 소스에서 fwd App의 위치는 다음과 같다.

onos/apps/fwd/src/main/java/org/onosproject/fwd/


먼저 핵심 소스로 추정되는 ReactiveForwarding.java 이다.


변수 목록

 

private static final int DEFAULT_TIMEOUT = 10; // 위에서 언급한 idle_timeout

private static final int DEFAULT_PRIORITY = 10; // Flow rule 우선순위

 

private final Logger log = getLogger(getClass()); // Log

 

// 이용할 Service  

protected TopologyService topologyService;

protected PacketService packetService;

protected HostService hostService;

protected FlowRuleService flowRuleService;

protected FlowObjectiveService flowObjectiveService;

protected CoreService coreService;

protected ComponentConfigService cfgService;

protected StorageService storageService;

 

private ReactivePacketProcessor processor = new ReactivePacketProcessor();

private  EventuallyConsistentMap<MacAddress, ReactiveForwardMetrics> metrics;

 

private ApplicationId appId; // App 아이디

 

// DB 사용할 변수들? Property 사용

private boolean packetOutOnly = false;

private boolean packetOutOfppTable = false;

private int flowTimeout = DEFAULT_TIMEOUT;

private int flowPriority = DEFAULT_PRIORITY;

private boolean ipv6Forwarding = false;

private boolean matchDstMacOnly = false;

private boolean matchVlanId = false;

private boolean matchIpv4Address = false;

private boolean matchIpv4Dscp = false;

private boolean matchIpv6Address = false;

private boolean matchIpv6FlowLabel = false;

private boolean matchTcpUdpPorts = false;

private boolean matchIcmpFields = false;

private boolean ignoreIpv4McastPackets = false;

private boolean recordMetrics = false;

 

// Listener 등록

private final TopologyListener topologyListener = new InternalTopologyListener();

 

Method 목록


//App Activate 동작

// 초기 설정과 Listener 추가 Log 찍기

public void activate(ComponentContext context)

 

//App Deactive 동작

// flowRule 제거 packetService 제거, Listener 제거

// Active에서 등록 동작들 제거가 중요  

public void deactivate()

 

// 변경?

public void modified(ComponentContext context)

 

// Request packet in via packet service

// packetService 통해 요청 Packet?

// TrafficSelector 통해 패킷을 선택?

// Ipv4, Ipv6, arp 등인지 확인?

private void requestIntercepts()

 

// Cancel request for packet in via packet service

// 취소 요청?

// 위와 마찬가지로 TrafficeSelector 이용

private void withdrawIntercepts()

 

// Extracts properties from the component configuration context

// 속성 추출?

// Parameter context the component context

// 변수목록중 property 변수들 속성검사하는 부분?

private void readComponentConfiguration(ComponentContext context)

 

// Packet processor responsible for forwarding packets along their paths

// 패킷 전달 ? PacketProcessor 상속

    // 패킷이 handle되었다면 건드리지 않음

    // 패킷 parse, Mac 추출, LLDP 무시

    // ipv4 multicast 패킷은 전송하지 않음

    // 적합한 패킷이라면 instllRule 이용하여 패킷 내리기

    // 경로 찾기 => topologyService.getPaths

    // 경로 못찾을 예외처리

private class ReactivePacketProcessor implements PacketProcessor{

    public void process(PacketContext context)

}

 

// 패킷이 lldp, bddp인지 검사

private boolean isControlPacket(Ethernet eth)

 

//ipv6인지 검사

private boolean isIpv6Multicast(Ethernet eth)

 

// 지정한 특정 포트로 가지 않는 길이 있다면 선택

private Path pickForwardPathIfPossible(Set<Path> paths, PortNumber notToPort)

 

// flood ??

// Floods the specified packet if permissible.

private void flood(PacketContext context, ReactiveForwardMetrics macMetrics)

 

// 특정 포트로 패킷 보내기

// Sends a packet out the specified port.

private void packetOut(PacketContext context, PortNumber portNumber, ReactiveForwardMetrics macMetrics)

 

// Flow Rule 할당

// Install a rule forwarding the packet to the specified port.

// 패킷 parsing, PacketOutOnly or ARP packet 바로 forward

// 목적지 맥이 조건에 맞으면 flow 생성, 맞지 않으면 default matching 생성

// TrafficTreatment ForwardingObjective이용하여 Flow Rule 생성

private void installRule(PacketContext context, PortNumber portNumber, ReactiveForwardMetrics macMetrics)

 

// 이벤트 Listener  구현 

private class InternalTopologyListener implements TopologyListener {

 

// ??

private void fixBlackhole(ConnectPoint egress)

 

// fixBlackhole에서 사용

// Backtracks from link down event to remove flows that lead to blackhole

private void backTrackBadNodes(Set<Path> shortestPaths, DeviceId dstId, SrcDstPair sd)

 

// Flow Rule 지울 참고

// Removes flow rules off specified device with specific SrcDstPair

private void cleanFlowRules(SrcDstPair pair, DeviceId id)

 

 

// flow rule에서 src/dst mac pair 보기

// Returns a set of src/dst MAC pairs extracted from the specified set of flow entries

private Set<SrcDstPair> findSrcDstPairs(Set<FlowEntry> rules)

 

// ??

private ReactiveForwardMetrics createCounter(MacAddress macAddress)

 

// macmetrics.incrementXXXPacket()

// ReactiveForwardMetrics 

private void  forwardPacket(ReactiveForwardMetrics macmetrics

private void inPacket(ReactiveForwardMetrics macmetrics)

private void replyPacket(ReactiveForwardMetrics macmetrics)

private void droppedPacket(ReactiveForwardMetrics macmetrics)

 

public EventuallyConsistentMap<MacAddress, ReactiveForwardMetrics> getMacAddress()

 

public void printMetric(MacAddress mac)

 

//flowRuleService 이용해서 Flowrule 보기?

private Set<FlowEntry> getFlowRulesFrom(ConnectPoint egress)

 

// Wrapper class for a source and destination pair of MAC addresses

private final class SrcDstPair


ReactiveForwardMetrics.java

변수 목록

 

private Long replyPacket = null;

private Long inPacket = null;

private Long droppedPacket = null;

private Long forwardedPacket = null;

private MacAddress macAddress;

 

 

메소드 목록 

// 생성자

ReactiveForwardMetrics(Long replyPacket, Long inPacket, Long droppedPacket,

                           Long forwardedPacket, MacAddress macAddress)

// 각 변수 ++;

public void incremnetReplyPacket() {replyPacket++;}

public void incrementInPacket() { inPacket++; }

public void incrementDroppedPacket() { droppedPacket++; }

public void incrementForwardedPacket() { forwardedPacket++; }

 

//get MacAddress

public MacAddress getMacAddress()

 

//override toString 

@Override

public String toString()



'Dev > ONOS & OF-DPA' 카테고리의 다른 글

[OF-DPA] Spec 문서  (0) 2018.04.25
[ONOS] UNTAGGED Vlan 값에 대해  (0) 2018.04.24
[OF-DPA] EdgecorE 5712에 ONL 2.0, OF-DPA 3.0 EA 설치하기  (0) 2017.08.09
[ONON] Log 설정  (0) 2017.08.08
[ONOS] Log  (0) 2017.08.07