aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py2/twisted/pair/ip.py
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/pair/ip.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-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.py71
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,
+ )