Process an incoming package.

def handle(self):
        """Process an incoming package."""
        data = self.request[0]
        sock = self.request[1]

        frame = KNXIPFrame.from_frame(data)

        if frame.service_type_id == KNXIPFrame.TUNNELING_REQUEST:
            req = KNXTunnelingRequest.from_body(frame.body)
            msg = CEMIMessage.from_body(req.cemi)
            send_ack = False

            tunnel = self.server.tunnel

            if msg.code == 0x29:
                # LData.req
                send_ack = True
            elif msg.code == 0x2e:
                # LData.con
                send_ack = True
            else:
                problem = "Unimplemented cEMI message code {}".format(msg.code)
                logging.error(problem)
                raise KNXException(problem)

            # Cache data
            if (msg.cmd == CEMIMessage.CMD_GROUP_WRITE) or (
                    msg.cmd == CEMIMessage.CMD_GROUP_RESPONSE):
                    # saw a value for a group address on the bus
                tunnel.received_message(msg.dst_addr, msg.data)

            # Put RESPONSES into the result queue
            if msg.cmd == CEMIMessage.CMD_GROUP_RESPONSE:
                tunnel.result_queue.put(msg.data)

            if send_ack:
                bodyack = [0x04, req.channel, req.seq, E_NO_ERROR]
                ack = KNXIPFrame(KNXIPFrame.TUNNELLING_ACK)
                ack.body = bodyack
                sock.sendto(ack.to_frame(), self.client_address)

        elif frame.service_type_id == KNXIPFrame.TUNNELLING_ACK:
            logging.debug("Received tunneling ACK")
            self.server.tunnel.ack_semaphore.release()
        elif frame.service_type_id == KNXIPFrame.DISCONNECT_RESPONSE:
            logging.debug("Disconnected")
            self.channel = None
            tunnel = self.server.tunnel
            tunnel.data_server.shutdown()
            tunnel.data_server = None
        elif frame.service_type_id == KNXIPFrame.CONNECTIONSTATE_RESPONSE:
            logging.debug("Connection state response")
            tunnel.connection_state = frame.body[2]
        else:
            logging.info(
                "Message type %s not yet implemented", frame.service_type_id)