blob: 01f79a6bd2cc14c0e6244230b38f5e64b1b101a9 [file] [log] [blame]
Jonathan Hart313fdf02014-04-10 14:09:46 -07001package net.onrc.onos.core.packetservice;
Jonathan Hart7804bea2014-01-07 10:50:52 -08002
pingping-lin0426dee2014-08-27 15:03:17 -07003import java.util.Collections;
4import java.util.HashSet;
Jonathan Harte6e63732014-04-16 14:29:49 -07005import java.util.Map;
pingping-lin0426dee2014-08-27 15:03:17 -07006import java.util.Set;
TeruU7feef8a2014-04-03 00:15:49 -07007
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -07008import net.onrc.onos.core.topology.MutableTopology;
Jonathan Hartf5bd2582014-04-09 17:43:41 -07009import net.onrc.onos.core.topology.Port;
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070010import net.onrc.onos.core.util.Dpid;
11import net.onrc.onos.core.util.PortNumber;
pingping-lin0426dee2014-08-27 15:03:17 -070012import net.onrc.onos.core.util.SwitchPort;
Jonathan Hartf5bd2582014-04-09 17:43:41 -070013
Jonathan Harte6e63732014-04-16 14:29:49 -070014import com.google.common.collect.HashMultimap;
15import com.google.common.collect.Multimap;
16
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070017// TODO The generic broadcast packet shouldn't contain an IP address which is
18// only for ARP packets.
Ray Milkey269ffb92014-04-03 14:43:30 -070019
Jonathan Hart7804bea2014-01-07 10:50:52 -080020/**
21 * Notification to all ONOS instances to broadcast this packet out the edge of
22 * the network. The edge is defined as any port that doesn't have a link to
23 * another switch. The one exception is the port that the packet was received
24 * on.
Jonathan Hart7804bea2014-01-07 10:50:52 -080025 */
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070026public class BroadcastPacketOutNotification extends PacketOutNotification {
Jonathan Hart7804bea2014-01-07 10:50:52 -080027
TeruU7feef8a2014-04-03 00:15:49 -070028 private final int address;
pingping-lin0426dee2014-08-27 15:03:17 -070029 private final Set<SwitchPort> blacklistSwitchPorts;
Jonathan Hart7804bea2014-01-07 10:50:52 -080030
Jonathan Hart51dc5e12014-04-22 11:03:59 -070031 /**
32 * Default constructor, used for deserialization.
33 */
TeruU7feef8a2014-04-03 00:15:49 -070034 protected BroadcastPacketOutNotification() {
Ray Milkey269ffb92014-04-03 14:43:30 -070035 super();
Jonathan Hart51dc5e12014-04-22 11:03:59 -070036 this.address = 0;
pingping-lin0426dee2014-08-27 15:03:17 -070037 this.blacklistSwitchPorts = null;
TeruU7feef8a2014-04-03 00:15:49 -070038 }
Ray Milkey269ffb92014-04-03 14:43:30 -070039
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070040 /**
41 * Class constructor.
42 *
Ray Milkey269ffb92014-04-03 14:43:30 -070043 * @param packet packet data to send in the packet-out
44 * @param address target IP address if the packet is an ARP packet
pingping-lin0426dee2014-08-27 15:03:17 -070045 * @param inSwitchPort switch port the packet was received on
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070046 */
TeruU7feef8a2014-04-03 00:15:49 -070047 public BroadcastPacketOutNotification(byte[] packet, int address,
pingping-lin0426dee2014-08-27 15:03:17 -070048 SwitchPort inSwitchPort) {
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070049 super(packet);
Jonathan Hart7804bea2014-01-07 10:50:52 -080050
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070051 this.address = address;
pingping-lin0426dee2014-08-27 15:03:17 -070052 this.blacklistSwitchPorts = new HashSet<SwitchPort>();
53 blacklistSwitchPorts.add(inSwitchPort);
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070054 }
Ray Milkey269ffb92014-04-03 14:43:30 -070055
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070056 /**
pingping-lin0426dee2014-08-27 15:03:17 -070057 * Class constructor.
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070058 *
pingping-lin0426dee2014-08-27 15:03:17 -070059 * @param packet packet data to send in the packet-out
60 * @param address target IP address if the packet is an ARP packet
61 * @param blacklistSwitchPorts switch ports will not be broadcasted to
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070062 */
pingping-lin0426dee2014-08-27 15:03:17 -070063 public BroadcastPacketOutNotification(byte[] packet, int address,
64 Set<SwitchPort> blacklistSwitchPorts) {
65 super(packet);
66
67 this.address = address;
68 this.blacklistSwitchPorts = new HashSet<SwitchPort>(blacklistSwitchPorts);
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070069 }
70
71 /**
pingping-lin0426dee2014-08-27 15:03:17 -070072 * Get the blacklist SwitchPorts.
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070073 *
pingping-lin0426dee2014-08-27 15:03:17 -070074 * @return blacklist SwitchPorts
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070075 */
pingping-lin0426dee2014-08-27 15:03:17 -070076 public Set<SwitchPort> getInSwitchPort() {
77 return Collections.unmodifiableSet(blacklistSwitchPorts);
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070078 }
79
80 /**
81 * Get the target IP address if the packet is an ARP packet.
82 *
83 * @return the target IP address for ARP packets, or null if the packet is
Ray Milkey269ffb92014-04-03 14:43:30 -070084 * not an ARP packet
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070085 */
TeruU7feef8a2014-04-03 00:15:49 -070086 public int getTargetAddress() {
Jonathan Hart7c9a2fb2014-03-27 09:51:41 -070087 return address;
88 }
Jonathan Harte6e63732014-04-16 14:29:49 -070089
90 @Override
Jonathan Hartf5bd2582014-04-09 17:43:41 -070091 public Multimap<Long, Short> calculateOutPorts(
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070092 Multimap<Long, Short> localPorts, MutableTopology mutableTopology) {
Jonathan Harte6e63732014-04-16 14:29:49 -070093 Multimap<Long, Short> outPorts = HashMultimap.create();
94
Jonathan Hartf5bd2582014-04-09 17:43:41 -070095 for (Map.Entry<Long, Short> entry : localPorts.entries()) {
96 Port globalPort;
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070097 mutableTopology.acquireReadLock();
Jonathan Hartf5bd2582014-04-09 17:43:41 -070098 try {
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070099 globalPort = mutableTopology.getPort(new Dpid(entry.getKey()),
Yuta HIGUCHIa507baf2014-08-22 13:42:40 -0700100 PortNumber.uint16(entry.getValue()));
Jonathan Hartf5bd2582014-04-09 17:43:41 -0700101 } finally {
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -0700102 mutableTopology.releaseReadLock();
Jonathan Hartf5bd2582014-04-09 17:43:41 -0700103 }
pingping-lin0426dee2014-08-27 15:03:17 -0700104 SwitchPort switchPort = new SwitchPort(entry.getKey(), entry.getValue());
Jonathan Hartf5bd2582014-04-09 17:43:41 -0700105
pingping-lin0426dee2014-08-27 15:03:17 -0700106
107 if ((blacklistSwitchPorts == null || !blacklistSwitchPorts
108 .contains(switchPort)) &&
Jonathan Hartf5bd2582014-04-09 17:43:41 -0700109 globalPort != null &&
110 globalPort.getOutgoingLink() == null) {
111
Jonathan Harte6e63732014-04-16 14:29:49 -0700112 outPorts.put(entry.getKey(), entry.getValue());
113 }
114 }
115
116 return outPorts;
117 }
pingping-lin0426dee2014-08-27 15:03:17 -0700118
Jonathan Hart7804bea2014-01-07 10:50:52 -0800119}