Я работаю над протоколом беспроводной маршрутизации. Я создал очередь на каждом узле. В этой очереди каждый узел хранит пакет, который он уже передал. Если пакет не будет передан nexthop, то предыдущий узел повторно отправит пакет после истечения времени ожидания. Проблема состоит в том, что когда узел пытается повторно передать пакет, вызвав postRotingHook в функции handle для повторной передачи, он ничего не делает. Этот postRoutingHook создается локально, поэтому фактически не отправляет пакет. Так как же соединить этот пакет с сетью для повторной передачи?
Пример: Предположим, у нас есть 3 узла A, B и C. A является источником, B является промежуточным и C является пунктом назначения. Узел А отправил пакет изначально. Теперь узел B будет пересылать его узлу C. В это время узел A будет подслушивать этот пакет, и он отменит таймер и удалит этот пакет из своей очереди. (в нормальном состоянии)
Предположим, что узел B не может переслать пакет по какой-то причине, тогда узел A должен повторно передать пакет после истечения времени ожидания. Я не могу достичь этой функциональности.
Мой сценарий программирования:
Я изменил протокол GPSR. Где заголовочный файл имеет определение этих 5 методов INetfilterHooks. Я не использовал какой-либо контрольный пакет, например запрос, ответ, маяк и т. д. Я непосредственно имею дело с пакетом данных, который содержит некоторую управляющую информацию. Я реализовал свою логику в методе datagramPreRoutingHook () (когда данные получены из нижнего уровня) и в методе datagramLocalOutHook () (когда данные получены из верхнего уровня).
Исходный узел (на сетевом уровне) получает пакет от верхнего уровня в IPv4.cc, используя handlePacketFromHL () -> datagramLocalOutHook (datagram, destIE, nextHopAddr) == INetfilter :: IHook :: ACCEPT), когда он вызывает datagramLocalOutHook (datagram, destIE, nextHopAddr) затем управление переходит к моему протоколу маршрутизации. Он вносит необходимые изменения, добавляет источник, адрес назначения, создает параметры и сохраняет пакет в очереди (для повторной передачи по таймеру планирования), а затем возвращает ACCEP. Затем управление снова переходит к IPv4.cc.
После этого процесса, если по моему протоколу истекло время ожидания, я не могу отправить пакет на IPv4.cc. Я вызвал postRoutingHook для повторной передачи пакета, затем он просто возвращает ACCEPT (как определено в заголовочном файле) и ничего не делает. Я пытался вызвать некоторые методы IPv4.cc, создав объект IPv4 в своем протоколе, но эти методы защищены, поэтому я не смог получить доступ к этим методам.
Я попытался сделать несколько публичных методов IPv4.cc, но на следующем этапе он выдает ошибку.
Я попытался сделать объект INetfilter :: IHook для вызова его postRoutingHook (), но также выдает ошибку, поскольку объект абстрактного класса не может быть создан.