Итак, я создаю вложенную карту хэша для двух коммутаторов, используя идентификатор переключателей, а затем вставляя исходный MAC-адрес и порт.Получение ключа и значения из вложенного Hashmap
E.g. switch1 должен содержать свои собственные отображения, как и должен switch2 и оба переключатель, очевидно, должен взаимодействовать друг с другом, так что я установить HashMap вверх, как так:
HashMap<String, HashMap<Long, Short>> map = new HashMap<String, HashMap<Long,Short>>();
if(sw.getId() == 1){
switchMap.put("1", new HashMap<Long, Short>());
switchMap.get("1").put(sourceMac, (short) pi.getInPort());
}
else if(sw.getId() == 2){
switchMap.put("2", new HashMap<Long, Short>());
switchMap.get("2").put(sourceMac, (short) pi.getInPort());
}
Теперь, что я хотел бы сделать, это проверить каждый коммутатор ключ (1 или 2), а затем проверить, что каждый коммутатор имеет правильный sourceMac и порт # при проверке данного destinationMac:
Long destinationMac = Ethernet.toLong(match.getDataLayerDestination());
if (switchMap.containsKey("1") && switchMap.containsValue(destinationMac)) {
/* Now we can retrieve the port number. This will be the port that we need to send the
packet over to reach the host to which that MAC address belongs. */
short destinationPort = (short) switchMap.get("1").get(destinationMac);
/*Write the packet to a port, use the destination port we have just found.*/
installFlowMod(sw, pi, match, destinationPort, 50, 100, cntx);
}
else if (switchMap.containsKey("2") && switchMap.containsValue(destinationMac)) {
/* Now we can retrieve the port number. This will be the port that we need to send the
packet over to reach the host to which that MAC address belongs. */
short destinationPort = (short) switchMap.get("2").get(destinationMac)
/*Write the packet to a port, use the destination port we have just found.*/
installFlowMod(sw, pi, match, destinationPort, 50, 100, cntx);
}
else {
log.debug("Destination MAC address unknown: flooding");
writePacketToPort(sw, pi, OFPort.OFPP_FLOOD.getValue(), cntx);
}
когда я запускаю код и пытаться свистеть от h1 (switch1) на h3 (switch2) Я возвращаю запросы, но я все еще получаю сообщение об ошибке "Destination MAC address unknown: flooding"
Мой вопрос: правильно ли я получаю значения из вложенного HashMap? Или моя логика полностью перепуталась?
Я видел, что вы отредактировали свой вопрос, но насколько я понял, это не отменяет моего ответа. Проблема, с которой вы сталкиваетесь, заключается только в том, как вы извлекаете данные из switchMap. Вы пытаетесь получить значение 'destinationMac' из switchMap, вместо этого вы должны получить его из внутреннего сопоставления карты одному из двух переключателей, как показано в моем ответе. – nivox