aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py3/twisted/pair/ethernet.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/ethernet.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/pair/ethernet.py')
-rw-r--r--contrib/python/Twisted/py3/twisted/pair/ethernet.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/pair/ethernet.py b/contrib/python/Twisted/py3/twisted/pair/ethernet.py
new file mode 100644
index 0000000000..ff58326235
--- /dev/null
+++ b/contrib/python/Twisted/py3/twisted/pair/ethernet.py
@@ -0,0 +1,59 @@
+# -*- test-case-name: twisted.pair.test.test_ethernet -*-
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+#
+
+
+"""Support for working directly with ethernet frames"""
+
+import struct
+
+from zope.interface import Interface, implementer
+
+from twisted.internet import protocol
+from twisted.pair import raw
+
+
+class IEthernetProtocol(Interface):
+ """An interface for protocols that handle Ethernet frames"""
+
+ def addProto(num, proto):
+ """Add an IRawPacketProtocol protocol"""
+
+ def datagramReceived(data, partial):
+ """An Ethernet frame has been received"""
+
+
+class EthernetHeader:
+ def __init__(self, data):
+ (self.dest, self.source, self.proto) = struct.unpack(
+ "!6s6sH", data[: 6 + 6 + 2]
+ )
+
+
+@implementer(IEthernetProtocol)
+class EthernetProtocol(protocol.AbstractDatagramProtocol):
+ def __init__(self):
+ self.etherProtos = {}
+
+ def addProto(self, num, proto):
+ proto = raw.IRawPacketProtocol(proto)
+ 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.etherProtos:
+ self.etherProtos[num] = []
+ self.etherProtos[num].append(proto)
+
+ def datagramReceived(self, data, partial=0):
+ header = EthernetHeader(data[:14])
+ for proto in self.etherProtos.get(header.proto, ()):
+ proto.datagramReceived(
+ data=data[14:],
+ partial=partial,
+ dest=header.dest,
+ source=header.source,
+ protocol=header.proto,
+ )