blob: 0ea05f369b1b674a6cb096b517ead1d8bd437bb9 [file] [log] [blame]
Jovana Vuleta1de61262017-06-14 11:10:29 +02001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Jovana Vuleta1de61262017-06-14 11:10:29 +02003 *
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 */
16
17package org.onosproject.drivers.hp;
18
Jovana Vuleta1de61262017-06-14 11:10:29 +020019import 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.OFFlowMod;
24import org.projectfloodlight.openflow.protocol.OFGroupMod;
25import org.projectfloodlight.openflow.protocol.OFGroupType;
26import org.projectfloodlight.openflow.protocol.OFMessage;
27import org.projectfloodlight.openflow.types.OFGroup;
28import org.projectfloodlight.openflow.types.TableId;
29import java.util.concurrent.atomic.AtomicBoolean;
30
31
32/**
33 * HP switch handshaker.
34 * Possibly compliant with all HP OF switches but tested only with HP3800.
35 */
36public class HPSwitchHandshaker extends AbstractOpenFlowSwitch {
37
38 private AtomicBoolean handshakeComplete = new AtomicBoolean(false);
39
40
41 @Override
42 public Boolean supportNxRole() {
43 return false;
44 }
45
46 @Override
47 public void startDriverHandshake() {
48 if (startDriverHandshakeCalled) {
49 throw new SwitchDriverSubHandshakeAlreadyStarted();
50 }
51 startDriverHandshakeCalled = true;
52 OFFlowMod fm = factory().buildFlowDelete()
53 .setTableId(TableId.ALL)
54 .setOutGroup(OFGroup.ANY)
55 .build();
56
alessioff124ad2018-11-13 13:25:51 +010057 sendHandshakeMessage(fm);
Jovana Vuleta1de61262017-06-14 11:10:29 +020058
59 OFGroupMod gm = factory().buildGroupDelete()
60 .setGroup(OFGroup.ALL)
61 .setGroupType(OFGroupType.ALL)
62 .build();
63
alessioff124ad2018-11-13 13:25:51 +010064 sendHandshakeMessage(gm);
Jovana Vuleta1de61262017-06-14 11:10:29 +020065
66 handshakeComplete.set(true);
67
68 log.info("Handshake with device {} ended", super.getStringId());
69
70 }
71
72 @Override
73 public boolean isDriverHandshakeComplete() {
74 if (!startDriverHandshakeCalled) {
75 throw new SwitchDriverSubHandshakeAlreadyStarted();
76 }
77 return handshakeComplete.get();
78 }
79
80 @Override
81 public void processDriverHandshakeMessage(OFMessage m) {
82 if (!startDriverHandshakeCalled) {
83 throw new SwitchDriverSubHandshakeNotStarted();
84 }
85 if (handshakeComplete.get()) {
86 throw new SwitchDriverSubHandshakeCompleted(m);
87 }
88 }
89
90}