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; 46*ada1a33fSZhang Chen /* Get vnet_hdr_len from filter */ 47*ada1a33fSZhang Chen uint32_t vnet_hdr_len; 4859509ec1SZhang Chen } Packet; 4959509ec1SZhang Chen 50b6540d40SZhang Chen typedef struct ConnectionKey { 51b6540d40SZhang Chen /* (src, dst) must be grouped, in the same way than in IP header */ 52b6540d40SZhang Chen struct in_addr src; 53b6540d40SZhang Chen struct in_addr dst; 54b6540d40SZhang Chen uint16_t src_port; 55b6540d40SZhang Chen uint16_t dst_port; 56b6540d40SZhang Chen uint8_t ip_proto; 57b6540d40SZhang Chen } QEMU_PACKED ConnectionKey; 58b6540d40SZhang Chen 59b6540d40SZhang Chen typedef struct Connection { 60b6540d40SZhang Chen /* connection primary send queue: element type: Packet */ 61b6540d40SZhang Chen GQueue primary_list; 62b6540d40SZhang Chen /* connection secondary send queue: element type: Packet */ 63b6540d40SZhang Chen GQueue secondary_list; 64b6540d40SZhang Chen /* flag to enqueue unprocessed_connections */ 65b6540d40SZhang Chen bool processing; 66b6540d40SZhang Chen uint8_t ip_proto; 6730656b09SZhang Chen /* offset = secondary_seq - primary_seq */ 6830656b09SZhang Chen tcp_seq offset; 6930656b09SZhang Chen /* 7030656b09SZhang Chen * we use this flag update offset func 7130656b09SZhang Chen * run once in independent tcp connection 7230656b09SZhang Chen */ 7330656b09SZhang Chen int syn_flag; 74b6540d40SZhang Chen } Connection; 75b6540d40SZhang Chen 76b6540d40SZhang Chen uint32_t connection_key_hash(const void *opaque); 77b6540d40SZhang Chen int connection_key_equal(const void *opaque1, const void *opaque2); 7859509ec1SZhang Chen int parse_packet_early(Packet *pkt); 79b6540d40SZhang Chen void fill_connection_key(Packet *pkt, ConnectionKey *key); 80afe46124SZhang Chen void reverse_connection_key(ConnectionKey *key); 81b6540d40SZhang Chen Connection *connection_new(ConnectionKey *key); 82b6540d40SZhang Chen void connection_destroy(void *opaque); 83b6540d40SZhang Chen Connection *connection_get(GHashTable *connection_track_table, 84b6540d40SZhang Chen ConnectionKey *key, 85b6540d40SZhang Chen GQueue *conn_list); 8659509ec1SZhang Chen void connection_hashtable_reset(GHashTable *connection_track_table); 87*ada1a33fSZhang Chen Packet *packet_new(const void *data, int size, int vnet_hdr_len); 8859509ec1SZhang Chen void packet_destroy(void *opaque, void *user_data); 8959509ec1SZhang Chen 9059509ec1SZhang Chen #endif /* QEMU_COLO_PROXY_H */ 91