Создание пакетов scapy с PacketFields короче 8 бит - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь добавить новый протокол с помощью scapy и сталкиваюсь с трудностями при создании пакетов, в которых хранятся другие «пакеты» BitEnumField, длина которых не превышает один байт.Мне было интересно, если есть обходной путь, чтобы заставить его работать (без упаковки пакетов в полные байтовые поля).Вот пример:

from scapy.packet import Packet
from scapy.fields import *    

class Status(Packet):
    name = '4 bit status'

    fields_desc = [
        BitEnumField('a', 0, 1, {0:'Disabled', 1:'Enabled'}),
        BitEnumField('b', 0, 1, {0:'Disabled', 1:'Active'}),
        BitEnumField('c', 0, 1, {0:'Disabled', 1:'Active'}),
        BitEnumField('d', 0, 1, {0:'Disabled', 1:'Active'}),
        ]

    #this is added for debug purposes only
    def post_build(self, pkt,pay):
        print "pkt:", pkt, "type:", type(pkt)
        return pkt+pay

Теперь я могу понять, почему Status().show2() дает сбой, когда pkt имеет длину всего 4 бита.но этот тоже умирает (я полагаю, потому что каждый пакет формируется независимо):

class TotalStatus(Packet):
    name = "8 bit status"

    fields_desc = [
        PacketField('axis0', Status(), Status),
        PacketField('axis1', Status(), Status),
        ]

TotalStatus().show2() дает вам длительную обратную трассировку, которая заканчивается self.post_build() неспособностью cat pkt кортежем и остальной полезной нагрузкой, которая является пустой строкой.Т.е.: >>> TypeError: can only concatenate tuple (not "str") to tuple

Есть ли способ избежать объединения битовых полей в полные байты?

1 Ответ

4 голосов
/ 27 октября 2011

Полагаю, что пакет всегда выровнен по байту, поэтому вам, возможно, придется как-то использовать поле, например:

class StatusField(FlagsField):
  name = '4 bit status'
  def __init__(self, name):
    FlagsField.__init__(self, name, 0, 4, ["a", "b", "c", "d"])

class TotalStatus(Packet):
  name = "8 bit status"
  fields_desc = [
    StatusField("axis0"),
    StatusField("axis1"),
  ] 
...