Я пытаюсь создать lua скрипт для go через Diameter-pcap, собрать интересующую меня информацию и сгенерировать статистику c.
Это частично успешный, рабочий скрипт может быть найденным в GitHub , но у меня все еще есть некоторые сомнения
Field.new () и множественные вхождения AVP
Я использую Field.new()
для извлечения AVP, например:
local rrField = Field.new("diameter.3GPP-Reporting-Reason")
local toField = Field.new("diameter.CC-Total-Octets")
Но в одном пакете может быть несколько вхождений AVP. Конечно, я могу получить к ним доступ в виде массива из
local rrFields = {rrField()}
local toFields = {toField()}
Но мне не хватает ссылки , откуда из был получен AVP. Хороший пример: Result-Code AVP
:
Это единственное сообщение Diameter встречается три раза, но в результате я получаю массив из трех 2001 без хорошего понимание, на каком уровне это появилось.
Ситуация становится еще более запутанной, когда один пакет содержит несколько сообщений Diameter. Тогда я даже не могу понять, из какого сообщения AVP есть.
Функция tap.packet (pinfo, tvb, tapdata) не заполняет tapdata
Другая идея была копать в tapdata
. Если я правильно понял 11.4.1.5. listener.packet , tapdata
(он же tapinfo
) должен быть заполнен рассеченными данными, верно? Следовательно, я должен быть в состоянии разобрать сообщение.
Однако, независимо от того, как сильно я стараюсь, tapdata
всегда не установлен (т. Е. Ноль). В коде GitHub
tap = Listener.new("diameter", filter)
, но я также экспериментировал с 3-м параметром, установив его в true
(в надежде на генерацию всех полей, даже в ущерб производительности). Не повезло.
[Обновление 2020/03/20]
Самоответ на Function tap.packet(pinfo, tvb, tapdata) does not populate tapdata
После изучения исходного кода Wireshark (tshark ) оказывается, что Diameter не заполняет эту переменную, поскольку данные tapdata не имеют ссылки на Diameter. Я попытался добавить его в определение taps
, и переменная (таблица) была заполнена, даже имена хэшей в порядке. Но переменные в хешах не являются ... Во всяком случае, вот изменение:
MBP:wireshark jhartman$ git diff epan/wslua/taps
diff --git a/epan/wslua/taps b/epan/wslua/taps
index 11b1132171..ea28865109 100644
--- a/epan/wslua/taps
+++ b/epan/wslua/taps
@@ -62,4 +62,5 @@ tcp ../dissectors/packet-tcp.h tcp_info_t
#tls ../dissectors/packet-tls.h ssl_info_t
#tr ../dissectors/packet-tr.h tr_info_t
wlan ../dissectors/packet-ieee80211.h wlan_hdr_t
+diameter ../dissectors/packet-diameter.h diam_sub_dis_t
#wsp ../dissectors/packet-wsp.h wsp_info_t
Вопрос
- Правильный ли этот подход? Или я должен использовать другие способы - такие как цепочечные диссекторы или почтовый диссектор? Но мне не было ясно, смогу ли я получить доступ к вскрытым данным до необходимого мне уровня?
Любая помощь будет очень признательна.
Заранее спасибо и наилучшими пожеланиями, Jarek