qemu/net/colo.h
<<
>>
Prefs
   1/*
   2 * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO)
   3 * (a.k.a. Fault Tolerance or Continuous Replication)
   4 *
   5 * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
   6 * Copyright (c) 2016 FUJITSU LIMITED
   7 * Copyright (c) 2016 Intel Corporation
   8 *
   9 * Author: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
  10 *
  11 * This work is licensed under the terms of the GNU GPL, version 2 or
  12 * later.  See the COPYING file in the top-level directory.
  13 */
  14
  15#ifndef QEMU_COLO_PROXY_H
  16#define QEMU_COLO_PROXY_H
  17
  18#include "slirp/slirp.h"
  19#include "qemu/jhash.h"
  20#include "qemu/timer.h"
  21
  22#define HASHTABLE_MAX_SIZE 16384
  23
  24#ifndef IPPROTO_DCCP
  25#define IPPROTO_DCCP 33
  26#endif
  27
  28#ifndef IPPROTO_SCTP
  29#define IPPROTO_SCTP 132
  30#endif
  31
  32#ifndef IPPROTO_UDPLITE
  33#define IPPROTO_UDPLITE 136
  34#endif
  35
  36typedef struct Packet {
  37    void *data;
  38    union {
  39        uint8_t *network_header;
  40        struct ip *ip;
  41    };
  42    uint8_t *transport_header;
  43    int size;
  44    /* Time of packet creation, in wall clock ms */
  45    int64_t creation_ms;
  46    /* Get vnet_hdr_len from filter */
  47    uint32_t vnet_hdr_len;
  48    uint32_t tcp_seq; /* sequence number */
  49    uint32_t tcp_ack; /* acknowledgement number */
  50    /* the sequence number of the last byte of the packet */
  51    uint32_t seq_end;
  52    uint8_t header_size;  /* the header length */
  53    uint16_t payload_size; /* the payload length */
  54    /* record the payload offset(the length that has been compared) */
  55    uint16_t offset;
  56    uint8_t flags; /* Flags(aka Control bits) */
  57} Packet;
  58
  59typedef struct ConnectionKey {
  60    /* (src, dst) must be grouped, in the same way than in IP header */
  61    struct in_addr src;
  62    struct in_addr dst;
  63    uint16_t src_port;
  64    uint16_t dst_port;
  65    uint8_t ip_proto;
  66} QEMU_PACKED ConnectionKey;
  67
  68typedef struct Connection {
  69    /* connection primary send queue: element type: Packet */
  70    GQueue primary_list;
  71    /* connection secondary send queue: element type: Packet */
  72    GQueue secondary_list;
  73    /* flag to enqueue unprocessed_connections */
  74    bool processing;
  75    uint8_t ip_proto;
  76    /* record the sequence number that has been compared */
  77    uint32_t compare_seq;
  78    /* the maximum of acknowledgement number in primary_list queue */
  79    uint32_t pack;
  80    /* the maximum of acknowledgement number in secondary_list queue */
  81    uint32_t sack;
  82    /* offset = secondary_seq - primary_seq */
  83    tcp_seq  offset;
  84    /*
  85     * we use this flag update offset func
  86     * run once in independent tcp connection
  87     */
  88    int syn_flag;
  89} Connection;
  90
  91uint32_t connection_key_hash(const void *opaque);
  92int connection_key_equal(const void *opaque1, const void *opaque2);
  93int parse_packet_early(Packet *pkt);
  94void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key, Packet *pkt);
  95void fill_connection_key(Packet *pkt, ConnectionKey *key);
  96void reverse_connection_key(ConnectionKey *key);
  97Connection *connection_new(ConnectionKey *key);
  98void connection_destroy(void *opaque);
  99Connection *connection_get(GHashTable *connection_track_table,
 100                           ConnectionKey *key,
 101                           GQueue *conn_list);
 102void connection_hashtable_reset(GHashTable *connection_track_table);
 103Packet *packet_new(const void *data, int size, int vnet_hdr_len);
 104void packet_destroy(void *opaque, void *user_data);
 105
 106#endif /* QEMU_COLO_PROXY_H */
 107