summaryrefslogtreecommitdiff
path: root/src/http_decoder_inc.h
blob: 3e2939d7f3dc8a091d48e5971177e08cbbe92662 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
**********************************************************************************************
*	File: http_decoder_inc.h
*   Description: 
*	Authors: Liu WenTan <[email protected]>
*	Date:    2024-01-10
*   Copyright: (c) Since 2022 Geedge Networks, Ltd. All rights reserved.
***********************************************************************************************
*/

#ifndef _HTTP_DECODER_INC_H_
#define _HTTP_DECODER_INC_H_

#ifdef __cplusplus
extern "C"
{
#endif
#include "stellar/stellar.h"
#include "stellar/utils.h"
#include "stellar/session.h"
#include "stellar/session_mq.h"
#include "stellar/session_exdata.h"

#include "mempool/nmx_palloc.h"
#include "stellar/utils.h"
#include "http_decoder.h"
#include "http_decoder_result_queue.h"
#include "http_decoder_half.h"
#include "http_decoder_table.h"
#include "http_decoder_result_queue.h"
#include "http_decoder_utils.h"
#include "http_decoder_stat.h"
#include "fieldstat/fieldstat_easy.h"
#include "toml/toml.h"

#ifndef likely
#define likely(x)    __builtin_expect((x), 1)
#endif
#ifndef unlikely
#define unlikely(x)  __builtin_expect((x), 0)
#endif

#define MEMPOOL_CALLOC(pool, type, number) ((type *)nmx_pcalloc(pool, sizeof(type) * number))
#define MEMPOOL_REALLOC(pool)
#define MEMPOOL_FREE(pool, p) nmx_pfree(pool, p)

#define ENABLE_MEMPOOL 1
#ifdef ENABLE_MEMPOOL
#define HD_CALLOC(pool, type, number) MEMPOOL_CALLOC(pool, number, type)
#define HD_FREE(pool, p) MEMPOOL_FREE(pool, p)
#else
#define HD_CALLOC(pool, type, number) CALLOC(type, number)
#define HD_FREE(pool, p) FREE(p)
#endif

#define HTTP_IDENTIFY_LEN 16
#define HD_RESULT_QUEUE_LEN 16

#define DEFAULT_STAT_OUTPUT_INTERVAL 1
#define DEFAULT_STAT_INTERVAL_PKTS 1000
#define DEFAULT_MEMPOOL_SIZE (32 * 1024)

#define HTTPD_CFG_FILE   "./etc/http/http_decoder.toml"
#define FILEDSTAT_OUTPUT_FILE   "./http_decoder.fs"

struct http_decoder_config
{
    int decompress_switch;
    int stat_interval_pkts; // call fieldstat_incrby every stat_interval_pkts
    int stat_output_interval;
    size_t result_queue_len; // per session result queue length
    size_t mempool_size;     // per session mempool size
};

/**
 * NOTE: http_message don't have the ownership of data
 */
struct http_message
{
    uint8_t flow_type;
    enum http_message_type type;
    size_t queue_index;
    struct http_decoder_result_queue *ref_queue;
};

struct http_decoder
{
    struct http_decoder_half *c2s_half;
    struct http_decoder_half *s2c_half;
};

struct http_decoder_exdata
{
    struct http_decoder_result_queue *queue;
    struct http_decoder *decoder;
    nmx_pool_t *mempool;
};

struct http_decoder_stat
{
    long long incoming_bytes;
    long long incoming_pkts;
    long long incoming_trans;
    long long err_pkts;
    int counter;
};

struct http_decoder_context
{
    int plugin_id;
    int httpd_msg_topic_id;
    int ex_data_idx;
    int fs_incoming_bytes_id;
    int fs_incoming_pkts_id;
    int fs_incoming_trans_id;
    int fs_err_pkts_id;
    struct stellar *st;
    struct fieldstat_easy *fse;
    struct http_decoder_config hd_cfg;
};

struct http_message;

struct http_message *http_message_new(enum http_message_type type, struct http_decoder_result_queue *queue,
                                    int queue_index, unsigned char flow_type);

#ifdef __cplusplus
}
#endif

#endif