aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py3/twisted/pair/rawudp.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/py3/twisted/pair/rawudp.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/pair/rawudp.py')
-rw-r--r--contrib/python/Twisted/py3/twisted/pair/rawudp.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/pair/rawudp.py b/contrib/python/Twisted/py3/twisted/pair/rawudp.py
new file mode 100644
index 0000000000..c4f2d97ef4
--- /dev/null
+++ b/contrib/python/Twisted/py3/twisted/pair/rawudp.py
@@ -0,0 +1,59 @@
+# -*- test-case-name: twisted.pair.test.test_rawudp -*-
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Implementation of raw packet interfaces for UDP
+"""
+
+import struct
+
+from zope.interface import implementer
+
+from twisted.internet import protocol
+from twisted.pair import raw
+
+
+class UDPHeader:
+ def __init__(self, data):
+ (self.source, self.dest, self.len, self.check) = struct.unpack(
+ "!HHHH", data[:8]
+ )
+
+
+@implementer(raw.IRawDatagramProtocol)
+class RawUDPProtocol(protocol.AbstractDatagramProtocol):
+ def __init__(self):
+ self.udpProtos = {}
+
+ def addProto(self, num, proto):
+ if not isinstance(proto, protocol.DatagramProtocol):
+ raise TypeError("Added protocol must be an instance of DatagramProtocol")
+ if num < 0:
+ raise TypeError("Added protocol must be positive or zero")
+ if num >= 2**16:
+ raise TypeError("Added protocol must fit in 16 bits")
+ if num not in self.udpProtos:
+ self.udpProtos[num] = []
+ self.udpProtos[num].append(proto)
+
+ def datagramReceived(
+ self,
+ data,
+ partial,
+ source,
+ dest,
+ protocol,
+ version,
+ ihl,
+ tos,
+ tot_len,
+ fragment_id,
+ fragment_offset,
+ dont_fragment,
+ more_fragments,
+ ttl,
+ ):
+ header = UDPHeader(data)
+ for proto in self.udpProtos.get(header.dest, ()):
+ proto.datagramReceived(data[8:], (source, header.source))