159509ec1SZhang Chen /* 259509ec1SZhang Chen * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) 359509ec1SZhang Chen * (a.k.a. Fault Tolerance or Continuous Replication) 459509ec1SZhang Chen * 559509ec1SZhang Chen * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. 659509ec1SZhang Chen * Copyright (c) 2016 FUJITSU LIMITED 759509ec1SZhang Chen * Copyright (c) 2016 Intel Corporation 859509ec1SZhang Chen * 959509ec1SZhang Chen * Author: Zhang Chen <zhangchen.fnst@cn.fujitsu.com> 1059509ec1SZhang Chen * 1159509ec1SZhang Chen * This work is licensed under the terms of the GNU GPL, version 2 or 1259509ec1SZhang Chen * later. See the COPYING file in the top-level directory. 1359509ec1SZhang Chen */ 1459509ec1SZhang Chen 1559509ec1SZhang Chen #ifndef QEMU_COLO_PROXY_H 1659509ec1SZhang Chen #define QEMU_COLO_PROXY_H 1759509ec1SZhang Chen 1859509ec1SZhang Chen #include "slirp/slirp.h" 19ccf0426cSZhang Chen #include "qemu/jhash.h" 200682e15bSZhang Chen #include "qemu/timer.h" 2159509ec1SZhang Chen 2259509ec1SZhang Chen #define HASHTABLE_MAX_SIZE 16384 2359509ec1SZhang Chen 24b6540d40SZhang Chen #ifndef IPPROTO_DCCP 25b6540d40SZhang Chen #define IPPROTO_DCCP 33 26b6540d40SZhang Chen #endif 27b6540d40SZhang Chen 28b6540d40SZhang Chen #ifndef IPPROTO_SCTP 29b6540d40SZhang Chen #define IPPROTO_SCTP 132 30b6540d40SZhang Chen #endif 31b6540d40SZhang Chen 32b6540d40SZhang Chen #ifndef IPPROTO_UDPLITE 33b6540d40SZhang Chen #define IPPROTO_UDPLITE 136 34b6540d40SZhang Chen #endif 35b6540d40SZhang Chen 3659509ec1SZhang Chen typedef struct Packet { 3759509ec1SZhang Chen void *data; 3859509ec1SZhang Chen union { 3959509ec1SZhang Chen uint8_t *network_header; 4059509ec1SZhang Chen struct ip *ip; 4159509ec1SZhang Chen }; 4259509ec1SZhang Chen uint8_t *transport_header; 4359509ec1SZhang Chen int size; 440682e15bSZhang Chen /* Time of packet creation, in wall clock ms */ 450682e15bSZhang Chen int64_t creation_ms; 4659509ec1SZhang Chen } Packet; 4759509ec1SZhang Chen 48b6540d40SZhang Chen typedef struct ConnectionKey { 49b6540d40SZhang Chen /* (src, dst) must be grouped, in the same way than in IP header */ 50b6540d40SZhang Chen struct in_addr src; 51b6540d40SZhang Chen struct in_addr dst; 52b6540d40SZhang Chen uint16_t src_port; 53b6540d40SZhang Chen uint16_t dst_port; 54b6540d40SZhang Chen uint8_t ip_proto; 55b6540d40SZhang Chen } QEMU_PACKED ConnectionKey; 56b6540d40SZhang Chen 57b6540d40SZhang Chen typedef struct Connection { 58b6540d40SZhang Chen /* connection primary send queue: element type: Packet */ 59b6540d40SZhang Chen GQueue primary_list; 60b6540d40SZhang Chen /* connection secondary send queue: element type: Packet */ 61b6540d40SZhang Chen GQueue secondary_list; 62b6540d40SZhang Chen /* flag to enqueue unprocessed_connections */ 63b6540d40SZhang Chen bool processing; 64b6540d40SZhang Chen uint8_t ip_proto; 65b6540d40SZhang Chen } Connection; 66b6540d40SZhang Chen 67b6540d40SZhang Chen uint32_t connection_key_hash(const void *opaque); 68b6540d40SZhang Chen int connection_key_equal(const void *opaque1, const void *opaque2); 6959509ec1SZhang Chen int parse_packet_early(Packet *pkt); 70b6540d40SZhang Chen void fill_connection_key(Packet *pkt, ConnectionKey *key); 71*afe46124SZhang Chen void reverse_connection_key(ConnectionKey *key); 72b6540d40SZhang Chen Connection *connection_new(ConnectionKey *key); 73b6540d40SZhang Chen void connection_destroy(void *opaque); 74b6540d40SZhang Chen Connection *connection_get(GHashTable *connection_track_table, 75b6540d40SZhang Chen ConnectionKey *key, 76b6540d40SZhang Chen GQueue *conn_list); 7759509ec1SZhang Chen void connection_hashtable_reset(GHashTable *connection_track_table); 7859509ec1SZhang Chen Packet *packet_new(const void *data, int size); 7959509ec1SZhang Chen void packet_destroy(void *opaque, void *user_data); 8059509ec1SZhang Chen 8159509ec1SZhang Chen #endif /* QEMU_COLO_PROXY_H */ 82