mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-25 14:21:33 +02:00
Support source-specific IGMP joins.
Change-Id: I422f54f908998460ceff994f9b3bfbf3d2f81a56
This commit is contained in:
parent
4752cfa906
commit
81b091424e
@ -320,32 +320,57 @@ public class IgmpSnoop {
|
|||||||
|
|
||||||
IGMPMembership membership = (IGMPMembership) group;
|
IGMPMembership membership = (IGMPMembership) group;
|
||||||
|
|
||||||
// TODO allow pulling source from IGMP packet
|
IpAddress groupAddress = membership.getGaddr();
|
||||||
IpAddress source = ssmTranslateTable.get(group.getGaddr());
|
|
||||||
if (source == null) {
|
|
||||||
log.warn("No source found in SSM translate table for {}", group.getGaddr());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
McastRoute route = new McastRoute(source,
|
|
||||||
group.getGaddr(),
|
|
||||||
McastRoute.Type.IGMP);
|
|
||||||
|
|
||||||
if (membership.getRecordType() == IGMPMembership.MODE_IS_INCLUDE ||
|
if (membership.getRecordType() == IGMPMembership.MODE_IS_INCLUDE ||
|
||||||
membership.getRecordType() == IGMPMembership.CHANGE_TO_INCLUDE_MODE) {
|
membership.getRecordType() == IGMPMembership.CHANGE_TO_INCLUDE_MODE) {
|
||||||
|
|
||||||
multicastService.removeSink(route, location);
|
if (membership.getSources().isEmpty()) {
|
||||||
// TODO remove route if all sinks are gone
|
McastRoute route = ssmTranslateRoute(groupAddress);
|
||||||
|
if (route != null) {
|
||||||
|
removeRoute(route, location);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
membership.getSources().stream()
|
||||||
|
.map(source -> new McastRoute(source, groupAddress, McastRoute.Type.IGMP))
|
||||||
|
.forEach(route -> addRoute(route, location));
|
||||||
|
}
|
||||||
} else if (membership.getRecordType() == IGMPMembership.MODE_IS_EXCLUDE ||
|
} else if (membership.getRecordType() == IGMPMembership.MODE_IS_EXCLUDE ||
|
||||||
membership.getRecordType() == IGMPMembership.CHANGE_TO_EXCLUDE_MODE) {
|
membership.getRecordType() == IGMPMembership.CHANGE_TO_EXCLUDE_MODE) {
|
||||||
|
|
||||||
multicastService.add(route);
|
if (membership.getSources().isEmpty()) {
|
||||||
multicastService.addSink(route, location);
|
McastRoute route = ssmTranslateRoute(groupAddress);
|
||||||
|
if (route != null) {
|
||||||
|
addRoute(route, location);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
membership.getSources().stream()
|
||||||
|
.map(source -> new McastRoute(source, groupAddress, McastRoute.Type.IGMP))
|
||||||
|
.forEach(route -> removeRoute(route, location));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private McastRoute ssmTranslateRoute(IpAddress group) {
|
||||||
|
IpAddress source = ssmTranslateTable.get(group);
|
||||||
|
if (source == null) {
|
||||||
|
log.warn("No SSM translate source found for group {}", group);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new McastRoute(source, group, McastRoute.Type.IGMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addRoute(McastRoute route, ConnectPoint location) {
|
||||||
|
multicastService.add(route);
|
||||||
|
multicastService.addSink(route, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeRoute(McastRoute route, ConnectPoint location) {
|
||||||
|
multicastService.removeSink(route, location);
|
||||||
|
// TODO remove route if all sinks are gone
|
||||||
|
}
|
||||||
|
|
||||||
private ByteBuffer buildQueryPacket() {
|
private ByteBuffer buildQueryPacket() {
|
||||||
IGMP igmp = new IGMP();
|
IGMP igmp = new IGMP();
|
||||||
igmp.setIgmpType(IGMP.TYPE_IGMPV3_MEMBERSHIP_QUERY);
|
igmp.setIgmpType(IGMP.TYPE_IGMPV3_MEMBERSHIP_QUERY);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user