diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index 4aec65a0b053ac71b675d322f443be38f762dd17..01ce0f23a7853effe2d8b362d72ec5edcfe599a9 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -325,6 +325,26 @@ class ICMPTimeStampField(IntField): return val +class DestIPField(IPField): + __slots__ = ["defaultdst"] + def __init__(self, name, default): + IPField.__init__(self, name, None) + self.defaultdst = default + def dst_from_pkt(self, pkt): + if isinstance(pkt.payload, UDP): + if pkt.payload.dport == 5353: + return "224.0.0.251" + return self.defaultdst + def i2m(self, pkt, x): + if x is None: + x = self.dst_from_pkt(pkt) + return IPField.i2m(self, pkt, x) + def i2h(self, pkt, x): + if x is None: + x = self.dst_from_pkt(pkt) + return IPField.i2h(self, pkt, x) + + class IP(Packet, IPTools): __slots__ = ["_defrag_pos"] name = "IP" @@ -340,7 +360,7 @@ class IP(Packet, IPTools): XShortField("chksum", None), #IPField("src", "127.0.0.1"), Emph(SourceIPField("src","dst")), - Emph(IPField("dst", "127.0.0.1")), + Emph(DestIPField("dst", "127.0.0.1")), PacketListField("options", [], IPOption, length_from=lambda p:p.ihl*4-20) ] def post_build(self, p, pay): ihl = self.ihl diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index a0ce6b3207aa2dd918e62be9474d12182cd52868..185628633df3efa16280eb6af6dbfc2e37040fd3 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -247,6 +247,25 @@ class SourceIP6Field(IP6Field): iff,x,nh = conf.route6.route(dst) return IP6Field.i2h(self, pkt, x) +class DestIP6Field(IP6Field): + __slots__ = ["defaultdst"] + def __init__(self, name, default): + IP6Field.__init__(self, name, None) + self.defaultdst = default + def dst_from_pkt(self, pkt): + if isinstance(pkt.payload, UDP): + if pkt.payload.dport == 5353: + return "ff02::fb" + return self.defaultdst + def i2m(self, pkt, x): + if x is None: + x = self.dst_from_pkt(pkt) + return IP6Field.i2m(self, pkt, x) + def i2h(self, pkt, x): + if x is None: + x = self.dst_from_pkt(pkt) + return IP6Field.i2h(self, pkt, x) + ipv6nh = { 0:"Hop-by-Hop Option Header", 4:"IP", 6:"TCP", @@ -358,7 +377,7 @@ class IPv6(_IPv6GuessPayload, Packet, IPTools): ByteEnumField("nh", 59, ipv6nh), ByteField("hlim", 64), SourceIP6Field("src", "dst"), # dst is for src @ selection - IP6Field("dst", "::1") ] + DestIP6Field("dst", "::1") ] def route(self): dst = self.dst