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 |