Я написал модуль Java, который должен работать на двух контроллерах прожектора.У меня в mininet есть топология, которая состоит из 2 контроллеров прожектора (c1 и c2), коммутатора (s1), который подключен к c1, и 2 хостов (h1 и h2), которые подключены к этому коммутатору.Я пишу программу, в которой, когда c1 получает ICMP-пакет от s1, он отправит приветственное сообщение c2.
.
.
.
public class Mactracker implements IFloodlightModule, IOFMessageListener {
protected static IHAControllerService hacontroller;
protected static Logger logger = LoggerFactory.getLogger(Mactracker.class);
protected IFloodlightProviderService floodlightProvider;
protected Set<Long> macAddresses;
private static NetworkNode network;
private volatile int RFlag = 0;
private String message;
private static Map<String, String> config = new HashMap<>();
.
.
.
@Override
public void startUp(FloodlightModuleContext context) throws FloodlightModuleException {
// TODO Auto-generated method stub
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor1 = new ScheduledThreadPoolExecutor(1);
ThreadClass ts1 = new ThreadClass ();
scheduledThreadPoolExecutor1.scheduleAtFixedRate(ts1, 2, 1, TimeUnit.MILLISECONDS);
}
.
.
.
@Override
public net.floodlightcontroller.core.IListener.Command receive(IOFSwitch sw, OFMessage msg,
FloodlightContext cntx) {
// TODO Auto-generated method stub
Ethernet eth =
IFloodlightProviderService.bcStore.get(cntx,
IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
if (eth.getEtherType() == EthType.IPv4) {
IPv4 ipv4 = (IPv4) eth.getPayload();
if ( ipv4.getProtocol().equals(IpProtocol.ICMP)){
logger.warn ("ICMP Packet Received!:-)");
ICMP icmp = (ICMP) ipv4.getPayload();
logger.warn ("icmp.getIcmpType: "+icmp.getIcmpType());
//I will write codes for sending the message
RFlag = 1;
}
}
return Command.CONTINUE;
}
class ThreadClass implements Runnable {
ThreadClass(){};
@Override
public void run() {
if (RFlag == 1) {
//I will write codes for receiving the message
}
}
}
}
Для тех, кто не знаком с прожектором или мининетом, в этом модуле receive прослушивает сообщения, отправленные с коммутаторов (он прослушивает порт 6653 для c1, порт 7753 для c2).Поэтому в моей функции receive (), когда c1 получает сообщение от коммутатора, он отправляет сообщение на c2 и изменяет значение RFlag на 1.
У меня также есть поток в моем модуле (ThreadClass), который проверяет значение RFlag и, если RFlag = 1, этот поток будет реализовывать некоторые задачи как на c1, так и на c2.
Проблема заключается в том, что, поскольку значение RFlag изменяется, когда c1 получает сообщение, задачикоторый я определил в потоке, просто реализован в c1, а не в c2 (потому что c2 не получил сообщение и значение RFlag по-прежнему равно 0 для c2).
Итак, мой вопрос: как я могу изменить значение RFlag на 1 на с2, когда это значение меняется на 1 на с1?Возможно ли это?