2012-05-11 8 views
2

別のクラスのフィールドに応じてクラスのフィールド型を動的に定義する方法は不思議ですか? 私は、別のクラスへのクラスからの例をフィールドを定義してリンクする方法を意味する:他のクラスのフィールドに応じて動的にフィールド型を取得する(Scapyツールを使用する - Python)

class TemplateRecord(Packet): 
    name = "Template Record" 
    fields_desc = [ ShortField("Type", 0), 
        ShortField("Length", 0) ] 

    def extract_padding(self, s): 
      return "", s 


class DataRecord(Packet): 
    name = "Data Record" 
    fields_desc = [ ==> Here i would like something like this : 

      "if Type == 0 from Class TemplateRecord: 
       IPField("ipsrc", "0.0.0.0"), 
      if Type == 1 from Class TemplateRecord 
       IPField("ipdst", "0.0.0.0"), 
      if Type == 2 from Class TemplateRecord 
            ByteField("DstMask", 0), 

      ....etc..." 

     ] 
    def extract_padding(self, s): 
      return "", s 

答えて

1

私はあなたが望むものにScapyが持っている最も近い機能が条件付きフィールドであると信じています。形式は次のとおりです。

ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1) 

Packet.underlayerと組み合わせて使用​​してください。

あなたはまた、条件付きレイヤーを追加するbind_layers機能を使用することができます

ConditionalField(IPField("ipsrc", "0.0.0.0"), lambda pkt:pkt.underlayer.Type==0), 
ConditionalField(IPField("ipdst", "0.0.0.0"), lambda pkt:pkt.underlayer.Type==1), 
ConditionalField(ByteField("DstMask", 0), lambda pkt:pkt.underlayer.Type==2) 
0

)層がTemplateRecord()/ DataRecord(ように設定されていると仮定すると。 ステップ:

  1. 主PKTテンプレートクラス(TemplateRecord)
  2. の定義は、条件付き2つのパケットの層を結合すること
  3. 使用bind_layersを(タイプ= 1 DataRecord1)サブPKTクラスを定義します。あなたのケースのための

構文は次のようになります。

bind_layers(TemplateRecord, DataRecordForType1, {'Type':1}) 
関連する問題