blob: 944d12a1d97f5917dac631d7b6f907140a978d57 [file] [log] [blame]
sanghoshin94872a12015-10-16 18:04:34 +09001/*
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.openstackswitching;
17
danielbb83ebc2015-10-29 15:13:06 +090018import org.onlab.packet.ARP;
19import org.onlab.packet.Ethernet;
20import org.onlab.packet.Ip4Address;
21import org.onlab.packet.MacAddress;
22import org.onosproject.net.flow.DefaultTrafficTreatment;
23import org.onosproject.net.flow.TrafficTreatment;
24import org.onosproject.net.packet.DefaultOutboundPacket;
sanghoshin94872a12015-10-16 18:04:34 +090025import org.onosproject.net.packet.InboundPacket;
danielbb83ebc2015-10-29 15:13:06 +090026import org.onosproject.net.packet.OutboundPacket;
27import org.onosproject.net.packet.PacketService;
sanghoshin94872a12015-10-16 18:04:34 +090028import org.slf4j.Logger;
29import org.slf4j.LoggerFactory;
danielbb83ebc2015-10-29 15:13:06 +090030import java.nio.ByteBuffer;
sanghoshinf25d2e02015-11-11 23:07:17 +090031
32import static com.google.common.base.Preconditions.checkNotNull;
sanghoshin94872a12015-10-16 18:04:34 +090033
34/**
sanghoshin46297d22015-11-03 17:51:24 +090035 * Handles ARP packet from VMs.
sanghoshin94872a12015-10-16 18:04:34 +090036 */
37public class OpenstackArpHandler {
38
39 private static Logger log = LoggerFactory
40 .getLogger(OpenstackArpHandler.class);
danielbb83ebc2015-10-29 15:13:06 +090041 private PacketService packetService;
sanghoshinf25d2e02015-11-11 23:07:17 +090042 private OpenstackRestHandler restHandler;
sanghoshin94872a12015-10-16 18:04:34 +090043
44 /**
danielbb83ebc2015-10-29 15:13:06 +090045 * Returns OpenstackArpHandler reference.
sanghoshin94872a12015-10-16 18:04:34 +090046 *
sanghoshinf25d2e02015-11-11 23:07:17 +090047 * @param restHandler rest API handler reference
48 * @param packetService PacketService reference
sanghoshin94872a12015-10-16 18:04:34 +090049 */
sanghoshinf25d2e02015-11-11 23:07:17 +090050 public OpenstackArpHandler(OpenstackRestHandler restHandler, PacketService packetService) {
51 this.restHandler = checkNotNull(restHandler);
danielbb83ebc2015-10-29 15:13:06 +090052 this.packetService = packetService;
sanghoshin94872a12015-10-16 18:04:34 +090053 }
54
55 /**
56 * Processes ARP packets.
57 *
58 * @param pkt ARP request packet
59 */
60 public void processPacketIn(InboundPacket pkt) {
danielbb83ebc2015-10-29 15:13:06 +090061 Ethernet ethernet = pkt.parsed();
62 ARP arp = (ARP) ethernet.getPayload();
63
64 if (arp.getOpCode() == ARP.OP_REQUEST) {
65 byte[] srcMacAddress = arp.getSenderHardwareAddress();
66 byte[] srcIPAddress = arp.getSenderProtocolAddress();
67 byte[] dstIPAddress = arp.getTargetProtocolAddress();
68
69 //Searches the Dst MAC Address based on openstackPortMap
70 MacAddress macAddress = null;
71
sanghoshinf25d2e02015-11-11 23:07:17 +090072 OpenstackPort openstackPort = restHandler.getPorts().stream().
73 filter(e -> e.fixedIps().containsValue(Ip4Address.valueOf(
74 dstIPAddress))).findAny().orElse(null);
danielbb83ebc2015-10-29 15:13:06 +090075
76 if (openstackPort != null) {
77 macAddress = openstackPort.macAddress();
78 log.debug("Found MACAddress: {}", macAddress.toString());
79 } else {
80 return;
81 }
82
83 //Creates a response packet
84 ARP arpReply = new ARP();
85 arpReply.setOpCode(ARP.OP_REPLY)
86 .setHardwareAddressLength(arp.getHardwareAddressLength())
87 .setHardwareType(arp.getHardwareType())
88 .setProtocolAddressLength(arp.getProtocolAddressLength())
89 .setProtocolType(arp.getProtocolType())
90 .setSenderHardwareAddress(macAddress.toBytes())
91 .setSenderProtocolAddress(dstIPAddress)
92 .setTargetHardwareAddress(srcMacAddress)
93 .setTargetProtocolAddress(srcIPAddress);
94
95 //Sends a response packet
96 ethernet.setDestinationMACAddress(srcMacAddress)
97 .setSourceMACAddress(macAddress)
98 .setEtherType(Ethernet.TYPE_ARP)
99 .setPayload(arpReply);
100
101 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
102 builder.setOutput(pkt.receivedFrom().port());
103 OutboundPacket packet = new DefaultOutboundPacket(pkt.receivedFrom().deviceId(),
104 builder.build(), ByteBuffer.wrap(ethernet.serialize()));
105 packetService.emit(packet);
106 }
sanghoshin94872a12015-10-16 18:04:34 +0900107 }
108}