23
23
import org .apache .felix .scr .annotations .ReferenceCardinality ;
24
24
import org .apache .felix .scr .annotations .Service ;
25
25
import org .onlab .packet .EthType .EtherType ;
26
+ import org .onlab .packet .Ethernet ;
26
27
import org .onlab .packet .VlanId ;
27
28
import org .onosproject .core .ApplicationId ;
28
29
import org .onosproject .core .CoreService ;
29
30
import org .onosproject .ecord .carrierethernet .api .CarrierEthernetPacketNodeService ;
30
31
import org .onosproject .net .DeviceId ;
31
32
import org .onosproject .net .PortNumber ;
33
+ import org .onosproject .net .driver .Driver ;
34
+ import org .onosproject .net .driver .DriverService ;
32
35
import org .onosproject .net .flow .DefaultFlowRule ;
33
36
import org .onosproject .net .flow .DefaultTrafficSelector ;
34
37
import org .onosproject .net .flow .DefaultTrafficTreatment ;
35
38
import org .onosproject .net .flow .FlowRule ;
36
39
import org .onosproject .net .flow .FlowRuleService ;
37
40
import org .onosproject .net .flow .TrafficSelector ;
41
+ import org .onosproject .net .flow .TrafficSelector .Builder ;
38
42
import org .onosproject .net .flow .TrafficTreatment ;
39
43
import org .onosproject .net .flow .criteria .Criteria ;
40
44
import org .onosproject .net .flow .criteria .Criterion ;
58
62
import org .onosproject .net .meter .MeterRequest ;
59
63
import org .onosproject .net .meter .MeterService ;
60
64
import org .onosproject .openflow .controller .Dpid ;
61
- import org .onosproject .openflow .controller .OpenFlowController ;
62
- import org .onosproject .openflow .controller .OpenFlowSwitch ;
63
65
import org .slf4j .Logger ;
64
66
65
67
import java .util .Collection ;
@@ -96,9 +98,9 @@ public class CarrierEthernetPacketNodeManager implements CarrierEthernetPacketNo
96
98
@ Reference (cardinality = ReferenceCardinality .MANDATORY_UNARY )
97
99
protected FlowObjectiveService flowObjectiveService ;
98
100
99
- // FIXME App directly depending on SB details is probably not correct
101
+ // FIXME slightly better way to detect OF-DPA issues
100
102
@ Reference (cardinality = ReferenceCardinality .MANDATORY_UNARY )
101
- protected OpenFlowController controller ;
103
+ protected DriverService drivers ;
102
104
103
105
private final Logger log = getLogger (getClass ());
104
106
@@ -198,10 +200,16 @@ private void createFlowObjectives(CarrierEthernetForwardingConstruct fc, Carrier
198
200
// Prepare and submit next and forwarding objectives
199
201
////////////////////////////////////////////////////
200
202
201
- TrafficSelector fwdSelector = DefaultTrafficSelector .builder ()
203
+ Builder fwdSelectorBuilder = DefaultTrafficSelector .builder ()
202
204
.matchVlanId (fc .vlanId ())
203
- .matchInPort (ingressNi .cp ().port ())
204
- .build ();
205
+ .matchInPort (ingressNi .cp ().port ());
206
+
207
+ if (isOfDpa (ingressNi .cp ().deviceId ())) {
208
+ // workaround for OF-DPA
209
+ fwdSelectorBuilder .matchEthType (Ethernet .TYPE_IPV4 );
210
+ }
211
+
212
+ TrafficSelector fwdSelector = fwdSelectorBuilder .build ();
205
213
206
214
Integer nextId = flowObjectiveService .allocateNextId ();
207
215
@@ -261,6 +269,14 @@ public void createBandwidthProfileResources(CarrierEthernetForwardingConstruct f
261
269
deviceMeterIdMap .put (fc .id (), deviceMeterIdSet );
262
270
}
263
271
272
+ private boolean isOfDpa (DeviceId deviceId ) {
273
+ Driver driver = drivers .getDriver (deviceId );
274
+ if (driver != null ) {
275
+ return driver .swVersion ().contains ("OF-DPA" );
276
+ }
277
+ return false ;
278
+ }
279
+
264
280
@ Override
265
281
public void applyBandwidthProfileResources (CarrierEthernetForwardingConstruct fc , CarrierEthernetUni uni ) {
266
282
@@ -273,10 +289,9 @@ public void applyBandwidthProfileResources(CarrierEthernetForwardingConstruct fc
273
289
}
274
290
275
291
Dpid dpid = Dpid .dpid (deviceId .uri ());
276
- OpenFlowSwitch sw = controller .getSwitch (dpid );
277
292
278
293
// Do not apply meters to OFDPA 2.0 switches since they are not currently supported
279
- if (sw . softwareDescription (). equals ( "OF-DPA 2.0" )) {
294
+ if (isOfDpa ( deviceId )) {
280
295
return ;
281
296
}
282
297
0 commit comments