suricata
app-layer-frames.h
Go to the documentation of this file.
1 /* Copyright (C) 2021 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  */
23 
24 #ifndef SURICATA_APP_LAYER_FRAMES_H
25 #define SURICATA_APP_LAYER_FRAMES_H
26 
27 #include "app-layer-protos.h"
28 
29 typedef struct Flow_ Flow;
30 typedef struct Packet_ Packet;
31 typedef struct StreamSlice StreamSlice;
32 
33 /** special value for matching any type */
34 #define FRAME_ANY_TYPE 62
35 /** max 63 to fit the 64 bit per protocol space */
36 #define FRAME_STREAM_TYPE 63
37 
38 typedef int64_t FrameId;
39 
40 enum {
42 #define FRAME_FLAG_TX_ID_SET BIT_U8(FRAME_FLAGE_TX_ID_SET)
44 #define FRAME_FLAG_ENDS_AT_EOF BIT_U8(FRAME_FLAGE_ENDS_AT_EOF)
46 #define FRAME_FLAG_LOGGED BIT_U8(FRAME_FLAGE_LOGGED)
47 };
48 
49 typedef struct Frame {
50  uint8_t type; /**< protocol specific field type. E.g. NBSS.HDR or SMB.DATA */
51  uint8_t flags; /**< frame flags: FRAME_FLAG_* */
52  uint8_t event_cnt;
53  // TODO one event per frame enough?
54  uint8_t events[4]; /**< per frame store for events */
55  uint64_t offset; /**< offset from the start of the stream */
56  int64_t len;
57  int64_t id;
58  uint64_t tx_id; /**< tx_id to match this frame. UINT64T_MAX if not used. */
59  uint64_t inspect_progress; /**< inspection tracker relative to the start of the frame */
61 
62 #define FRAMES_STATIC_CNT 3
63 
64 typedef struct Frames {
65  uint16_t cnt;
66  uint16_t dyn_size; /**< size in elements of `dframes` */
67  uint32_t left_edge_rel;
68  uint64_t base_id;
69  Frame sframes[FRAMES_STATIC_CNT]; /**< static frames */
70  Frame *dframes; /**< dynamically allocated space for more frames */
71 #ifdef DEBUG
72  uint8_t ipproto;
73  AppProto alproto;
74 #endif
76 
77 typedef struct FramesContainer {
81 
82 void FramesFree(Frames *frames);
83 #ifndef SURICATA_BINDGEN_H
84 // do not let bindgen see Packet
85 void FramesPrune(Flow *f, Packet *p);
86 #endif
87 
88 Frame *AppLayerFrameNewByPointer(Flow *f, const StreamSlice *stream_slice,
89  const uint8_t *frame_start, const int64_t len, int dir, uint8_t frame_type);
90 Frame *SCAppLayerFrameNewByRelativeOffset(Flow *f, const void *stream_slice,
91  const uint32_t frame_start_rel, const int64_t len, int dir, uint8_t frame_type);
93  const uint64_t frame_start, const int64_t len, int dir, uint8_t frame_type);
94 void AppLayerFrameDump(Flow *f);
95 
96 Frame *FrameGetByIndex(Frames *frames, const uint32_t idx);
97 Frame *FrameGetById(Frames *frames, const int64_t id);
98 Frame *FrameGetLastOpenByType(Frames *frames, const uint8_t frame_type);
99 
100 Frame *AppLayerFrameGetById(const Flow *f, const int direction, const FrameId frame_id);
101 Frame *AppLayerFrameGetLastOpenByType(Flow *f, const int direction, const uint8_t frame_type);
102 
103 void AppLayerFrameAddEvent(Frame *frame, uint8_t e);
104 void SCAppLayerFrameAddEventById(const Flow *f, const int dir, const FrameId id, uint8_t e);
105 void AppLayerFrameSetLength(Frame *frame, int64_t len);
106 void SCAppLayerFrameSetLengthById(const Flow *f, const int dir, const FrameId id, int64_t len);
107 void AppLayerFrameSetTxId(Frame *r, uint64_t tx_id);
108 void SCAppLayerFrameSetTxIdById(const Flow *f, const int dir, const FrameId id, uint64_t tx_id);
109 
110 void AppLayerFramesSlide(Flow *f, const uint32_t slide, const uint8_t direction);
111 
114 
115 void FrameConfigInit(void);
116 void FrameConfigDeInit(void);
117 void FrameConfigEnableAll(void);
118 void FrameConfigEnable(const AppProto p, const uint8_t type);
119 
120 #endif
StreamSlice
Definition: app-layer-parser.h:126
Frame::inspect_progress
uint64_t inspect_progress
Definition: app-layer-frames.h:59
len
uint8_t len
Definition: app-layer-dnp3.h:2
Frame::tx_id
uint64_t tx_id
Definition: app-layer-frames.h:58
AppLayerFramesGetContainer
FramesContainer * AppLayerFramesGetContainer(const Flow *f)
Definition: app-layer-parser.c:209
FrameConfigDeInit
void FrameConfigDeInit(void)
Definition: app-layer-frames.c:52
FrameConfigInit
void FrameConfigInit(void)
Definition: app-layer-frames.c:41
Frame::events
uint8_t events[4]
Definition: app-layer-frames.h:54
AppProto
uint16_t AppProto
Definition: app-layer-protos.h:87
FramesContainer::toserver
Frames toserver
Definition: app-layer-frames.h:78
AppLayerFramesSetupContainer
FramesContainer * AppLayerFramesSetupContainer(Flow *f)
Definition: app-layer-parser.c:216
type
uint8_t type
Definition: decode-sctp.h:0
Frame::offset
uint64_t offset
Definition: app-layer-frames.h:55
Frame
Definition: app-layer-frames.h:49
Flow_
Flow data structure.
Definition: flow.h:359
Frames::cnt
uint16_t cnt
Definition: app-layer-frames.h:65
FrameGetLastOpenByType
Frame * FrameGetLastOpenByType(Frames *frames, const uint8_t frame_type)
Definition: app-layer-frames.c:103
Frame::id
int64_t id
Definition: app-layer-frames.h:57
FramesFree
void FramesFree(Frames *frames)
Definition: app-layer-frames.c:456
Frames
Definition: app-layer-frames.h:64
FramesContainer
Definition: app-layer-frames.h:77
p
Packet * p
Definition: fuzz_dataset.c:30
AppLayerFramesSlide
void AppLayerFramesSlide(Flow *f, const uint32_t slide, const uint8_t direction)
Definition: app-layer-frames.c:411
FramesContainer
struct FramesContainer FramesContainer
Frames::left_edge_rel
uint32_t left_edge_rel
Definition: app-layer-frames.h:67
SCAppLayerFrameAddEventById
void SCAppLayerFrameAddEventById(const Flow *f, const int dir, const FrameId id, uint8_t e)
Definition: app-layer-frames.c:663
FrameGetById
Frame * FrameGetById(Frames *frames, const int64_t id)
Definition: app-layer-frames.c:126
FrameConfigEnableAll
void FrameConfigEnableAll(void)
Definition: app-layer-frames.c:57
AppLayerFrameNewByAbsoluteOffset
Frame * AppLayerFrameNewByAbsoluteOffset(Flow *f, const StreamSlice *stream_slice, const uint64_t frame_start, const int64_t len, int dir, uint8_t frame_type)
create new frame using the absolute offset from the start of the stream
Definition: app-layer-frames.c:611
Frames::dframes
Frame * dframes
Definition: app-layer-frames.h:70
AppLayerFrameGetById
Frame * AppLayerFrameGetById(const Flow *f, const int direction, const FrameId frame_id)
Definition: app-layer-frames.c:698
SCAppLayerFrameSetTxIdById
void SCAppLayerFrameSetTxIdById(const Flow *f, const int dir, const FrameId id, uint64_t tx_id)
Definition: app-layer-frames.c:692
FramesContainer::toclient
Frames toclient
Definition: app-layer-frames.h:79
AppLayerFrameAddEvent
void AppLayerFrameAddEvent(Frame *frame, uint8_t e)
Definition: app-layer-frames.c:653
AppLayerFrameDump
void AppLayerFrameDump(Flow *f)
Definition: app-layer-frames.c:596
AppLayerFrameSetTxId
void AppLayerFrameSetTxId(Frame *r, uint64_t tx_id)
Definition: app-layer-frames.c:683
Frames
struct Frames Frames
FrameId
int64_t FrameId
Definition: app-layer-frames.h:38
FRAMES_STATIC_CNT
#define FRAMES_STATIC_CNT
Definition: app-layer-frames.h:62
Packet_
Definition: decode.h:516
FRAME_FLAGE_LOGGED
@ FRAME_FLAGE_LOGGED
Definition: app-layer-frames.h:45
FramesPrune
void FramesPrune(Flow *f, Packet *p)
Definition: app-layer-frames.c:838
AppLayerFrameSetLength
void AppLayerFrameSetLength(Frame *frame, int64_t len)
Definition: app-layer-frames.c:669
Frame::len
int64_t len
Definition: app-layer-frames.h:56
Frame
struct Frame Frame
AppLayerFrameNewByPointer
Frame * AppLayerFrameNewByPointer(Flow *f, const StreamSlice *stream_slice, const uint8_t *frame_start, const int64_t len, int dir, uint8_t frame_type)
create new frame using a pointer to start of the frame
Definition: app-layer-frames.c:466
FrameConfigEnable
void FrameConfigEnable(const AppProto p, const uint8_t type)
Definition: app-layer-frames.c:66
Frame::flags
uint8_t flags
Definition: app-layer-frames.h:51
FrameGetByIndex
Frame * FrameGetByIndex(Frames *frames, const uint32_t idx)
Definition: app-layer-frames.c:146
Frame::type
uint8_t type
Definition: app-layer-frames.h:50
Frame::event_cnt
uint8_t event_cnt
Definition: app-layer-frames.h:52
Frames::sframes
Frame sframes[FRAMES_STATIC_CNT]
Definition: app-layer-frames.h:69
FRAME_FLAGE_TX_ID_SET
@ FRAME_FLAGE_TX_ID_SET
Definition: app-layer-frames.h:41
Frames::base_id
uint64_t base_id
Definition: app-layer-frames.h:68
SCAppLayerFrameNewByRelativeOffset
Frame * SCAppLayerFrameNewByRelativeOffset(Flow *f, const void *stream_slice, const uint32_t frame_start_rel, const int64_t len, int dir, uint8_t frame_type)
create new frame using a relative offset from the start of the stream slice
Definition: app-layer-frames.c:545
app-layer-protos.h
FRAME_FLAGE_ENDS_AT_EOF
@ FRAME_FLAGE_ENDS_AT_EOF
Definition: app-layer-frames.h:43
AppLayerFrameGetLastOpenByType
Frame * AppLayerFrameGetLastOpenByType(Flow *f, const int direction, const uint8_t frame_type)
Definition: app-layer-frames.c:716
Frames::dyn_size
uint16_t dyn_size
Definition: app-layer-frames.h:66
SCAppLayerFrameSetLengthById
void SCAppLayerFrameSetLengthById(const Flow *f, const int dir, const FrameId id, int64_t len)
Definition: app-layer-frames.c:677
f
Flow f
Definition: fuzz_dataset.c:32