Отправка пакета LLDP с использованием SharpPcap и Packet.Net

Итак, я провел день, пытаясь отправить пакет LLDP на С#, используя SharpPcap и Packet.Net.

Что я придумал бомбы с NullReferenceException. Я знаю почему, но я не знаю, что с этим делать.

Это мой код:

namespace LLDPTest {
    using System;
    using System.Linq;
    using System.Net.NetworkInformation;
    using System.Threading;

    using PacketDotNet;

    using SharpPcap.WinPcap;

    class Program {
        static void Main(string[] args) {
            //var timer = new Timer(state => SendLLDPPacketOnAllInterfaces(), null, 0, 1000);
            SendLLDPPacketOnAllInterfaces();
            Console.ReadLine();
        }

        private static void SendLLDPPacketOnAllInterfaces() {
            var winPcapDeviceList = WinPcapDeviceList.Instance;

            foreach (var device in winPcapDeviceList.Where(device => device.Interface.GatewayAddress != null)) {
                SendLLDPPacket(device);
            }
        }

        private static void SendLLDPPacket(WinPcapDevice device) {
            var packet = LLDPPacket.RandomPacket();

            //packet.Header = ???

            var ethernetPacket = new EthernetPacket(device.Addresses[1].Addr.hardwareAddress, PhysicalAddress.Parse("01-80-C2-00-00-0E"), EthernetPacketType.LLDP);

            ethernetPacket.PayloadPacket = packet;

            device.Open();
            device.SendPacket(ethernetPacket);
            device.Close();
            Console.WriteLine("LLDP packet sent!");
        }
    }
}

Исключение выдается в строке 36 (device.SendPacket(ethernetPacket);)

Причина этого в том, что свойство заголовка пакета не должно быть нулевым. Исключение выдается в строке 229 файла Packet.cs, где выполняется следующая проверка:

                if ((this.header.Bytes != this.payloadPacketOrData.ThePacket.header.Bytes) || ((this.header.Offset + this.header.Length) != this.payloadPacketOrData.ThePacket.header.Offset))
                {
                    return false;
                }

Короче говоря, я просто не знаю, что я должен установить для свойства заголовка, в Google или где-либо еще нет примеров.

EDIT: this.payloadPacketOrData.ThePacket.header равно null. Это пакет, полученный в результате вызова LLDPPacket.RandomPacket();. К сожалению, свойство заголовка не имеет установщика.

EDIT2: я использую последние версии обоих пакетов от NuGet.

EDIT3: http://wiki.wireshark.org/LinkLayerDiscoveryProtocol говорит, что

Интересно отметить, что в отличие от проектов LLDP, упомянутых выше, окончательный стандарт LLDP отказался от понятия заголовка LLDP и вместо этого просто предписывал наличие определенных TLV. В различных проектах документов заголовок LLDP должен был включать поле «Версия». Текущий стандарт LLDP не включает понятие версии.


person lightxx    schedule 20.01.2015    source источник
comment
Это старый документ, но в нем указано, какие TLV являются обязательными. ieee802.org/1/files/public/docs2002/ lldp-протокол-02.pdf   -  person Mike    schedule 20.01.2015
comment
Спасибо за ваш комментарий. Однако TLV — не моя проблема. Моя проблема заключается в том, что свойство заголовка пакета имеет значение null и не имеет установщика, поэтому возникает исключение, когда проверяется this.payloadPacketOrData.ThePacket.header.Bytes.   -  person lightxx    schedule 20.01.2015


Ответы (1)


Вздох. Я понятия не имею, почему, но после проверки модульных тестов (https://github.com/antmicro/Packet.Net/blob/master/Test/PacketType/LldpTest.cs) Я наткнулся на решение (строки 78-79):

var packet = LLDPPacket.RandomPacket();
var lldpBytes = packet.Bytes;
var lldpPacket = new LLDPPacket(new ByteArraySegment(lldpBytes));

Я не знаю, зачем нужно то, что авторы называют "повторным разбором", но теперь это работает.

person lightxx    schedule 20.01.2015
comment
Я предполагаю, что это ошибка. Файл .pcap с наименьшим количеством пакетов, необходимых для воспроизведения проблемы, позволил бы мне выполнить модульный тест для этой проблемы, а затем решить ее. - person Chris Morgan; 11.02.2017