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" 2059509ec1SZhang Chen 2159509ec1SZhang Chen #define HASHTABLE_MAX_SIZE 16384 2259509ec1SZhang Chen 23*b6540d40SZhang Chen #ifndef IPPROTO_DCCP 24*b6540d40SZhang Chen #define IPPROTO_DCCP 33 25*b6540d40SZhang Chen #endif 26*b6540d40SZhang Chen 27*b6540d40SZhang Chen #ifndef IPPROTO_SCTP 28*b6540d40SZhang Chen #define IPPROTO_SCTP 132 29*b6540d40SZhang Chen #endif 30*b6540d40SZhang Chen 31*b6540d40SZhang Chen #ifndef IPPROTO_UDPLITE 32*b6540d40SZhang Chen #define IPPROTO_UDPLITE 136 33*b6540d40SZhang Chen #endif 34*b6540d40SZhang Chen 3559509ec1SZhang Chen typedef struct Packet { 3659509ec1SZhang Chen void *data; 3759509ec1SZhang Chen union { 3859509ec1SZhang Chen uint8_t *network_header; 3959509ec1SZhang Chen struct ip *ip; 4059509ec1SZhang Chen }; 4159509ec1SZhang Chen uint8_t *transport_header; 4259509ec1SZhang Chen int size; 4359509ec1SZhang Chen } Packet; 4459509ec1SZhang Chen 45*b6540d40SZhang Chen typedef struct ConnectionKey { 46*b6540d40SZhang Chen /* (src, dst) must be grouped, in the same way than in IP header */ 47*b6540d40SZhang Chen struct in_addr src; 48*b6540d40SZhang Chen struct in_addr dst; 49*b6540d40SZhang Chen uint16_t src_port; 50*b6540d40SZhang Chen uint16_t dst_port; 51*b6540d40SZhang Chen uint8_t ip_proto; 52*b6540d40SZhang Chen } QEMU_PACKED ConnectionKey; 53*b6540d40SZhang Chen 54*b6540d40SZhang Chen typedef struct Connection { 55*b6540d40SZhang Chen /* connection primary send queue: element type: Packet */ 56*b6540d40SZhang Chen GQueue primary_list; 57*b6540d40SZhang Chen /* connection secondary send queue: element type: Packet */ 58*b6540d40SZhang Chen GQueue secondary_list; 59*b6540d40SZhang Chen /* flag to enqueue unprocessed_connections */ 60*b6540d40SZhang Chen bool processing; 61*b6540d40SZhang Chen uint8_t ip_proto; 62*b6540d40SZhang Chen } Connection; 63*b6540d40SZhang Chen 64*b6540d40SZhang Chen uint32_t connection_key_hash(const void *opaque); 65*b6540d40SZhang Chen int connection_key_equal(const void *opaque1, const void *opaque2); 6659509ec1SZhang Chen int parse_packet_early(Packet *pkt); 67*b6540d40SZhang Chen void fill_connection_key(Packet *pkt, ConnectionKey *key); 68*b6540d40SZhang Chen Connection *connection_new(ConnectionKey *key); 69*b6540d40SZhang Chen void connection_destroy(void *opaque); 70*b6540d40SZhang Chen Connection *connection_get(GHashTable *connection_track_table, 71*b6540d40SZhang Chen ConnectionKey *key, 72*b6540d40SZhang Chen GQueue *conn_list); 7359509ec1SZhang Chen void connection_hashtable_reset(GHashTable *connection_track_table); 7459509ec1SZhang Chen Packet *packet_new(const void *data, int size); 7559509ec1SZhang Chen void packet_destroy(void *opaque, void *user_data); 7659509ec1SZhang Chen 7759509ec1SZhang Chen #endif /* QEMU_COLO_PROXY_H */ 78