File: daq_module_api.h

package info (click to toggle)
daq 3.0.0-alpha5-1
  • links: PTS
  • area: main
  • in suites: experimental
  • size: 2,712 kB
  • sloc: ansic: 9,302; sh: 4,442; cpp: 495; makefile: 234
file content (163 lines) | stat: -rw-r--r-- 7,785 bytes parent folder | download
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
** Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
** Copyright (C) 2010-2013 Sourcefire, Inc.
** Author: Michael R. Altizer <mialtize@cisco.com>
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License Version 2 as
** published by the Free Software Foundation.  You may not use, modify or
** distribute this program under any other version of the GNU General
** Public License.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

#ifndef _DAQ_MODULE_API_H
#define _DAQ_MODULE_API_H

#ifdef __cplusplus
extern "C" {
#endif

#include <daq_common.h>

typedef int (*daq_module_set_filter_func) (void *handle, const char *filter);
typedef int (*daq_module_start_func) (void *handle);
typedef int (*daq_module_inject_func) (void *handle, DAQ_MsgType type, const void *hdr, const uint8_t *data, uint32_t data_len);
typedef int (*daq_module_inject_relative_func) (void *handle, DAQ_Msg_h msg, const uint8_t *data, uint32_t data_len, int reverse);
typedef int (*daq_module_interrupt_func) (void *handle);
typedef int (*daq_module_stop_func) (void *handle);
typedef int (*daq_module_ioctl_func) (void *handle, DAQ_IoctlCmd cmd, void *arg, size_t arglen);
typedef int (*daq_module_get_stats_func) (void *handle, DAQ_Stats_t *stats);
typedef void (*daq_module_reset_stats_func) (void *handle);
typedef int (*daq_module_get_snaplen_func) (void *handle);
typedef uint32_t (*daq_module_get_capabilities_func) (void *handle);
typedef int (*daq_module_get_datalink_type_func) (void *handle);
typedef int (*daq_module_config_load_func) (void *handle, void **new_config);
typedef int (*daq_module_config_swap_func) (void *handle, void *new_config, void **old_config);
typedef int (*daq_module_config_free_func) (void *handle, void *old_config);
typedef unsigned (*daq_module_msg_receive_func) (void *handle, const unsigned max_recv, const DAQ_Msg_t *msgs[], DAQ_RecvStatus *rstat);
typedef int (*daq_module_msg_finalize_func) (void *handle, const DAQ_Msg_t *msg, DAQ_Verdict verdict);
typedef int (*daq_module_get_msg_pool_info_func) (void *handle, DAQ_MsgPoolInfo_t *info);

#define DAQ_INSTANCE_API_STRUCT(fname) struct { daq_module_ ## fname ## _func func; void *context; } fname
typedef struct _daq_instance_api {
    DAQ_INSTANCE_API_STRUCT(set_filter);
    DAQ_INSTANCE_API_STRUCT(start);
    DAQ_INSTANCE_API_STRUCT(inject);
    DAQ_INSTANCE_API_STRUCT(inject_relative);
    DAQ_INSTANCE_API_STRUCT(interrupt);
    DAQ_INSTANCE_API_STRUCT(stop);
    DAQ_INSTANCE_API_STRUCT(ioctl);
    DAQ_INSTANCE_API_STRUCT(get_stats);
    DAQ_INSTANCE_API_STRUCT(reset_stats);
    DAQ_INSTANCE_API_STRUCT(get_snaplen);
    DAQ_INSTANCE_API_STRUCT(get_capabilities);
    DAQ_INSTANCE_API_STRUCT(get_datalink_type);
    DAQ_INSTANCE_API_STRUCT(config_load);
    DAQ_INSTANCE_API_STRUCT(config_swap);
    DAQ_INSTANCE_API_STRUCT(config_free);
    DAQ_INSTANCE_API_STRUCT(msg_receive);
    DAQ_INSTANCE_API_STRUCT(msg_finalize);
    DAQ_INSTANCE_API_STRUCT(get_msg_pool_info);
} DAQ_InstanceAPI_t;


#define DAQ_BASE_API_VERSION    0x00030001

typedef struct _daq_base_api
{
    /* Sanity/Version checking */
    uint32_t api_version;
    uint32_t api_size;
    /* Configuration accessors */
    const char *(*config_get_input) (DAQ_ModuleConfig_h modcfg);
    int (*config_get_snaplen) (DAQ_ModuleConfig_h modcfg);
    unsigned (*config_get_timeout) (DAQ_ModuleConfig_h modcfg);
    unsigned (*config_get_msg_pool_size) (DAQ_ModuleConfig_h modcfg);
    DAQ_Mode (*config_get_mode) (DAQ_ModuleConfig_h modcfg);
    const char *(*config_get_variable) (DAQ_ModuleConfig_h modcfg, const char *key);
    int (*config_first_variable) (DAQ_ModuleConfig_h modcfg, const char **key, const char **value);
    int (*config_next_variable) (DAQ_ModuleConfig_h modcfg, const char **key, const char **value);
    /* Module/Instance operations */
    int (*resolve_subapi) (DAQ_ModuleInstance_h modinst, DAQ_InstanceAPI_t *api);
    void (*set_errbuf) (DAQ_ModuleInstance_h modinst, const char *format, ...) __attribute__((format (printf, 2, 3)));
} DAQ_BaseAPI_t;


#define DAQ_MODULE_API_VERSION    0x00030001

typedef struct _daq_module_api
{
    /* The version of the API this module implements. */
    const uint32_t api_version;
    /* The size of this structure (for sanity checking). */
    const uint32_t api_size;
    /* The version of the DAQ module itself - can be completely arbitrary. */
    const uint32_t module_version;
    /* The name of the module (sfpacket, xvnim, pcap, etc.) */
    const char *name;
    /* Various flags describing the module and its capabilities (Inline-capabale, etc.) */
    const uint32_t type;
    /* The function the module loader *must* call first to prepare the module for any other function calls. */
    int (*load) (const DAQ_BaseAPI_t *base_api);
    /* Called when the module is unloaded.  No more calls will be made without calling load() again first. */
    int (*unload) (void);
    /* Get a pointer to an array describing the DAQ variables accepted by this module.
        Returns the size of the retrieved array. */
    int (*get_variable_descs) (const DAQ_VariableDesc_t **var_desc_table);
    /* Instantiate the module with the supplied configuration.  Initialize it as much as possible without
        causing packets to start being queued for the application. */
    int (*instantiate) (const DAQ_ModuleConfig_h config, DAQ_ModuleInstance_h modinst, void **ctxt_ptr);
    /* Clean up and destroy an instantiation of this module. */
    void (*destroy) (void *handle);
    /* Set the module's BPF based on the given string */
    daq_module_set_filter_func set_filter;
    /* Complete device opening and begin queuing packets if they have not been already. */
    daq_module_start_func start;
    /* Spontaneously inject a new message. */
    daq_module_inject_func inject;
    /* Inject a new message going either the same or opposite direction as the specified message. */
    daq_module_inject_relative_func inject_relative;
    /* Attempt to interrupt the current message receive call. */
    daq_module_interrupt_func interrupt;
    /* Stop queuing packets, if possible */
    daq_module_stop_func stop;
    /* Send an I/O control command (read and/or write) */
    daq_module_ioctl_func ioctl;
    /* Populates the <stats> structure with the current DAQ stats.  These stats are cumulative. */
    daq_module_get_stats_func get_stats;
    /* Resets the DAQ module's internal stats. */
    daq_module_reset_stats_func reset_stats;
    /* Return the configured snaplen */
    daq_module_get_snaplen_func get_snaplen;
    /* Return a bitfield of the device's capabilities */
    daq_module_get_capabilities_func get_capabilities;
    /* Return the instance's Data Link Type */
    daq_module_get_datalink_type_func get_datalink_type;
    /* Read new configuration */
    daq_module_config_load_func config_load;
    /* Swap new and old configuration */
    daq_module_config_swap_func config_swap;
    /* Destroy old configuration */
    daq_module_config_free_func config_free;

    daq_module_msg_receive_func msg_receive;
    daq_module_msg_finalize_func msg_finalize;

    /* Query message pool info */
    daq_module_get_msg_pool_info_func get_msg_pool_info;
} DAQ_ModuleAPI_t;

#ifdef __cplusplus
}
#endif

#endif /* _DAQ_MODULE_API_H */