2015-10-24 3 views
0

Итак, я создаю вложенную карту хэша для двух коммутаторов, используя идентификатор переключателей, а затем вставляя исходный 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? Или моя логика полностью перепуталась?

+0

Я видел, что вы отредактировали свой вопрос, но насколько я понял, это не отменяет моего ответа. Проблема, с которой вы сталкиваетесь, заключается только в том, как вы извлекаете данные из switchMap. Вы пытаетесь получить значение 'destinationMac' из switchMap, вместо этого вы должны получить его из внутреннего сопоставления карты одному из двух переключателей, как показано в моем ответе. – nivox

ответ

1

То, как вы проверяете наличие адреса назначения, неверно. Это должно быть что-то вроде:

Short portS1 = switchMap.get("1").get(destinationMac) 
if (portS1 != null) { 
    installFlowMod(sw, pi, match, portS1, 50, 100, cntx); 
} 

Short portS2 = switchMap.get("1").get(destinationMac) 
if (portS2 != null) { 
    installFlowMod(sw, pi, match, portS2, 50, 100, cntx); 
} 

Для этого, чтобы работать, вы должны инициализировать все свое отображение переключателя с пустым Map<Long, Short>.

Еще более общий подход будет таким:

for (Map.Entry<String, Map<Long, Short>> e: switchMap.entrySet()) { 
    Short port = e.getValue().get(destinationMac); 
    if (port != null) installFlowMod(sw, pi, match, port, 50, 100, cntx); 
} 

Делая это таким образом, вы даже не нужно предварительно инициализировать switchMap.

+0

Я пробовал оба решения, но продолжаю получать исключение с нулевым указателем. В моем журнале отладки отображается только подключение switch1, затем отключается, а затем снова подключается снова. Коммутаторы действительно нуждаются в соединении друг с другом, а также с их отдельными хостами. – Papantonia

+0

. Я бы предложил отредактировать ваш вопрос, чтобы упомянуть об Исключении, которое вы получаете, в противном случае читатели могут попытаться помочь вам, поскольку у нас нет необходимый контекст. Наконец, помните, что мы не знаем внутренней работы ваших алгоритмов. Ответ, который у вас есть, ограничен поиском на внутренней карте. Если вы столкнулись с другой проблемой, было бы лучше закрыть этот вопрос и открыть другой, посвященный вашей текущей проблеме. – nivox

3
for(String s: map.keySet()){ 
    HashMap<Long, Short> switchMap =map.get(s); 
    if(switchMap.containsValue(destinationMac)){ 
     return switchMap.get(destinationMac); 
    } 
} 
Смежные вопросы