Lua скрипт для статистики из Diameter 3GPP - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь создать 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:

image description

Это единственное сообщение 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

...