diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/pair/ip.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/pair/ip.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/pair/ip.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/pair/ip.py b/contrib/python/Twisted/py2/twisted/pair/ip.py new file mode 100644 index 0000000000..47db7075d7 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/pair/ip.py @@ -0,0 +1,71 @@ +# -*- test-case-name: twisted.pair.test.test_ip -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +# + + +"""Support for working directly with IP packets""" + +import struct +import socket + +from twisted.internet import protocol +from twisted.pair import raw +from zope.interface import implementer + + +class IPHeader: + def __init__(self, data): + + (ihlversion, self.tos, self.tot_len, self.fragment_id, frag_off, + self.ttl, self.protocol, self.check, saddr, daddr) \ + = struct.unpack("!BBHHHBBH4s4s", data[:20]) + self.saddr = socket.inet_ntoa(saddr) + self.daddr = socket.inet_ntoa(daddr) + self.version = ihlversion & 0x0F + self.ihl = ((ihlversion & 0xF0) >> 4) << 2 + self.fragment_offset = frag_off & 0x1FFF + self.dont_fragment = (frag_off & 0x4000 != 0) + self.more_fragments = (frag_off & 0x2000 != 0) + +MAX_SIZE = 2**32 + +@implementer(raw.IRawPacketProtocol) +class IPProtocol(protocol.AbstractDatagramProtocol): + def __init__(self): + self.ipProtos = {} + + def addProto(self, num, proto): + proto = raw.IRawDatagramProtocol(proto) + if num < 0: + raise TypeError('Added protocol must be positive or zero') + if num >= MAX_SIZE: + raise TypeError('Added protocol must fit in 32 bits') + if num not in self.ipProtos: + self.ipProtos[num] = [] + self.ipProtos[num].append(proto) + + def datagramReceived(self, + data, + partial, + dest, + source, + protocol): + header = IPHeader(data) + for proto in self.ipProtos.get(header.protocol, ()): + proto.datagramReceived(data=data[20:], + partial=partial, + source=header.saddr, + dest=header.daddr, + protocol=header.protocol, + version=header.version, + ihl=header.ihl, + tos=header.tos, + tot_len=header.tot_len, + fragment_id=header.fragment_id, + fragment_offset=header.fragment_offset, + dont_fragment=header.dont_fragment, + more_fragments=header.more_fragments, + ttl=header.ttl, + ) |