+ if ip in clients:
+ raise ValueError('multiple client cfg sections for %s' % ip)
+ clients[ip] = self
+
+ def process_arriving_data(self, d):
+ for packet in slip.decode(d):
+ (saddr, daddr) = packet_addrs(packet)
+ if saddr != self._ip:
+ raise ValueError('wrong source address %s' % saddr)
+ route(packet, saddr, daddr)
+
+ def _req_cancel(self, request):
+ request.finish()
+
+ def _req_error(self, err, request):
+ self._req_cancel(request)
+
+ def queue_outbound(self, packet):
+ self._pq.append(packet)
+ self._check_outbound()
+
+ def http_request(self, request):
+ request.setHeader('Content-Type','application/octet-stream')
+ reactor.callLater(self.max_request_time, self._req_cancel, request)
+ request.notifyFinish().addErrback(self._req_error, request)
+ self._rq.append(request)
+ self._check_outbound()
+
+ def _check_outbound(self):
+ while True:
+ try: request = self._rq[0]
+ except IndexError: request = None
+ if request and request.finished:
+ self._rq.popleft()
+ continue
+
+ if not self._pq.nonempty():
+ # no packets, oh well
+ continue
+
+ if request is None:
+ # no request
+ break
+
+ # request, and also some non-expired packets
+ while True:
+ packet = self.pq.popleft()
+ if packet is None: break