Committed by
Gerrit Code Review
SONA: openstackSwitching
-Added ARP handler -Added OpenstackSubnet to encode and decode subnet-related message from Openstack -Rebased with 5896 (Modified DhcpService for OpenStack) Change-Id: Ic63e5c82d0301fa5c45d1a41548d8dc3a8b1ec57
Showing
12 changed files
with
460 additions
and
98 deletions
... | @@ -80,6 +80,11 @@ | ... | @@ -80,6 +80,11 @@ |
80 | <groupId>org.osgi</groupId> | 80 | <groupId>org.osgi</groupId> |
81 | <artifactId>org.osgi.core</artifactId> | 81 | <artifactId>org.osgi.core</artifactId> |
82 | </dependency> | 82 | </dependency> |
83 | + <dependency> | ||
84 | + <groupId>org.onosproject</groupId> | ||
85 | + <artifactId>onos-app-dhcp-api</artifactId> | ||
86 | + <version>${project.version}</version> | ||
87 | + </dependency> | ||
83 | </dependencies> | 88 | </dependencies> |
84 | 89 | ||
85 | <build> | 90 | <build> | ... | ... |
... | @@ -15,11 +15,20 @@ | ... | @@ -15,11 +15,20 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.openstackswitching; | 16 | package org.onosproject.openstackswitching; |
17 | 17 | ||
18 | +import org.onlab.packet.ARP; | ||
19 | +import org.onlab.packet.Ethernet; | ||
20 | +import org.onlab.packet.Ip4Address; | ||
21 | +import org.onlab.packet.MacAddress; | ||
22 | +import org.onosproject.net.flow.DefaultTrafficTreatment; | ||
23 | +import org.onosproject.net.flow.TrafficTreatment; | ||
24 | +import org.onosproject.net.packet.DefaultOutboundPacket; | ||
18 | import org.onosproject.net.packet.InboundPacket; | 25 | import org.onosproject.net.packet.InboundPacket; |
26 | +import org.onosproject.net.packet.OutboundPacket; | ||
27 | +import org.onosproject.net.packet.PacketService; | ||
19 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
20 | import org.slf4j.LoggerFactory; | 29 | import org.slf4j.LoggerFactory; |
21 | - | 30 | +import java.nio.ByteBuffer; |
22 | -import java.util.HashMap; | 31 | +import java.util.Map; |
23 | 32 | ||
24 | /** | 33 | /** |
25 | * It handles ARP packet from VMs. | 34 | * It handles ARP packet from VMs. |
... | @@ -28,16 +37,18 @@ public class OpenstackArpHandler { | ... | @@ -28,16 +37,18 @@ public class OpenstackArpHandler { |
28 | 37 | ||
29 | private static Logger log = LoggerFactory | 38 | private static Logger log = LoggerFactory |
30 | .getLogger(OpenstackArpHandler.class); | 39 | .getLogger(OpenstackArpHandler.class); |
31 | - | 40 | + private PacketService packetService; |
32 | - HashMap<String, OpenstackPort> openstackPortHashMap; | 41 | + private Map<String, OpenstackPort> openstackPortMap; |
33 | 42 | ||
34 | /** | 43 | /** |
35 | - * Constructs an OpenstackArpHandler. | 44 | + * Returns OpenstackArpHandler reference. |
36 | * | 45 | * |
37 | - * @param openstackPortMap port map | 46 | + * @param openstackPortMap |
47 | + * @param packetService | ||
38 | */ | 48 | */ |
39 | - public OpenstackArpHandler(HashMap<String, OpenstackPort> openstackPortMap) { | 49 | + public OpenstackArpHandler(Map<String, OpenstackPort> openstackPortMap, PacketService packetService) { |
40 | - this.openstackPortHashMap = openstackPortMap; | 50 | + this.openstackPortMap = openstackPortMap; |
51 | + this.packetService = packetService; | ||
41 | } | 52 | } |
42 | 53 | ||
43 | /** | 54 | /** |
... | @@ -46,6 +57,50 @@ public class OpenstackArpHandler { | ... | @@ -46,6 +57,50 @@ public class OpenstackArpHandler { |
46 | * @param pkt ARP request packet | 57 | * @param pkt ARP request packet |
47 | */ | 58 | */ |
48 | public void processPacketIn(InboundPacket pkt) { | 59 | public void processPacketIn(InboundPacket pkt) { |
49 | - log.warn("Received an ARP packet"); | 60 | + Ethernet ethernet = pkt.parsed(); |
61 | + ARP arp = (ARP) ethernet.getPayload(); | ||
62 | + | ||
63 | + if (arp.getOpCode() == ARP.OP_REQUEST) { | ||
64 | + byte[] srcMacAddress = arp.getSenderHardwareAddress(); | ||
65 | + byte[] srcIPAddress = arp.getSenderProtocolAddress(); | ||
66 | + byte[] dstIPAddress = arp.getTargetProtocolAddress(); | ||
67 | + | ||
68 | + //Searches the Dst MAC Address based on openstackPortMap | ||
69 | + MacAddress macAddress = null; | ||
70 | + | ||
71 | + OpenstackPort openstackPort = openstackPortMap.values().stream().filter(e -> e.fixedIps(). | ||
72 | + containsValue(Ip4Address.valueOf(dstIPAddress))).findAny().orElse(null); | ||
73 | + | ||
74 | + if (openstackPort != null) { | ||
75 | + macAddress = openstackPort.macAddress(); | ||
76 | + log.debug("Found MACAddress: {}", macAddress.toString()); | ||
77 | + } else { | ||
78 | + return; | ||
79 | + } | ||
80 | + | ||
81 | + //Creates a response packet | ||
82 | + ARP arpReply = new ARP(); | ||
83 | + arpReply.setOpCode(ARP.OP_REPLY) | ||
84 | + .setHardwareAddressLength(arp.getHardwareAddressLength()) | ||
85 | + .setHardwareType(arp.getHardwareType()) | ||
86 | + .setProtocolAddressLength(arp.getProtocolAddressLength()) | ||
87 | + .setProtocolType(arp.getProtocolType()) | ||
88 | + .setSenderHardwareAddress(macAddress.toBytes()) | ||
89 | + .setSenderProtocolAddress(dstIPAddress) | ||
90 | + .setTargetHardwareAddress(srcMacAddress) | ||
91 | + .setTargetProtocolAddress(srcIPAddress); | ||
92 | + | ||
93 | + //Sends a response packet | ||
94 | + ethernet.setDestinationMACAddress(srcMacAddress) | ||
95 | + .setSourceMACAddress(macAddress) | ||
96 | + .setEtherType(Ethernet.TYPE_ARP) | ||
97 | + .setPayload(arpReply); | ||
98 | + | ||
99 | + TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder(); | ||
100 | + builder.setOutput(pkt.receivedFrom().port()); | ||
101 | + OutboundPacket packet = new DefaultOutboundPacket(pkt.receivedFrom().deviceId(), | ||
102 | + builder.build(), ByteBuffer.wrap(ethernet.serialize())); | ||
103 | + packetService.emit(packet); | ||
104 | + } | ||
50 | } | 105 | } |
51 | } | 106 | } | ... | ... |
1 | -/* | ||
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 | -*/ | ||
16 | -package org.onosproject.openstackswitching; | ||
17 | - | ||
18 | -import org.onosproject.net.packet.InboundPacket; | ||
19 | -import org.slf4j.Logger; | ||
20 | -import org.slf4j.LoggerFactory; | ||
21 | - | ||
22 | -/** | ||
23 | - * It handles DHCP request packets. | ||
24 | - */ | ||
25 | -public class OpenstackDhcpHandler { | ||
26 | - | ||
27 | - private static Logger log = LoggerFactory | ||
28 | - .getLogger(OpenstackDhcpHandler.class); | ||
29 | - | ||
30 | - /** | ||
31 | - * Returns OpenstackDhcpHandler reference. | ||
32 | - */ | ||
33 | - public OpenstackDhcpHandler() { | ||
34 | - | ||
35 | - } | ||
36 | - | ||
37 | - /** | ||
38 | - * Processes DHCP request packets. | ||
39 | - * | ||
40 | - * @param pkt DHCP request packet | ||
41 | - */ | ||
42 | - public void processPacketIn(InboundPacket pkt) { | ||
43 | - log.warn("Received a DHCP packet"); | ||
44 | - } | ||
45 | -} |
... | @@ -26,8 +26,18 @@ public final class OpenstackNetwork { | ... | @@ -26,8 +26,18 @@ public final class OpenstackNetwork { |
26 | private String name; | 26 | private String name; |
27 | private String tenantId; | 27 | private String tenantId; |
28 | private String segmentId; | 28 | private String segmentId; |
29 | - private String networkType; | ||
30 | private String id; | 29 | private String id; |
30 | + private NetworkType networkType; | ||
31 | + | ||
32 | + public enum NetworkType { | ||
33 | + /** | ||
34 | + * Currently only VXLAN moded is supported. | ||
35 | + */ | ||
36 | + VXLAN, | ||
37 | + VLAN, | ||
38 | + STT, | ||
39 | + LOCAL | ||
40 | + } | ||
31 | 41 | ||
32 | /** | 42 | /** |
33 | * Returns the builder object of the OpenstackNetwork class. | 43 | * Returns the builder object of the OpenstackNetwork class. |
... | @@ -39,12 +49,12 @@ public final class OpenstackNetwork { | ... | @@ -39,12 +49,12 @@ public final class OpenstackNetwork { |
39 | } | 49 | } |
40 | 50 | ||
41 | private OpenstackNetwork(String name, String tenantId, String id, String sid, | 51 | private OpenstackNetwork(String name, String tenantId, String id, String sid, |
42 | - String type) { | 52 | + NetworkType type) { |
43 | this.name = checkNotNull(name); | 53 | this.name = checkNotNull(name); |
44 | this.tenantId = checkNotNull(tenantId); | 54 | this.tenantId = checkNotNull(tenantId); |
45 | this.segmentId = checkNotNull(sid); | 55 | this.segmentId = checkNotNull(sid); |
46 | this.id = checkNotNull(id); | 56 | this.id = checkNotNull(id); |
47 | - this.networkType = checkNotNull(type); | 57 | + this.networkType = type; |
48 | } | 58 | } |
49 | 59 | ||
50 | public String name() { | 60 | public String name() { |
... | @@ -63,7 +73,7 @@ public final class OpenstackNetwork { | ... | @@ -63,7 +73,7 @@ public final class OpenstackNetwork { |
63 | return this.segmentId; | 73 | return this.segmentId; |
64 | } | 74 | } |
65 | 75 | ||
66 | - public String networkType() { | 76 | + public NetworkType networkType() { |
67 | return this.networkType; | 77 | return this.networkType; |
68 | } | 78 | } |
69 | 79 | ||
... | @@ -72,7 +82,7 @@ public final class OpenstackNetwork { | ... | @@ -72,7 +82,7 @@ public final class OpenstackNetwork { |
72 | private String tenantId; | 82 | private String tenantId; |
73 | private String id; | 83 | private String id; |
74 | private String sid; | 84 | private String sid; |
75 | - private String networkType; | 85 | + private NetworkType networkType; |
76 | 86 | ||
77 | public Builder name(String name) { | 87 | public Builder name(String name) { |
78 | this.name = name; | 88 | this.name = name; |
... | @@ -98,7 +108,7 @@ public final class OpenstackNetwork { | ... | @@ -98,7 +108,7 @@ public final class OpenstackNetwork { |
98 | return this; | 108 | return this; |
99 | } | 109 | } |
100 | 110 | ||
101 | - public Builder networkType(String type) { | 111 | + public Builder networkType(NetworkType type) { |
102 | this.networkType = type; | 112 | this.networkType = type; |
103 | 113 | ||
104 | return this; | 114 | return this; | ... | ... |
apps/openstackswitching/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java
0 → 100644
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.openstackswitching; | ||
17 | + | ||
18 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
19 | + | ||
20 | +/** | ||
21 | + * Represents the subnet information given by Neutron. | ||
22 | + * | ||
23 | + */ | ||
24 | +public final class OpenstackSubnet { | ||
25 | + private String name; | ||
26 | + private boolean enableHhcp; | ||
27 | + private String networkId; | ||
28 | + private String tenantId; | ||
29 | + private String dnsNameservers; | ||
30 | + private String gatewayIp; | ||
31 | + private String cidr; | ||
32 | + private String id; | ||
33 | + | ||
34 | + private OpenstackSubnet(String name, boolean enableHhcp, String networkId, | ||
35 | + String tenantId, String dnsNameservers, String gatewayIp, | ||
36 | + String cidr, String id) { | ||
37 | + this.name = name; | ||
38 | + this.enableHhcp = enableHhcp; | ||
39 | + this.networkId = checkNotNull(networkId); | ||
40 | + this.tenantId = checkNotNull(tenantId); | ||
41 | + this.dnsNameservers = dnsNameservers; | ||
42 | + this.gatewayIp = gatewayIp; | ||
43 | + this.cidr = checkNotNull(cidr); | ||
44 | + this.id = checkNotNull(id); | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * Returns OpenstackSubnet builder object. | ||
49 | + * | ||
50 | + * @return OpenstackSubnet builder | ||
51 | + */ | ||
52 | + public static OpenstackSubnet.Builder builder() { | ||
53 | + return new Builder(); | ||
54 | + } | ||
55 | + | ||
56 | + public String name() { | ||
57 | + return name; | ||
58 | + } | ||
59 | + | ||
60 | + public boolean enableHhcp() { | ||
61 | + return enableHhcp; | ||
62 | + } | ||
63 | + | ||
64 | + public String networkId() { | ||
65 | + return networkId; | ||
66 | + } | ||
67 | + | ||
68 | + public String tenantId() { | ||
69 | + return tenantId; | ||
70 | + } | ||
71 | + | ||
72 | + public String dnsNameservers() { | ||
73 | + return dnsNameservers; | ||
74 | + } | ||
75 | + | ||
76 | + public String gatewayIp() { | ||
77 | + return gatewayIp; | ||
78 | + } | ||
79 | + | ||
80 | + public String cidr() { | ||
81 | + return cidr; | ||
82 | + } | ||
83 | + | ||
84 | + public String id() { | ||
85 | + return id; | ||
86 | + } | ||
87 | + | ||
88 | + // TODO : Implement the following functions when necessary | ||
89 | + | ||
90 | + /** | ||
91 | + * OpenstackSubnet Builder class. | ||
92 | + * | ||
93 | + */ | ||
94 | + public static final class Builder { | ||
95 | + private String name; | ||
96 | + private boolean enableDhcp; | ||
97 | + private String networkId; | ||
98 | + private String tenantId; | ||
99 | + private String dnsNameservers; | ||
100 | + private String gatewayIp; | ||
101 | + private String cidr; | ||
102 | + private String id; | ||
103 | + | ||
104 | + Builder() {} | ||
105 | + | ||
106 | + public Builder setName(String name) { | ||
107 | + this.name = name; | ||
108 | + | ||
109 | + return this; | ||
110 | + } | ||
111 | + | ||
112 | + public Builder setEnableDhcp(boolean enableDhcp) { | ||
113 | + this.enableDhcp = enableDhcp; | ||
114 | + | ||
115 | + return this; | ||
116 | + } | ||
117 | + | ||
118 | + public Builder setNetworkId(String networkId) { | ||
119 | + this.networkId = networkId; | ||
120 | + | ||
121 | + return this; | ||
122 | + } | ||
123 | + | ||
124 | + public Builder setTenantId(String tenantId) { | ||
125 | + this.tenantId = tenantId; | ||
126 | + | ||
127 | + return this; | ||
128 | + } | ||
129 | + | ||
130 | + public Builder setDnsNameservers(String dnsNameservers) { | ||
131 | + this.dnsNameservers = dnsNameservers; | ||
132 | + | ||
133 | + return this; | ||
134 | + } | ||
135 | + | ||
136 | + public Builder setGatewayIp(String gatewayIp) { | ||
137 | + this.gatewayIp = gatewayIp; | ||
138 | + | ||
139 | + return this; | ||
140 | + } | ||
141 | + | ||
142 | + public Builder setCidr(String cidr) { | ||
143 | + this.cidr = cidr; | ||
144 | + | ||
145 | + return this; | ||
146 | + } | ||
147 | + | ||
148 | + public Builder setId(String id) { | ||
149 | + this.id = id; | ||
150 | + | ||
151 | + return this; | ||
152 | + } | ||
153 | + | ||
154 | + public OpenstackSubnet build() { | ||
155 | + return new OpenstackSubnet(name, enableDhcp, networkId, tenantId, | ||
156 | + dnsNameservers, gatewayIp, cidr, id); | ||
157 | + } | ||
158 | + } | ||
159 | +} |
... | @@ -24,13 +24,12 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -24,13 +24,12 @@ import org.apache.felix.scr.annotations.Reference; |
24 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 24 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
25 | import org.apache.felix.scr.annotations.Service; | 25 | import org.apache.felix.scr.annotations.Service; |
26 | import org.onlab.packet.Ethernet; | 26 | import org.onlab.packet.Ethernet; |
27 | -import org.onlab.packet.IPv4; | ||
28 | import org.onlab.packet.Ip4Address; | 27 | import org.onlab.packet.Ip4Address; |
29 | import org.onlab.packet.Ip4Prefix; | 28 | import org.onlab.packet.Ip4Prefix; |
30 | import org.onlab.packet.MacAddress; | 29 | import org.onlab.packet.MacAddress; |
31 | -import org.onlab.packet.UDP; | ||
32 | import org.onosproject.core.ApplicationId; | 30 | import org.onosproject.core.ApplicationId; |
33 | import org.onosproject.core.CoreService; | 31 | import org.onosproject.core.CoreService; |
32 | +import org.onosproject.dhcp.DhcpService; | ||
34 | import org.onosproject.net.Device; | 33 | import org.onosproject.net.Device; |
35 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
36 | import org.onosproject.net.Port; | 35 | import org.onosproject.net.Port; |
... | @@ -45,8 +44,8 @@ import org.onosproject.net.packet.PacketService; | ... | @@ -45,8 +44,8 @@ import org.onosproject.net.packet.PacketService; |
45 | import org.slf4j.Logger; | 44 | import org.slf4j.Logger; |
46 | import org.slf4j.LoggerFactory; | 45 | import org.slf4j.LoggerFactory; |
47 | 46 | ||
48 | -import java.util.HashMap; | ||
49 | import java.util.List; | 47 | import java.util.List; |
48 | +import java.util.Map; | ||
50 | import java.util.concurrent.ExecutorService; | 49 | import java.util.concurrent.ExecutorService; |
51 | import java.util.concurrent.Executors; | 50 | import java.util.concurrent.Executors; |
52 | 51 | ||
... | @@ -73,12 +72,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -73,12 +72,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
73 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 72 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
74 | protected FlowObjectiveService flowObjectiveService; | 73 | protected FlowObjectiveService flowObjectiveService; |
75 | 74 | ||
75 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
76 | + protected DhcpService dhcpService; | ||
76 | 77 | ||
77 | public static final int DHCP_PORT = 67; | 78 | public static final int DHCP_PORT = 67; |
78 | 79 | ||
79 | private ApplicationId appId; | 80 | private ApplicationId appId; |
80 | private OpenstackArpHandler arpHandler; | 81 | private OpenstackArpHandler arpHandler; |
81 | - private OpenstackDhcpHandler dhcpHandler = new OpenstackDhcpHandler(); | 82 | + |
82 | private OpenstackSwitchingRulePopulator rulePopulator; | 83 | private OpenstackSwitchingRulePopulator rulePopulator; |
83 | private ExecutorService deviceEventExcutorService = Executors.newFixedThreadPool(10); | 84 | private ExecutorService deviceEventExcutorService = Executors.newFixedThreadPool(10); |
84 | 85 | ||
... | @@ -86,12 +87,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -86,12 +87,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
86 | private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); | 87 | private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); |
87 | 88 | ||
88 | // Map <port_id, OpenstackPort> | 89 | // Map <port_id, OpenstackPort> |
89 | - private HashMap<String, OpenstackPort> openstackPortMap; | 90 | + private Map<String, OpenstackPort> openstackPortMap; |
90 | // Map <network_id, OpenstackNetwork> | 91 | // Map <network_id, OpenstackNetwork> |
91 | - private HashMap<String, OpenstackNetwork> openstackNetworkMap; | 92 | + private Map<String, OpenstackNetwork> openstackNetworkMap; |
93 | + // Map <subnet_id, OpenstackSubner> | ||
94 | + private Map<String, OpenstackSubnet> openstackSubnetMap; | ||
92 | // Map <vni, List <Entry <portName, host ip>> | 95 | // Map <vni, List <Entry <portName, host ip>> |
93 | - private HashMap<String, List<PortInfo>> vniPortMap; | 96 | + private Map<String, List<PortInfo>> vniPortMap; |
94 | - private HashMap<Ip4Address, Port> tunnelPortMap; | 97 | + private Map<Ip4Address, Port> tunnelPortMap; |
95 | 98 | ||
96 | 99 | ||
97 | @Activate | 100 | @Activate |
... | @@ -104,11 +107,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -104,11 +107,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
104 | 107 | ||
105 | openstackPortMap = Maps.newHashMap(); | 108 | openstackPortMap = Maps.newHashMap(); |
106 | openstackNetworkMap = Maps.newHashMap(); | 109 | openstackNetworkMap = Maps.newHashMap(); |
110 | + openstackSubnetMap = Maps.newHashMap(); | ||
111 | + | ||
107 | vniPortMap = Maps.newHashMap(); | 112 | vniPortMap = Maps.newHashMap(); |
108 | tunnelPortMap = Maps.newHashMap(); | 113 | tunnelPortMap = Maps.newHashMap(); |
109 | - | 114 | + arpHandler = new OpenstackArpHandler(openstackPortMap, packetService); |
110 | - arpHandler = new OpenstackArpHandler(openstackPortMap); | ||
111 | - | ||
112 | log.info("Started"); | 115 | log.info("Started"); |
113 | } | 116 | } |
114 | 117 | ||
... | @@ -124,9 +127,43 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -124,9 +127,43 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
124 | 127 | ||
125 | @Override | 128 | @Override |
126 | public void createPorts(OpenstackPort openstackPort) { | 129 | public void createPorts(OpenstackPort openstackPort) { |
130 | + //For DHCP purpose | ||
131 | + //registerDhcpInfo(openstackPort); | ||
127 | openstackPortMap.put(openstackPort.id(), openstackPort); | 132 | openstackPortMap.put(openstackPort.id(), openstackPort); |
128 | } | 133 | } |
129 | 134 | ||
135 | + /* | ||
136 | + private void registerDhcpInfo(OpenstackPort openstackPort) { | ||
137 | + Ip4Address ip4Address; | ||
138 | + Ip4Address subnetMask; | ||
139 | + Ip4Address dhcpServer; | ||
140 | + Ip4Address gatewayIPAddress; | ||
141 | + Ip4Address domainServer; | ||
142 | + OpenstackSubnet openstackSubnet; | ||
143 | + | ||
144 | + ip4Address = (Ip4Address) openstackPort.fixedIps().values().toArray()[0]; | ||
145 | + | ||
146 | + openstackSubnet = openstackSubnetMap.values().stream() | ||
147 | + .filter(n -> n.networkId().equals(openstackPort.networkId())) | ||
148 | + .findFirst().get(); | ||
149 | + | ||
150 | + int prefix; | ||
151 | + String[] parts = openstackSubnet.cidr().split("/"); | ||
152 | + prefix = Integer.parseInt(parts[1]); | ||
153 | + int mask = 0xffffffff << (32 - prefix); | ||
154 | + byte[] bytes = new byte[]{(byte) (mask >>> 24), | ||
155 | + (byte) (mask >> 16 & 0xff), (byte) (mask >> 8 & 0xff), (byte) (mask & 0xff)}; | ||
156 | + | ||
157 | + subnetMask = Ip4Address.valueOf(bytes); | ||
158 | + gatewayIPAddress = Ip4Address.valueOf(openstackSubnet.gatewayIp()); | ||
159 | + dhcpServer = gatewayIPAddress; | ||
160 | + domainServer = Ip4Address.valueOf("8.8.8.8"); | ||
161 | + | ||
162 | + dhcpService.setStaticMappingOpenstack(openstackPort.macAddress(), | ||
163 | + ip4Address, subnetMask, dhcpServer, gatewayIPAddress, domainServer); | ||
164 | + } | ||
165 | + */ | ||
166 | + | ||
130 | @Override | 167 | @Override |
131 | public void deletePorts() { | 168 | public void deletePorts() { |
132 | 169 | ||
... | @@ -142,8 +179,15 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -142,8 +179,15 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
142 | openstackNetworkMap.put(openstackNetwork.id(), openstackNetwork); | 179 | openstackNetworkMap.put(openstackNetwork.id(), openstackNetwork); |
143 | } | 180 | } |
144 | 181 | ||
182 | + | ||
183 | + @Override | ||
184 | + public void createSubnet(OpenstackSubnet openstackSubnet) { | ||
185 | + openstackSubnetMap.put(openstackSubnet.id(), openstackSubnet); | ||
186 | + log.debug("Added Subnet Info {}", openstackNetworkMap.get(openstackSubnet.id())); | ||
187 | + } | ||
188 | + | ||
145 | private void processDeviceAdded(Device device) { | 189 | private void processDeviceAdded(Device device) { |
146 | - log.warn("device {} is added", device.id()); | 190 | + log.debug("device {} is added", device.id()); |
147 | rulePopulator.populateDefaultRules(device.id()); | 191 | rulePopulator.populateDefaultRules(device.id()); |
148 | } | 192 | } |
149 | 193 | ||
... | @@ -152,7 +196,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -152,7 +196,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
152 | // TODO: Make it stateless | 196 | // TODO: Make it stateless |
153 | // TODO: All the logics need to be processed inside of the rulePopulator class | 197 | // TODO: All the logics need to be processed inside of the rulePopulator class |
154 | synchronized (vniPortMap) { | 198 | synchronized (vniPortMap) { |
155 | - log.warn("port {} is updated", port.toString()); | 199 | + log.debug("port {} is updated", port.toString()); |
156 | 200 | ||
157 | updatePortMaps(device, port); | 201 | updatePortMaps(device, port); |
158 | if (!port.annotations().value("portName").equals("vxlan")) { | 202 | if (!port.annotations().value("portName").equals("vxlan")) { |
... | @@ -163,7 +207,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -163,7 +207,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
163 | } | 207 | } |
164 | 208 | ||
165 | private void processPortRemoved(Device device, Port port) { | 209 | private void processPortRemoved(Device device, Port port) { |
166 | - log.warn("port {} is removed", port.toString()); | 210 | + log.debug("port {} is removed", port.toString()); |
167 | // TODO: need to update the vniPortMap | 211 | // TODO: need to update the vniPortMap |
168 | } | 212 | } |
169 | 213 | ||
... | @@ -182,7 +226,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -182,7 +226,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
182 | // TODO: Avoid duplicate flow rule set up for VMs in other Cnode | 226 | // TODO: Avoid duplicate flow rule set up for VMs in other Cnode |
183 | // (possibly avoided by flowrule subsystem?) | 227 | // (possibly avoided by flowrule subsystem?) |
184 | if (tunnelPortMap.get(hostIpAddress) == null) { | 228 | if (tunnelPortMap.get(hostIpAddress) == null) { |
185 | - log.warn("There is no tunnel port information"); | 229 | + log.debug("There is no tunnel port information"); |
186 | return; | 230 | return; |
187 | } | 231 | } |
188 | String vni = getVniForPort(portName); | 232 | String vni = getVniForPort(portName); |
... | @@ -251,20 +295,19 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -251,20 +295,19 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
251 | .filter(p -> p.id().startsWith(uuid)) | 295 | .filter(p -> p.id().startsWith(uuid)) |
252 | .findFirst().get(); | 296 | .findFirst().get(); |
253 | if (port == null) { | 297 | if (port == null) { |
254 | - log.warn("No port information for port {}", portName); | 298 | + log.debug("No port information for port {}", portName); |
255 | return null; | 299 | return null; |
256 | } | 300 | } |
257 | 301 | ||
258 | - //OpenstackSubnet subnet = openstackSubnetMap.values().stream() | 302 | + OpenstackSubnet subnet = openstackSubnetMap.values().stream() |
259 | - // .filter(s -> s.networkId().equals(port.networkId())) | 303 | + .filter(s -> s.networkId().equals(port.networkId())) |
260 | - // .findFirst().get(); | 304 | + .findFirst().get(); |
261 | - //if (subnet == null) { | 305 | + if (subnet == null) { |
262 | - // log.warn("No subnet information for network {}", subnet.id()); | 306 | + log.debug("No subnet information for network {}", subnet.id()); |
263 | - // return null; | 307 | + return null; |
264 | - //} | 308 | + } |
265 | 309 | ||
266 | - //return Ip4Prefix.valueOf(subnet.cidr()); | 310 | + return Ip4Prefix.valueOf(subnet.cidr()); |
267 | - return null; | ||
268 | } | 311 | } |
269 | 312 | ||
270 | /** | 313 | /** |
... | @@ -280,14 +323,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -280,14 +323,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
280 | .filter(p -> p.id().startsWith(uuid)) | 323 | .filter(p -> p.id().startsWith(uuid)) |
281 | .findFirst().get(); | 324 | .findFirst().get(); |
282 | if (port == null) { | 325 | if (port == null) { |
283 | - log.warn("No port information for port {}", portName); | 326 | + log.debug("No port information for port {}", portName); |
284 | return null; | 327 | return null; |
285 | } | 328 | } |
286 | OpenstackNetwork network = openstackNetworkMap.values().stream() | 329 | OpenstackNetwork network = openstackNetworkMap.values().stream() |
287 | .filter(n -> n.id().equals(port.networkId())) | 330 | .filter(n -> n.id().equals(port.networkId())) |
288 | .findFirst().get(); | 331 | .findFirst().get(); |
289 | if (network == null) { | 332 | if (network == null) { |
290 | - log.warn("No VNI information for network {}", network.id()); | 333 | + log.debug("No VNI information for network {}", network.id()); |
291 | return null; | 334 | return null; |
292 | } | 335 | } |
293 | 336 | ||
... | @@ -357,15 +400,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -357,15 +400,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
357 | 400 | ||
358 | if (ethernet.getEtherType() == Ethernet.TYPE_ARP) { | 401 | if (ethernet.getEtherType() == Ethernet.TYPE_ARP) { |
359 | arpHandler.processPacketIn(pkt); | 402 | arpHandler.processPacketIn(pkt); |
360 | - } else if (ethernet.getEtherType() == Ethernet.TYPE_IPV4) { | ||
361 | - IPv4 ipPacket = (IPv4) ethernet.getPayload(); | ||
362 | - | ||
363 | - if (ipPacket.getProtocol() == IPv4.PROTOCOL_UDP) { | ||
364 | - UDP udpPacket = (UDP) ipPacket.getPayload(); | ||
365 | - if (udpPacket.getDestinationPort() == DHCP_PORT) { | ||
366 | - dhcpHandler.processPacketIn(pkt); | ||
367 | - } | ||
368 | - } | ||
369 | } | 403 | } |
370 | } | 404 | } |
371 | } | 405 | } | ... | ... |
... | @@ -87,7 +87,6 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -87,7 +87,6 @@ public class OpenstackSwitchingRulePopulator { |
87 | */ | 87 | */ |
88 | public void populateDefaultRules(DeviceId id) { | 88 | public void populateDefaultRules(DeviceId id) { |
89 | 89 | ||
90 | - //setFlowRuleForDHCP(id); | ||
91 | setFlowRuleForArp(id); | 90 | setFlowRuleForArp(id); |
92 | 91 | ||
93 | log.warn("Default rule has been set"); | 92 | log.warn("Default rule has been set"); | ... | ... |
... | @@ -46,4 +46,10 @@ public interface OpenstackSwitchingService { | ... | @@ -46,4 +46,10 @@ public interface OpenstackSwitchingService { |
46 | */ | 46 | */ |
47 | void createNetwork(OpenstackNetwork openstackNetwork); | 47 | void createNetwork(OpenstackNetwork openstackNetwork); |
48 | 48 | ||
49 | + /** | ||
50 | + * Store the subnet information created by openstack. | ||
51 | + * | ||
52 | + * @param openstackSubnet subnet information | ||
53 | + */ | ||
54 | + void createSubnet(OpenstackSubnet openstackSubnet); | ||
49 | } | 55 | } | ... | ... |
... | @@ -54,6 +54,8 @@ public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> { | ... | @@ -54,6 +54,8 @@ public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> { |
54 | .id(id); | 54 | .id(id); |
55 | 55 | ||
56 | if (!networkInfo.path(NETWORK_TYPE).isMissingNode()) { | 56 | if (!networkInfo.path(NETWORK_TYPE).isMissingNode()) { |
57 | + onb.networkType(OpenstackNetwork.NetworkType.valueOf(networkInfo.path(NETWORK_TYPE). | ||
58 | + asText().toUpperCase())); | ||
57 | onb.name(networkInfo.path(NETWORK_TYPE).asText()); | 59 | onb.name(networkInfo.path(NETWORK_TYPE).asText()); |
58 | onb.segmentId(networkInfo.path(SEGMENTATION_ID).asText()); | 60 | onb.segmentId(networkInfo.path(SEGMENTATION_ID).asText()); |
59 | } | 61 | } | ... | ... |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.openstackswitching.web; | ||
17 | + | ||
18 | +import com.fasterxml.jackson.databind.JsonNode; | ||
19 | + | ||
20 | + | ||
21 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
22 | +import org.onosproject.codec.CodecContext; | ||
23 | +import org.onosproject.codec.JsonCodec; | ||
24 | +import org.onosproject.openstackswitching.OpenstackSubnet; | ||
25 | +import org.slf4j.Logger; | ||
26 | +import org.slf4j.LoggerFactory; | ||
27 | + | ||
28 | +/** | ||
29 | + * It encodes and decodes the OpenstackSubnet. | ||
30 | + */ | ||
31 | + | ||
32 | +public class OpenstackSubnetCodec extends JsonCodec<OpenstackSubnet> { | ||
33 | + private static Logger log = LoggerFactory | ||
34 | + .getLogger(OpenstackSubnetCodec.class); | ||
35 | + | ||
36 | + // JSON Field names | ||
37 | + private static final String SUBNET = "subnet"; | ||
38 | + private static final String NAME = "name"; | ||
39 | + private static final String ENABLE_DHCP = "enable_dhcp"; | ||
40 | + private static final String NETWORK_ID = "network_id"; | ||
41 | + private static final String TENANT_ID = "tenant_id"; | ||
42 | + private static final String DNS_NAMESERVERS = "dns_nameservers"; | ||
43 | + private static final String GATEWAY_IP = "gateway_ip"; | ||
44 | + private static final String CIDR = "cidr"; | ||
45 | + private static final String ID = "id"; | ||
46 | + | ||
47 | + @Override | ||
48 | + public OpenstackSubnet decode(ObjectNode json, CodecContext context) { | ||
49 | + JsonNode subnetInfo = json.get(SUBNET); | ||
50 | + | ||
51 | + String name = subnetInfo.path(NAME).asText(); | ||
52 | + boolean enableDhcp = subnetInfo.path(ENABLE_DHCP).asBoolean(); | ||
53 | + String networkId = subnetInfo.path(NETWORK_ID).asText(); | ||
54 | + String tenantId = subnetInfo.path(TENANT_ID).asText(); | ||
55 | + String dnsNameservsers = subnetInfo.path(DNS_NAMESERVERS).asText(); | ||
56 | + String gatewayIp = subnetInfo.path(GATEWAY_IP).asText(); | ||
57 | + String cidr = subnetInfo.path(CIDR).asText(); | ||
58 | + String id = subnetInfo.path(ID).asText(); | ||
59 | + | ||
60 | + OpenstackSubnet openstackSubnet = OpenstackSubnet.builder() | ||
61 | + .setName(name) | ||
62 | + .setEnableDhcp(enableDhcp) | ||
63 | + .setNetworkId(networkId) | ||
64 | + .setTenantId(tenantId) | ||
65 | + .setDnsNameservers(dnsNameservsers) | ||
66 | + .setGatewayIp(gatewayIp) | ||
67 | + .setCidr(cidr) | ||
68 | + .setId(id) | ||
69 | + .build(); | ||
70 | + return openstackSubnet; | ||
71 | + } | ||
72 | +} |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.openstackswitching.web; | ||
17 | + | ||
18 | + | ||
19 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
20 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
21 | +import org.onosproject.openstackswitching.OpenstackSubnet; | ||
22 | +import org.onosproject.openstackswitching.OpenstackSwitchingService; | ||
23 | +import org.onosproject.rest.AbstractWebResource; | ||
24 | +import org.slf4j.Logger; | ||
25 | +import org.slf4j.LoggerFactory; | ||
26 | + | ||
27 | +import javax.ws.rs.Consumes; | ||
28 | +import javax.ws.rs.POST; | ||
29 | +import javax.ws.rs.Path; | ||
30 | +import javax.ws.rs.Produces; | ||
31 | +import javax.ws.rs.core.MediaType; | ||
32 | +import javax.ws.rs.core.Response; | ||
33 | +import java.io.InputStream; | ||
34 | + | ||
35 | +@Path("subnets") | ||
36 | +public class OpenstackSubnetWebResource extends AbstractWebResource { | ||
37 | + protected static final Logger log = LoggerFactory | ||
38 | + .getLogger(OpenstackSubnetWebResource.class); | ||
39 | + | ||
40 | + private static final OpenstackSubnetCodec SUBNET_CODEC = new OpenstackSubnetCodec(); | ||
41 | + | ||
42 | + @POST | ||
43 | + @Consumes(MediaType.APPLICATION_JSON) | ||
44 | + @Produces(MediaType.APPLICATION_JSON) | ||
45 | + public Response createSubnet(InputStream input) { | ||
46 | + try { | ||
47 | + ObjectMapper mapper = new ObjectMapper(); | ||
48 | + ObjectNode subnetNode = (ObjectNode) mapper.readTree(input); | ||
49 | + | ||
50 | + OpenstackSubnet openstackSubnet = SUBNET_CODEC.decode(subnetNode, this); | ||
51 | + | ||
52 | + OpenstackSwitchingService switchingService = get(OpenstackSwitchingService.class); | ||
53 | + switchingService.createSubnet(openstackSubnet); | ||
54 | + log.info("REST API subnets is called with {}", subnetNode.toString()); | ||
55 | + return Response.status(Response.Status.OK).build(); | ||
56 | + } catch (Exception e) { | ||
57 | + log.error("Creates VirtualSubnet failed because of exception {}", | ||
58 | + e.toString()); | ||
59 | + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString()) | ||
60 | + .build(); | ||
61 | + } | ||
62 | + } | ||
63 | + | ||
64 | +} |
... | @@ -31,7 +31,8 @@ | ... | @@ -31,7 +31,8 @@ |
31 | <param-name>com.sun.jersey.config.property.classnames</param-name> | 31 | <param-name>com.sun.jersey.config.property.classnames</param-name> |
32 | <param-value> | 32 | <param-value> |
33 | org.onosproject.openstackswitching.web.OpenstackPortWebResource, | 33 | org.onosproject.openstackswitching.web.OpenstackPortWebResource, |
34 | - org.onosproject.openstackswitching.web.OpenstackNetworkWebResource | 34 | + org.onosproject.openstackswitching.web.OpenstackNetworkWebResource, |
35 | + org.onosproject.openstackswitching.web.OpenstackSubnetWebResource | ||
35 | </param-value> | 36 | </param-value> |
36 | </init-param> | 37 | </init-param> |
37 | <load-on-startup>1</load-on-startup> | 38 | <load-on-startup>1</load-on-startup> | ... | ... |
-
Please register or login to post a comment