Rusty Eddy
Committed by Gerrit Code Review

Added some incoming JoinPrune processing

Change-Id: I7c89f05119ffa012b8e79f05d0f5f63744282ffb
/*
* Copyright 2015 Open Networking Laboratory
* Copyright 2015, 2016 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -19,10 +19,13 @@ import org.onlab.packet.Ethernet;
import org.onlab.packet.IPv4;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.PIM;
import org.onlab.packet.pim.PIMHello;
import org.onlab.packet.pim.PIMHelloOption;
import org.onlab.packet.pim.PIMJoinPrune;
import org.onlab.packet.pim.PIMJoinPruneGroup;
import org.onosproject.incubator.net.intf.Interface;
import org.onosproject.net.flow.DefaultTrafficTreatment;
import org.onosproject.net.flow.TrafficTreatment;
......@@ -348,7 +351,39 @@ public final class PIMInterface {
* @param ethPkt the Ethernet packet header.
*/
public void processJoinPrune(Ethernet ethPkt) {
// TODO: add Join/Prune processing code.
IPv4 ip = (IPv4) ethPkt.getPayload();
checkNotNull(ip);
PIM pim = (PIM) ip.getPayload();
checkNotNull(pim);
PIMJoinPrune jpHdr = (PIMJoinPrune) pim.getPayload();
checkNotNull(jpHdr);
/*
* The Join/Prune messages are grouped by Group address. We'll walk each group address
* where we will possibly have to walk a list of source address for the joins and prunes.
*/
Collection<PIMJoinPruneGroup> jpgs = jpHdr.getJoinPrunes();
for (PIMJoinPruneGroup jpg : jpgs) {
IpPrefix gpfx = jpg.getGroup();
// Walk the joins first.
for (IpPrefix spfx : jpg.getJoins().values()) {
// We may need
}
for (IpPrefix spfx : jpg.getPrunes().values()) {
// TODO: this is where we many need to remove multi-cast state and possibly intents.
}
}
}
/**
......
......@@ -21,6 +21,7 @@ import org.onlab.packet.IPacket;
import org.onlab.packet.IpPrefix;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.HashMap;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -31,16 +32,7 @@ public class PIMJoinPrune extends BasePacket {
private PIMAddrUnicast upstreamAddr = new PIMAddrUnicast();
private short holdTime = (short) 0xffff;
private class JoinPruneGroup {
protected IpPrefix group;
protected HashMap<IpPrefix, IpPrefix> joins = new HashMap<>();
protected HashMap<IpPrefix, IpPrefix> prunes = new HashMap<>();
public JoinPruneGroup(IpPrefix grp) {
group = grp;
}
}
private HashMap<IpPrefix, JoinPruneGroup> joinPrunes = new HashMap<>();
private HashMap<IpPrefix, PIMJoinPruneGroup> joinPrunes = new HashMap<>();
/**
* Get the J/P hold time.
......@@ -79,6 +71,15 @@ public class PIMJoinPrune extends BasePacket {
}
/**
* Get the JoinPrune Group with all the joins and prunes.
*
* @return the joinPruneGroup collection
*/
public Collection<PIMJoinPruneGroup> getJoinPrunes() {
return joinPrunes.values();
}
/**
* Add the specified s,g to join field.
*
* @param saddr the source address of the route
......@@ -99,13 +100,13 @@ public class PIMJoinPrune extends BasePacket {
* @param join true for join, false for prune
*/
public void addJoinPrune(IpPrefix spfx, IpPrefix gpfx, boolean join) {
JoinPruneGroup jpg = joinPrunes.get(gpfx);
PIMJoinPruneGroup jpg = joinPrunes.get(gpfx);
if (jpg == null) {
jpg = new JoinPruneGroup(gpfx);
jpg = new PIMJoinPruneGroup(gpfx);
joinPrunes.put(gpfx, jpg);
}
HashMap<IpPrefix, IpPrefix> members = (join) ? jpg.joins : jpg.prunes;
HashMap<IpPrefix, IpPrefix> members = (join) ? jpg.getJoins() : jpg.getPrunes();
if (members.get(spfx) == null) {
members.put(spfx, spfx);
}
......@@ -151,22 +152,22 @@ public class PIMJoinPrune extends BasePacket {
bb.putShort(this.holdTime);
// Walk the group list and input all groups
for (JoinPruneGroup jpg : joinPrunes.values()) {
PIMAddrGroup grp = new PIMAddrGroup(jpg.group);
for (PIMJoinPruneGroup jpg : joinPrunes.values()) {
PIMAddrGroup grp = new PIMAddrGroup(jpg.getGroup());
bb.put(grp.serialize());
// put the number of joins and prunes
bb.putShort((short) jpg.joins.size());
bb.putShort((short) jpg.prunes.size());
bb.putShort((short) jpg.getJoins().size());
bb.putShort((short) jpg.getPrunes().size());
// Set all of the joins
for (IpPrefix spfx : jpg.joins.values()) {
for (IpPrefix spfx : jpg.getJoins().values()) {
PIMAddrSource src = new PIMAddrSource(spfx);
bb.put(src.serialize());
}
// Set all of the prunes
for (IpPrefix spfx : jpg.prunes.values()) {
for (IpPrefix spfx : jpg.getPrunes().values()) {
PIMAddrSource src = new PIMAddrSource(spfx);
bb.put(src.serialize());
}
......
/*
* Copyright 2016 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.pim;
import org.onlab.packet.IpPrefix;
import java.util.HashMap;
public class PIMJoinPruneGroup {
private IpPrefix group;
private HashMap<IpPrefix, IpPrefix> joins = new HashMap<>();
private HashMap<IpPrefix, IpPrefix> prunes = new HashMap<>();
public PIMJoinPruneGroup(IpPrefix grp) {
group = grp;
}
public IpPrefix getGroup() {
return group;
}
public void setGroup(IpPrefix g) {
group = g;
}
public HashMap<IpPrefix, IpPrefix> getJoins() {
return joins;
}
public HashMap<IpPrefix, IpPrefix> getPrunes() {
return prunes;
}
}