OLD | NEW |
| (Empty) |
1 # -*- test-case-name: twisted.pair.test.test_rawudp -*- | |
2 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
3 # See LICENSE for details. | |
4 | |
5 # | |
6 | |
7 """Implementation of raw packet interfaces for UDP""" | |
8 | |
9 import struct | |
10 | |
11 from twisted.internet import protocol | |
12 from twisted.pair import raw | |
13 from zope.interface import implements | |
14 | |
15 class UDPHeader: | |
16 def __init__(self, data): | |
17 | |
18 (self.source, self.dest, self.len, self.check) \ | |
19 = struct.unpack("!HHHH", data[:8]) | |
20 | |
21 class RawUDPProtocol(protocol.AbstractDatagramProtocol): | |
22 implements(raw.IRawDatagramProtocol) | |
23 def __init__(self): | |
24 self.udpProtos = {} | |
25 | |
26 def addProto(self, num, proto): | |
27 if not isinstance(proto, protocol.DatagramProtocol): | |
28 raise TypeError, 'Added protocol must be an instance of DatagramProt
ocol' | |
29 if num < 0: | |
30 raise TypeError, 'Added protocol must be positive or zero' | |
31 if num >= 2**16: | |
32 raise TypeError, 'Added protocol must fit in 16 bits' | |
33 if num not in self.udpProtos: | |
34 self.udpProtos[num] = [] | |
35 self.udpProtos[num].append(proto) | |
36 | |
37 def datagramReceived(self, | |
38 data, | |
39 partial, | |
40 source, | |
41 dest, | |
42 protocol, | |
43 version, | |
44 ihl, | |
45 tos, | |
46 tot_len, | |
47 fragment_id, | |
48 fragment_offset, | |
49 dont_fragment, | |
50 more_fragments, | |
51 ttl): | |
52 header = UDPHeader(data) | |
53 for proto in self.udpProtos.get(header.dest, ()): | |
54 proto.datagramReceived(data[8:], | |
55 (source, header.source)) | |
OLD | NEW |