blob: a9ba6a151630ba9561e4dffd3831d5371989cef5 [file] [log] [blame]
alshabibb452fd72015-04-22 20:46:20 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.driver.handshaker;
17
Jonathan Gravel8c9f7bc2015-12-03 15:46:20 -050018import org.onosproject.net.meter.MeterId;
alshabibb452fd72015-04-22 20:46:20 -070019import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
20import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
21import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
22import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
23import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
24import org.projectfloodlight.openflow.protocol.OFFlowMod;
Jonathan Gravel8c9f7bc2015-12-03 15:46:20 -050025import org.projectfloodlight.openflow.protocol.OFGroupMod;
26import org.projectfloodlight.openflow.protocol.OFGroupType;
alshabibb452fd72015-04-22 20:46:20 -070027import org.projectfloodlight.openflow.protocol.OFMessage;
Jonathan Gravel8c9f7bc2015-12-03 15:46:20 -050028import org.projectfloodlight.openflow.protocol.OFMeterMod;
alshabibb452fd72015-04-22 20:46:20 -070029import org.projectfloodlight.openflow.protocol.OFType;
30import org.projectfloodlight.openflow.types.OFGroup;
31import org.projectfloodlight.openflow.types.TableId;
32
33import java.util.Collections;
34import java.util.concurrent.atomic.AtomicBoolean;
35
alshabibb452fd72015-04-22 20:46:20 -070036
37/**
Saurav Dasdecd7a62015-05-16 22:39:47 -070038 * Corsa switch handshaker.
alshabibb452fd72015-04-22 20:46:20 -070039 */
Madan Jampani1b8ea342015-05-27 17:22:59 -070040public class CorsaSwitchHandshaker extends AbstractOpenFlowSwitch {
alshabibb452fd72015-04-22 20:46:20 -070041
Madan Jampani1b8ea342015-05-27 17:22:59 -070042 private AtomicBoolean handshakeComplete = new AtomicBoolean(false);
alshabibb452fd72015-04-22 20:46:20 -070043
44 private int barrierXid;
45
46
47 @Override
48 public Boolean supportNxRole() {
49 return false;
50 }
51
52 @Override
53 public void startDriverHandshake() {
54 if (startDriverHandshakeCalled) {
55 throw new SwitchDriverSubHandshakeAlreadyStarted();
56 }
57 startDriverHandshakeCalled = true;
58 OFFlowMod fm = factory().buildFlowDelete()
59 .setTableId(TableId.ALL)
60 .setOutGroup(OFGroup.ANY)
61 .build();
62
63 sendMsg(Collections.singletonList(fm));
64
Jonathan Gravel8c9f7bc2015-12-03 15:46:20 -050065 OFGroupMod gm = factory().buildGroupDelete()
66 .setGroup(OFGroup.ALL)
67 .setGroupType(OFGroupType.ALL)
68 .build();
69
70 sendMsg(Collections.singletonList(gm));
71
72 OFMeterMod mm = factory().buildMeterMod()
73 .setMeterId(MeterId.ALL.id())
74 .build();
75
76 sendMsg(Collections.singletonList(mm));
77
alshabibb452fd72015-04-22 20:46:20 -070078 barrierXid = getNextTransactionId();
79 OFBarrierRequest barrier = factory().buildBarrierRequest()
80 .setXid(barrierXid).build();
81
82
alshabiba2df7b2a2015-05-06 13:57:10 -070083 sendHandshakeMessage(barrier);
alshabibb452fd72015-04-22 20:46:20 -070084
85 }
86
87 @Override
88 public boolean isDriverHandshakeComplete() {
89 if (!startDriverHandshakeCalled) {
90 throw new SwitchDriverSubHandshakeAlreadyStarted();
91 }
Madan Jampani1b8ea342015-05-27 17:22:59 -070092 return handshakeComplete.get();
alshabibb452fd72015-04-22 20:46:20 -070093 }
94
95 @Override
96 public void processDriverHandshakeMessage(OFMessage m) {
97 if (!startDriverHandshakeCalled) {
98 throw new SwitchDriverSubHandshakeNotStarted();
99 }
Madan Jampani1b8ea342015-05-27 17:22:59 -0700100 if (handshakeComplete.get()) {
alshabibb452fd72015-04-22 20:46:20 -0700101 throw new SwitchDriverSubHandshakeCompleted(m);
102 }
103 if (m.getType() == OFType.BARRIER_REPLY &&
104 m.getXid() == barrierXid) {
Madan Jampani1b8ea342015-05-27 17:22:59 -0700105 handshakeComplete.set(true);
alshabibb452fd72015-04-22 20:46:20 -0700106 }
107 }
108
109}