blob: 0add46c9eb247ff6eb34dbd9ea5592c3f07147ab [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
*
* 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.opencord.igmpproxy.impl.store.groupmember;
import org.onlab.packet.IGMPMembership;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.VlanId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
import org.opencord.igmpproxy.GroupMemberId;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Date struct to keep Igmp member infomations.
*/
public final class GroupMember {
private final VlanId vlan;
private final GroupMemberId groupMemberId;
private final boolean v2;
private byte recordType = IGMPMembership.MODE_IS_INCLUDE;
private ArrayList<Ip4Address> sourceList = new ArrayList<>();
private int keepAliveQueryInterval = 0;
private int keepAliveQueryCount = 0;
private int lastQueryInterval = 0;
private int lastQueryCount = 0;
private boolean leave = false;
public GroupMember(Ip4Address groupIp, VlanId vlan, DeviceId deviceId, PortNumber portNum, boolean isV2) {
this.vlan = vlan;
this.groupMemberId = GroupMemberId.of(groupIp, deviceId, portNum);
v2 = isV2;
}
public String getkey() {
return groupMemberId.toString();
}
public GroupMemberId getGroupMemberId() {
return groupMemberId;
}
public VlanId getvlan() {
return vlan;
}
public DeviceId getDeviceId() {
return groupMemberId.getDeviceId();
}
public PortNumber getPortNumber() {
return groupMemberId.getPortNum();
}
public Ip4Address getGroupIp() {
return groupMemberId.getGroupIp();
}
public byte getRecordType() {
return recordType;
}
public boolean getv2() {
return v2;
}
public ArrayList<Ip4Address> getSourceList() {
return sourceList;
}
public void updateList(byte recordType, ArrayList<Ip4Address> newSourceList) {
this.recordType = recordType;
this.sourceList.clear();
this.sourceList.addAll(newSourceList);
}
/*join B to A (A+B)*/
private void join(ArrayList<Integer> listA, ArrayList<Integer> listB) {
Iterator<Integer> iterA = null;
Iterator<Integer> iterB = listB.iterator();
boolean exists;
while (iterB.hasNext()) {
iterA = listA.iterator();
exists = false;
int ipToAdd = iterB.next();
while (iterA.hasNext()) {
if (iterA.next().equals(ipToAdd)) {
exists = true;
break;
}
}
if (!exists) {
listA.add(ipToAdd);
}
}
}
/* include A and B (A*B)*/
private void intersection(ArrayList<Integer> listA, ArrayList<Integer> listB) {
Iterator<Integer> iterA = listA.iterator();
Iterator<Integer> iterB;
boolean exists;
while (iterA.hasNext()) {
iterB = listB.iterator();
int ipToInclude = iterA.next();
exists = false;
while (iterB.hasNext()) {
if (iterB.next().equals(ipToInclude)) {
exists = true;
break;
}
}
if (!exists) {
iterA.remove();
}
}
}
/*exclude B from A (A-B)*/
private void exclude(ArrayList<Integer> listA, ArrayList<Integer> listB) {
Iterator<Integer> iterA = null;
Iterator<Integer> iterB = listB.iterator();
while (iterB.hasNext()) {
iterA = listA.iterator();
int ipToDel = iterB.next();
while (iterA.hasNext()) {
if (iterA.next().equals(ipToDel)) {
iterA.remove();
break;
}
}
}
}
public void setLeave(boolean l) {
leave = l;
}
public boolean isLeave() {
return leave;
}
public int getKeepAliveQueryInterval() {
return keepAliveQueryInterval;
}
public int getKeepAliveQueryCount() {
return keepAliveQueryCount;
}
public int getLastQueryInterval() {
return lastQueryInterval;
}
public int getLastQueryCount() {
return lastQueryCount;
}
public void keepAliveQueryCount(boolean add) {
if (add) {
keepAliveQueryCount++;
} else {
keepAliveQueryCount = 0;
}
}
public void lastQueryCount(boolean add) {
if (add) {
lastQueryCount++;
} else {
lastQueryCount = 0;
}
}
public void keepAliveInterval(boolean add) {
if (add) {
keepAliveQueryInterval++;
} else {
keepAliveQueryInterval = 0;
}
}
public void lastQueryInterval(boolean add) {
if (add) {
lastQueryInterval++;
} else {
lastQueryInterval = 0;
}
}
public void resetAllTimers() {
keepAliveQueryInterval = 0;
keepAliveQueryCount = 0;
lastQueryInterval = 0;
lastQueryCount = 0;
}
}