blob: a769759a177f6216db5c6d7d039c50acf0f4bcdf [file] [log] [blame]
Hyunsun Moon44aac662017-02-18 02:07:01 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon44aac662017-02-18 02:07:01 +09003 *
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.openstacknetworking.impl;
17
18import com.google.common.base.Strings;
19import com.google.common.collect.Lists;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Modified;
24import org.apache.felix.scr.annotations.Property;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
27import org.onlab.packet.DHCP;
Hyunsun Moon44aac662017-02-18 02:07:01 +090028import org.onlab.packet.Ethernet;
29import org.onlab.packet.IPv4;
30import org.onlab.packet.Ip4Address;
31import org.onlab.packet.IpPrefix;
32import org.onlab.packet.MacAddress;
33import org.onlab.packet.TpPort;
34import org.onlab.packet.UDP;
daniel park796c2eb2018-03-22 17:01:51 +090035import org.onlab.packet.dhcp.DhcpOption;
Hyunsun Moon44aac662017-02-18 02:07:01 +090036import org.onlab.util.Tools;
37import org.onosproject.cfg.ComponentConfigService;
daniel park15506e82018-04-04 18:52:16 +090038import org.onosproject.cluster.ClusterService;
39import org.onosproject.cluster.LeadershipService;
40import org.onosproject.cluster.NodeId;
Hyunsun Moon44aac662017-02-18 02:07:01 +090041import org.onosproject.core.ApplicationId;
42import org.onosproject.core.CoreService;
43import org.onosproject.net.ConnectPoint;
44import org.onosproject.net.flow.DefaultTrafficSelector;
45import org.onosproject.net.flow.DefaultTrafficTreatment;
46import org.onosproject.net.flow.TrafficSelector;
47import org.onosproject.net.flow.TrafficTreatment;
48import org.onosproject.net.packet.DefaultOutboundPacket;
49import org.onosproject.net.packet.PacketContext;
Hyunsun Moon44aac662017-02-18 02:07:01 +090050import org.onosproject.net.packet.PacketProcessor;
51import org.onosproject.net.packet.PacketService;
52import org.onosproject.openstacknetworking.api.Constants;
53import org.onosproject.openstacknetworking.api.InstancePort;
54import org.onosproject.openstacknetworking.api.InstancePortService;
daniel park796c2eb2018-03-22 17:01:51 +090055import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090056import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
daniel park15506e82018-04-04 18:52:16 +090057import org.onosproject.openstacknode.api.OpenstackNode;
58import org.onosproject.openstacknode.api.OpenstackNodeEvent;
59import org.onosproject.openstacknode.api.OpenstackNodeListener;
daniel park796c2eb2018-03-22 17:01:51 +090060import org.onosproject.openstacknode.api.OpenstackNodeService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090061import org.openstack4j.model.network.IP;
62import org.openstack4j.model.network.Port;
63import org.openstack4j.model.network.Subnet;
64import org.osgi.service.component.ComponentContext;
65import org.slf4j.Logger;
66
67import java.nio.ByteBuffer;
68import java.util.Dictionary;
69import java.util.List;
daniel park15506e82018-04-04 18:52:16 +090070import java.util.Objects;
Hyunsun Moon44aac662017-02-18 02:07:01 +090071
daniel park796c2eb2018-03-22 17:01:51 +090072import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_BroadcastAddress;
73import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_DHCPServerIp;
74import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_DomainServer;
75import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_END;
76import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_LeaseTime;
77import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_MessageType;
78import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_RouterAddress;
79import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_SubnetMask;
Yi Tsengc7403c22017-06-19 16:23:22 -070080import static org.onlab.packet.DHCP.MsgType.DHCPACK;
81import static org.onlab.packet.DHCP.MsgType.DHCPOFFER;
Hyunsun Moon44aac662017-02-18 02:07:01 +090082import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
Jian Li70a2c3f2018-04-13 17:26:31 +090083import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
daniel park796c2eb2018-03-22 17:01:51 +090084import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_DHCP_RULE;
daniel park15506e82018-04-04 18:52:16 +090085import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
Hyunsun Moon44aac662017-02-18 02:07:01 +090086import static org.slf4j.LoggerFactory.getLogger;
87
88/**
89 * Handles DHCP requests for the virtual instances.
90 */
91@Component(immediate = true)
92public class OpenstackSwitchingDhcpHandler {
93 protected final Logger log = getLogger(getClass());
94
95 private static final String DHCP_SERVER_MAC = "dhcpServerMac";
Jian Lifb005492018-03-02 10:50:15 +090096 private static final String DHCP_DATA_MTU = "dhcpDataMtu";
Hyunsun Moon44aac662017-02-18 02:07:01 +090097 private static final Ip4Address DEFAULT_DNS = Ip4Address.valueOf("8.8.8.8");
98 private static final byte PACKET_TTL = (byte) 127;
99 // TODO add MTU, static route option codes to ONOS DHCP and remove here
100 private static final byte DHCP_OPTION_MTU = (byte) 26;
101 private static final byte[] DHCP_DATA_LEASE_INFINITE =
102 ByteBuffer.allocate(4).putInt(-1).array();
Jian Lifb005492018-03-02 10:50:15 +0900103 // we are using 1450 as a default DHCP MTU value
104 private static final int DHCP_DATA_MTU_DEFAULT = 1450;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900105
106 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
107 protected CoreService coreService;
108
109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
110 protected ComponentConfigService configService;
111
112 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
113 protected PacketService packetService;
114
115 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
116 protected InstancePortService instancePortService;
117
118 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
119 protected OpenstackNetworkService osNetworkService;
120
daniel park796c2eb2018-03-22 17:01:51 +0900121 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
122 protected OpenstackNodeService osNodeService;
123
124 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
125 protected OpenstackFlowRuleService osFlowRuleService;
126
daniel park15506e82018-04-04 18:52:16 +0900127 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
128 protected ClusterService clusterService;
129
130 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
131 protected LeadershipService leadershipService;
132
Hyunsun Moon44aac662017-02-18 02:07:01 +0900133 @Property(name = DHCP_SERVER_MAC, value = DEFAULT_GATEWAY_MAC_STR,
134 label = "Fake MAC address for virtual network subnet gateway")
135 private String dhcpServerMac = DEFAULT_GATEWAY_MAC_STR;
136
Jian Lifb005492018-03-02 10:50:15 +0900137 @Property(name = DHCP_DATA_MTU, intValue = DHCP_DATA_MTU_DEFAULT,
138 label = "DHCP data Maximum Transmission Unit")
139 private int dhcpDataMtu = DHCP_DATA_MTU_DEFAULT;
140
Hyunsun Moon44aac662017-02-18 02:07:01 +0900141 private final PacketProcessor packetProcessor = new InternalPacketProcessor();
daniel park15506e82018-04-04 18:52:16 +0900142 private final OpenstackNodeListener osNodeListener = new InternalNodeEventListener();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900143
144 private ApplicationId appId;
daniel park15506e82018-04-04 18:52:16 +0900145 private NodeId localNodeId;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900146
147 @Activate
148 protected void activate() {
149 appId = coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
daniel park15506e82018-04-04 18:52:16 +0900150 localNodeId = clusterService.getLocalNode().id();
151 osNodeService.addListener(osNodeListener);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900152 configService.registerProperties(getClass());
153 packetService.addProcessor(packetProcessor, PacketProcessor.director(0));
daniel park15506e82018-04-04 18:52:16 +0900154 leadershipService.runForLeadership(appId.name());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900155
156 log.info("Started");
157 }
158
159 @Deactivate
160 protected void deactivate() {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900161 packetService.removeProcessor(packetProcessor);
daniel park15506e82018-04-04 18:52:16 +0900162 osNodeService.removeListener(osNodeListener);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900163 configService.unregisterProperties(getClass(), false);
daniel park15506e82018-04-04 18:52:16 +0900164 leadershipService.withdraw(appId.name());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900165
166 log.info("Stopped");
167 }
168
169 @Modified
170 protected void modified(ComponentContext context) {
171 Dictionary<?, ?> properties = context.getProperties();
172 String updatedMac;
Jian Lifb005492018-03-02 10:50:15 +0900173 Integer updateMtu;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900174
175 updatedMac = Tools.get(properties, DHCP_SERVER_MAC);
Jian Lifb005492018-03-02 10:50:15 +0900176 updateMtu = Tools.getIntegerProperty(properties, DHCP_DATA_MTU);
177
Hyunsun Moon44aac662017-02-18 02:07:01 +0900178 if (!Strings.isNullOrEmpty(updatedMac) && !updatedMac.equals(dhcpServerMac)) {
179 dhcpServerMac = updatedMac;
180 }
181
Jian Lifb005492018-03-02 10:50:15 +0900182 if (updateMtu != null && updateMtu != dhcpDataMtu) {
183 dhcpDataMtu = updateMtu;
184 }
185
Hyunsun Moon44aac662017-02-18 02:07:01 +0900186 log.info("Modified");
187 }
188
Hyunsun Moon44aac662017-02-18 02:07:01 +0900189 private class InternalPacketProcessor implements PacketProcessor {
190
191 @Override
192 public void process(PacketContext context) {
193 if (context.isHandled()) {
194 return;
195 }
196
197 Ethernet ethPacket = context.inPacket().parsed();
198 if (ethPacket == null || ethPacket.getEtherType() != Ethernet.TYPE_IPV4) {
199 return;
200 }
201 IPv4 ipv4Packet = (IPv4) ethPacket.getPayload();
202 if (ipv4Packet.getProtocol() != IPv4.PROTOCOL_UDP) {
203 return;
204 }
205 UDP udpPacket = (UDP) ipv4Packet.getPayload();
206 if (udpPacket.getDestinationPort() != UDP.DHCP_SERVER_PORT ||
207 udpPacket.getSourcePort() != UDP.DHCP_CLIENT_PORT) {
208 return;
209 }
210
211 DHCP dhcpPacket = (DHCP) udpPacket.getPayload();
212 processDhcp(context, dhcpPacket);
213 }
214
215 private void processDhcp(PacketContext context, DHCP dhcpPacket) {
216 if (dhcpPacket == null) {
217 log.trace("DHCP packet without payload received, do nothing");
218 return;
219 }
220
Yi Tsengc7403c22017-06-19 16:23:22 -0700221 DHCP.MsgType inPacketType = getPacketType(dhcpPacket);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900222 if (inPacketType == null || dhcpPacket.getClientHardwareAddress() == null) {
223 log.trace("Malformed DHCP packet received, ignore it");
224 return;
225 }
226
227 MacAddress clientMac = MacAddress.valueOf(dhcpPacket.getClientHardwareAddress());
228 InstancePort reqInstPort = instancePortService.instancePort(clientMac);
229 if (reqInstPort == null) {
230 log.trace("Failed to find host(MAC:{})", clientMac);
231 return;
232 }
233 Ethernet ethPacket = context.inPacket().parsed();
234 switch (inPacketType) {
235 case DHCPDISCOVER:
236 log.trace("DHCP DISCOVER received from {}", clientMac);
237 Ethernet discoverReply = buildReply(
238 ethPacket,
239 (byte) DHCPOFFER.getValue(),
240 reqInstPort);
241 sendReply(context, discoverReply);
242 log.trace("DHCP OFFER({}) is sent for {}",
daniel park15506e82018-04-04 18:52:16 +0900243 reqInstPort.ipAddress(), clientMac);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900244 break;
245 case DHCPREQUEST:
246 log.trace("DHCP REQUEST received from {}", clientMac);
247 Ethernet requestReply = buildReply(
248 ethPacket,
249 (byte) DHCPACK.getValue(),
250 reqInstPort);
251 sendReply(context, requestReply);
252 log.trace("DHCP ACK({}) is sent for {}",
daniel park15506e82018-04-04 18:52:16 +0900253 reqInstPort.ipAddress(), clientMac);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900254 break;
255 case DHCPRELEASE:
256 log.trace("DHCP RELEASE received from {}", clientMac);
257 // do nothing
258 break;
259 default:
260 break;
261 }
262 }
263
Yi Tsengc7403c22017-06-19 16:23:22 -0700264 private DHCP.MsgType getPacketType(DHCP dhcpPacket) {
265 DhcpOption optType = dhcpPacket.getOption(OptionCode_MessageType);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900266 if (optType == null) {
267 log.trace("DHCP packet with no message type, ignore it");
268 return null;
269 }
270
Yi Tsengc7403c22017-06-19 16:23:22 -0700271 DHCP.MsgType inPacketType = DHCP.MsgType.getType(optType.getData()[0]);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900272 if (inPacketType == null) {
273 log.trace("DHCP packet with no packet type, ignore it");
274 }
275 return inPacketType;
276 }
277
278 private Ethernet buildReply(Ethernet ethRequest, byte packetType,
279 InstancePort reqInstPort) {
280 Port osPort = osNetworkService.port(reqInstPort.portId());
281 // pick one IP address to make a reply
282 IP fixedIp = osPort.getFixedIps().stream().findFirst().get();
283 Subnet osSubnet = osNetworkService.subnet(fixedIp.getSubnetId());
284
285 Ethernet ethReply = new Ethernet();
286 ethReply.setSourceMACAddress(dhcpServerMac);
287 ethReply.setDestinationMACAddress(ethRequest.getSourceMAC());
288 ethReply.setEtherType(Ethernet.TYPE_IPV4);
289
290 IPv4 ipv4Request = (IPv4) ethRequest.getPayload();
291 IPv4 ipv4Reply = new IPv4();
daniel park15506e82018-04-04 18:52:16 +0900292
293 ipv4Reply.setSourceAddress(clusterService.getLocalNode().ip().getIp4Address().toString());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900294 ipv4Reply.setDestinationAddress(reqInstPort.ipAddress().getIp4Address().toInt());
295 ipv4Reply.setTtl(PACKET_TTL);
296
297 UDP udpRequest = (UDP) ipv4Request.getPayload();
298 UDP udpReply = new UDP();
299 udpReply.setSourcePort((byte) UDP.DHCP_SERVER_PORT);
300 udpReply.setDestinationPort((byte) UDP.DHCP_CLIENT_PORT);
301
302 DHCP dhcpRequest = (DHCP) udpRequest.getPayload();
303 DHCP dhcpReply = buildDhcpReply(
304 dhcpRequest,
305 packetType,
306 reqInstPort.ipAddress().getIp4Address(),
307 osSubnet);
308
309 udpReply.setPayload(dhcpReply);
310 ipv4Reply.setPayload(udpReply);
311 ethReply.setPayload(ipv4Reply);
312
313 return ethReply;
314 }
315
316 private void sendReply(PacketContext context, Ethernet ethReply) {
317 if (ethReply == null) {
318 return;
319 }
320 ConnectPoint srcPoint = context.inPacket().receivedFrom();
321 TrafficTreatment treatment = DefaultTrafficTreatment
322 .builder()
323 .setOutput(srcPoint.port())
324 .build();
325
326 packetService.emit(new DefaultOutboundPacket(
327 srcPoint.deviceId(),
328 treatment,
329 ByteBuffer.wrap(ethReply.serialize())));
330 context.block();
331 }
332
333 private DHCP buildDhcpReply(DHCP request, byte msgType, Ip4Address yourIp,
334 Subnet osSubnet) {
daniel park15506e82018-04-04 18:52:16 +0900335 Ip4Address gatewayIp = clusterService.getLocalNode().ip().getIp4Address();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900336 int subnetPrefixLen = IpPrefix.valueOf(osSubnet.getCidr()).prefixLength();
337
338 DHCP dhcpReply = new DHCP();
339 dhcpReply.setOpCode(DHCP.OPCODE_REPLY);
340 dhcpReply.setHardwareType(DHCP.HWTYPE_ETHERNET);
341 dhcpReply.setHardwareAddressLength((byte) 6);
342 dhcpReply.setTransactionId(request.getTransactionId());
343 dhcpReply.setFlags(request.getFlags());
344 dhcpReply.setYourIPAddress(yourIp.toInt());
345 dhcpReply.setServerIPAddress(gatewayIp.toInt());
346 dhcpReply.setClientHardwareAddress(request.getClientHardwareAddress());
347
Yi Tsengc7403c22017-06-19 16:23:22 -0700348 List<DhcpOption> options = Lists.newArrayList();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900349 // message type
Yi Tsengc7403c22017-06-19 16:23:22 -0700350 DhcpOption option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900351 option.setCode(OptionCode_MessageType.getValue());
352 option.setLength((byte) 1);
353 byte[] optionData = {msgType};
354 option.setData(optionData);
355 options.add(option);
356
357 // server identifier
Yi Tsengc7403c22017-06-19 16:23:22 -0700358 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900359 option.setCode(OptionCode_DHCPServerIp.getValue());
360 option.setLength((byte) 4);
361 option.setData(gatewayIp.toOctets());
362 options.add(option);
363
364 // lease time
Yi Tsengc7403c22017-06-19 16:23:22 -0700365 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900366 option.setCode(OptionCode_LeaseTime.getValue());
367 option.setLength((byte) 4);
368 option.setData(DHCP_DATA_LEASE_INFINITE);
369 options.add(option);
370
371 // subnet mask
372 Ip4Address subnetMask = Ip4Address.makeMaskPrefix(subnetPrefixLen);
Yi Tsengc7403c22017-06-19 16:23:22 -0700373 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900374 option.setCode(OptionCode_SubnetMask.getValue());
375 option.setLength((byte) 4);
376 option.setData(subnetMask.toOctets());
377 options.add(option);
378
379 // broadcast address
380 Ip4Address broadcast = Ip4Address.makeMaskedAddress(yourIp, subnetPrefixLen);
Yi Tsengc7403c22017-06-19 16:23:22 -0700381 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900382 option.setCode(OptionCode_BroadcastAddress.getValue());
383 option.setLength((byte) 4);
384 option.setData(broadcast.toOctets());
385 options.add(option);
386
387 // domain server
Yi Tsengc7403c22017-06-19 16:23:22 -0700388 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900389 option.setCode(OptionCode_DomainServer.getValue());
390 option.setLength((byte) 4);
391 option.setData(DEFAULT_DNS.toOctets());
392 options.add(option);
393
Yi Tsengc7403c22017-06-19 16:23:22 -0700394 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900395 option.setCode(DHCP_OPTION_MTU);
396 option.setLength((byte) 2);
Jian Lifb005492018-03-02 10:50:15 +0900397 option.setData(ByteBuffer.allocate(2).putShort((short) dhcpDataMtu).array());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900398 options.add(option);
399
400 // router address
Yi Tsengc7403c22017-06-19 16:23:22 -0700401 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900402 option.setCode(OptionCode_RouterAddress.getValue());
403 option.setLength((byte) 4);
404 option.setData(gatewayIp.toOctets());
405 options.add(option);
406
407 // end option
Yi Tsengc7403c22017-06-19 16:23:22 -0700408 option = new DhcpOption();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900409 option.setCode(OptionCode_END.getValue());
410 option.setLength((byte) 1);
411 options.add(option);
412
413 dhcpReply.setOptions(options);
414 return dhcpReply;
415 }
416 }
daniel park15506e82018-04-04 18:52:16 +0900417
418 private class InternalNodeEventListener implements OpenstackNodeListener {
419 @Override
420 public boolean isRelevant(OpenstackNodeEvent event) {
421 // do not allow to proceed without leadership
422 NodeId leader = leadershipService.getLeader(appId.name());
423 return Objects.equals(localNodeId, leader);
424 }
425
426 @Override
427 public void event(OpenstackNodeEvent event) {
428 OpenstackNode osNode = event.subject();
429 switch (event.type()) {
430 case OPENSTACK_NODE_COMPLETE:
431 setDhcpRule(osNode, true);
432 break;
433 case OPENSTACK_NODE_INCOMPLETE:
434 setDhcpRule(osNode, false);
435 break;
436 case OPENSTACK_NODE_CREATED:
437 case OPENSTACK_NODE_UPDATED:
438 case OPENSTACK_NODE_REMOVED:
439 default:
440 break;
441 }
442 }
443
444 private void setDhcpRule(OpenstackNode openstackNode, boolean install) {
445 if (openstackNode.type().equals(GATEWAY)) {
446 return;
447 }
448 TrafficSelector selector = DefaultTrafficSelector.builder()
449 .matchEthType(Ethernet.TYPE_IPV4)
450 .matchIPProtocol(IPv4.PROTOCOL_UDP)
451 .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
452 .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
453 .build();
454
455 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
456 .punt()
457 .build();
458
459 osFlowRuleService.setRule(
460 appId,
461 openstackNode.intgBridge(),
462 selector,
463 treatment,
464 PRIORITY_DHCP_RULE,
Jian Li70a2c3f2018-04-13 17:26:31 +0900465 DHCP_ARP_TABLE,
daniel park15506e82018-04-04 18:52:16 +0900466 install);
467 }
468 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900469}