6060
6161import static java .util .concurrent .Executors .newSingleThreadExecutor ;
6262import static org .onlab .util .Tools .groupedThreads ;
63+ import static org .onosproject .net .AnnotationKeys .PORT_NAME ;
6364import static org .onosproject .openstacknetworking .api .Constants .ACL_EGRESS_TABLE ;
6465import static org .onosproject .openstacknetworking .api .Constants .ARP_BROADCAST_MODE ;
6566import static org .onosproject .openstacknetworking .api .Constants .ARP_TABLE ;
7778import static org .onosproject .openstacknetworking .api .Constants .VTAG_TABLE ;
7879import static org .onosproject .openstacknetworking .api .InstancePortEvent .Type .OPENSTACK_INSTANCE_MIGRATION_STARTED ;
7980import static org .onosproject .openstacknetworking .util .OpenstackNetworkingUtil .getPropertyValue ;
81+ import static org .onosproject .openstacknetworking .util .OpenstackNetworkingUtil .structurePortName ;
8082import static org .onosproject .openstacknetworking .util .OpenstackNetworkingUtil .swapStaleLocation ;
8183import static org .onosproject .openstacknetworking .util .OpenstackNetworkingUtil .tunnelPortNumByNetId ;
8284import static org .onosproject .openstacknetworking .util .RulePopulatorUtil .buildExtension ;
85+ import static org .onosproject .openstacknode .api .Constants .INTEGRATION_TO_PHYSICAL_PREFIX ;
8386import static org .onosproject .openstacknode .api .OpenstackNode .NodeType .COMPUTE ;
8487import static org .slf4j .LoggerFactory .getLogger ;
8588
@@ -158,68 +161,54 @@ protected void deactivate() {
158161 log .info ("Stopped" );
159162 }
160163
161- private void setFlatJumpRules (InstancePort port , boolean install ) {
162- TrafficSelector .Builder selector = DefaultTrafficSelector .builder ();
163- selector .matchInPort (port .portNumber ());
164+ private void setJumpRulesForFlat (InstancePort port , boolean install ) {
165+ TrafficSelector selector = DefaultTrafficSelector .builder ()
166+ .matchInPort (port .portNumber ())
167+ .build ();
164168
165- TrafficTreatment .Builder treatment = DefaultTrafficTreatment .builder ();
166- treatment .transition (STAT_FLAT_OUTBOUND_TABLE );
169+ TrafficTreatment treatment = DefaultTrafficTreatment .builder ()
170+ .transition (STAT_FLAT_OUTBOUND_TABLE )
171+ .build ();
167172
168173 osFlowRuleService .setRule (
169174 appId ,
170175 port .deviceId (),
171- selector . build () ,
172- treatment . build () ,
176+ selector ,
177+ treatment ,
173178 PRIORITY_FLAT_JUMP_UPSTREAM_RULE ,
174179 DHCP_TABLE ,
175180 install );
181+ }
176182
177- Network network = osNetworkService .network (port .networkId ());
183+ private void setDownstreamRuleForFlat (InstancePort instPort ,
184+ short ethType , boolean install ) {
185+ TrafficSelector .Builder sBuilder = DefaultTrafficSelector .builder ();
178186
179- if (network == null ) {
180- log .warn ("The network does not exist" );
181- return ;
187+ if (ethType == Ethernet .TYPE_IPV4 ) {
188+ sBuilder .matchEthType (Ethernet .TYPE_IPV4 )
189+ .matchIPDst (instPort .ipAddress ().toIpPrefix ());
190+ } else if (ethType == Ethernet .TYPE_ARP ) {
191+ sBuilder .matchEthType (Ethernet .TYPE_ARP )
192+ .matchArpTpa (instPort .ipAddress ().getIp4Address ());
182193 }
183- PortNumber portNumber = osNodeService .node (port .deviceId ())
184- .phyIntfPortNum (network .getProviderPhyNet ());
185194
186- if (portNumber == null ) {
187- log .warn ("The port number does not exist" );
188- return ;
189- }
190- }
191-
192- private void setDownstreamRulesForFlat (InstancePort instPort , boolean install ) {
193- TrafficSelector selector = DefaultTrafficSelector .builder ()
194- .matchEthType (Ethernet .TYPE_IPV4 )
195- .matchIPDst (instPort .ipAddress ().toIpPrefix ())
196- .build ();
197195 TrafficTreatment treatment = DefaultTrafficTreatment .builder ()
198196 .setOutput (instPort .portNumber ())
199197 .build ();
200198
201199 osFlowRuleService .setRule (
202200 appId ,
203201 instPort .deviceId (),
204- selector ,
202+ sBuilder . build () ,
205203 treatment ,
206204 PRIORITY_FLAT_DOWNSTREAM_RULE ,
207205 FLAT_TABLE ,
208206 install );
207+ }
209208
210- selector = DefaultTrafficSelector .builder ()
211- .matchEthType (Ethernet .TYPE_ARP )
212- .matchArpTpa (instPort .ipAddress ().getIp4Address ())
213- .build ();
214-
215- osFlowRuleService .setRule (
216- appId ,
217- instPort .deviceId (),
218- selector ,
219- treatment ,
220- PRIORITY_FLAT_DOWNSTREAM_RULE ,
221- FLAT_TABLE ,
222- install );
209+ private void setDownstreamRulesForFlat (InstancePort instPort , boolean install ) {
210+ setDownstreamRuleForFlat (instPort , Ethernet .TYPE_IPV4 , install );
211+ setDownstreamRuleForFlat (instPort , Ethernet .TYPE_ARP , install );
223212 }
224213
225214 private void setUpstreamRulesForFlat (InstancePort instPort , boolean install ) {
@@ -234,26 +223,27 @@ private void setUpstreamRulesForFlat(InstancePort instPort, boolean install) {
234223 return ;
235224 }
236225
237- PortNumber portNumber = osNodeService . node (instPort .deviceId ())
238- .phyIntfPortNum ( network . getProviderPhyNet ());
239-
240- if ( portNumber == null ) {
241- log . warn ( "The port number does not exist" );
242- return ;
243- }
244-
245- TrafficTreatment treatment = DefaultTrafficTreatment .builder ()
246- .setOutput (portNumber )
247- .build ();
226+ deviceService . getPorts (instPort .deviceId ()). stream ( )
227+ .filter ( port -> {
228+ String annotPortName = port . annotations (). value ( PORT_NAME );
229+ String portName = structurePortName ( INTEGRATION_TO_PHYSICAL_PREFIX
230+ + network . getProviderPhyNet () );
231+ return Objects . equals ( annotPortName , portName ) ;
232+ })
233+ . findAny (). ifPresent ( port -> {
234+ TrafficTreatment treatment = DefaultTrafficTreatment .builder ()
235+ .setOutput (port . number () )
236+ .build ();
248237
249- osFlowRuleService .setRule (
250- appId ,
251- instPort .deviceId (),
252- selector ,
253- treatment ,
254- PRIORITY_FLAT_UPSTREAM_RULE ,
255- FLAT_TABLE ,
256- install );
238+ osFlowRuleService .setRule (
239+ appId ,
240+ instPort .deviceId (),
241+ selector ,
242+ treatment ,
243+ PRIORITY_FLAT_UPSTREAM_RULE ,
244+ FLAT_TABLE ,
245+ install );
246+ });
257247 }
258248
259249 /**
@@ -750,7 +740,7 @@ private void setNetworkRulesForVlan(InstancePort instPort, boolean install) {
750740 }
751741
752742 private void setNetworkRulesForFlat (InstancePort instPort , boolean install ) {
753- setFlatJumpRules (instPort , install );
743+ setJumpRulesForFlat (instPort , install );
754744 setDownstreamRulesForFlat (instPort , install );
755745 setUpstreamRulesForFlat (instPort , install );
756746 }
@@ -798,7 +788,7 @@ private void removeVportRulesForVlan(InstancePort instPort) {
798788 }
799789
800790 private void removeVportRulesForFlat (InstancePort instPort ) {
801- setFlatJumpRules (instPort , false );
791+ setJumpRulesForFlat (instPort , false );
802792 setUpstreamRulesForFlat (instPort , false );
803793 setDownstreamRulesForFlat (instPort , false );
804794 }
0 commit comments