-int (*request_handlers[256])(conn_list_t*) = {
- 0, ack_h, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- termreq_h, timeout_h, del_host_h, 0, 0, 0, 0, 0, 0, 0,
- ping_h, pong_h, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- add_host_h, basic_info_h, passphrase_h, public_key_h, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- tcppacket_h, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- req_key_h, ans_key_h, key_changed_h, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
+int send_tcppacket(connection_t *cl, vpn_packet_t *packet)
+{
+ int x;
+
+ x = send_request(cl->nexthop, "%d %hd", PACKET, packet->len);
+
+ if(x)
+ return x;
+
+ return send_meta(cl->nexthop, packet->data, packet->len);
+}
+
+int tcppacket_h(connection_t *cl)
+{
+ vpn_packet_t packet;
+ char *p;
+ int todo, x;
+
+ if(sscanf(cl->buffer, "%*d %hd", packet.len) != 1)
+ {
+ syslog(LOG_ERR, _("Got bad PACKET from %s (%s)"), cl->name, cl->hostname);
+ return -1;
+ }
+
+ /* Evil hack. */
+
+ p = packet.data;
+ todo = packet.len;
+
+ while(todo)
+ {
+ x = read(cl->meta_socket, p, todo);
+ if(x<0)
+ {
+ syslog(LOG_ERR, _("Error during reception of PACKET from %s (%s): %m"), cl->name, cl->hostname);
+ return -1;
+ }
+
+ todo -= x;
+ p += x;
+ }
+
+ return receive_packet(cl, &packet);
+}
+
+/* Jumptable for the request handlers */
+
+int (*request_handlers[])(connection_t*) = {
+ id_h, challenge_h, chal_reply_h, metakey_h, ack_h,
+ status_h, error_h, termreq_h,
+ ping_h, pong_h,
+ add_host_h, del_host_h,
+ add_subnet_h, del_subnet_h,
+ key_changed_h, req_key_h, ans_key_h,
+ tcppacket_h,
+};
+
+/* Request names */
+
+char (*request_name[]) = {
+ "ID", "CHALLENGE", "CHAL_REPLY", "METAKEY", "ACK",
+ "STATUS", "ERROR", "TERMREQ",
+ "PING", "PONG",
+ "ADD_HOST", "DEL_HOST",
+ "ADD_SUBNET", "DEL_SUBNET",
+ "KEY_CHANGED", "REQ_KEY", "ANS_KEY",
+ "PACKET",
+};
+
+/* Status strings */
+
+char (*status_text[]) = {
+ "Warning",
+};
+
+/* Error strings */
+
+char (*error_text[]) = {
+ "Error",