Go to the documentation of this file.
54 static void JsonDNP3LogLinkControl(
SCJsonBuilder *js, uint8_t lc)
63 static void JsonDNP3LogApplicationControl(
SCJsonBuilder *js, uint8_t ac)
84 SCJbSetUint(js,
"prefix", item->
prefix);
85 SCJbSetUint(js,
"index", item->
index);
87 SCJbSetUint(js,
"size", item->
size);
101 static void JsonDNP3LogObjects(
SCJsonBuilder *js, DNP3ObjectList *objects)
107 SCJbSetUint(js,
"group", object->
group);
108 SCJbSetUint(js,
"variation", object->
variation);
109 SCJbSetUint(js,
"qualifier", object->
qualifier);
110 SCJbSetUint(js,
"prefix_code", object->
prefix_code);
111 SCJbSetUint(js,
"range_code", object->
range_code);
112 SCJbSetUint(js,
"start", object->
start);
113 SCJbSetUint(js,
"stop", object->
stop);
114 SCJbSetUint(js,
"count", object->
count);
117 SCJbOpenArray(js,
"points");
118 JsonDNP3LogObjectItems(js,
object);
130 SCJbOpenObject(js,
"control");
131 JsonDNP3LogLinkControl(js, dnp3tx->
lh.control);
137 SCJbOpenObject(js,
"application");
139 SCJbOpenObject(js,
"control");
140 JsonDNP3LogApplicationControl(js, dnp3tx->
ah.control);
143 SCJbSetUint(js,
"function_code", dnp3tx->
ah.function_code);
146 SCJbOpenArray(js,
"objects");
147 JsonDNP3LogObjects(js, &dnp3tx->
objects);
151 SCJbSetBool(js,
"complete", dnp3tx->
complete);
165 SCJbOpenObject(js,
"control");
166 JsonDNP3LogLinkControl(js, dnp3tx->
lh.control);
172 SCJbOpenObject(js,
"application");
174 SCJbOpenObject(js,
"control");
175 JsonDNP3LogApplicationControl(js, dnp3tx->
ah.control);
178 SCJbSetUint(js,
"function_code", dnp3tx->
ah.function_code);
181 SCJbOpenArray(js,
"objects");
182 JsonDNP3LogObjects(js, &dnp3tx->
objects);
186 SCJbSetBool(js,
"complete", dnp3tx->
complete);
191 SCJbOpenObject(js,
"iin");
192 SCJsonDNP3LogIin(js, (uint16_t)(dnp3tx->
iin.iin1 << 8 | dnp3tx->
iin.iin2));
204 SCJbOpenObject(js,
"dnp3");
206 SCJbOpenObject(js,
"request");
207 JsonDNP3LogRequest(js, tx);
212 SCJbOpenObject(js,
"response");
213 JsonDNP3LogResponse(js, tx);
221 static int JsonDNP3LoggerToServer(
ThreadVars *
tv,
void *thread_data,
222 const Packet *
p,
Flow *
f,
void *state,
void *vtx, uint64_t tx_id)
234 SCJbOpenObject(js,
"dnp3");
235 JsonDNP3LogRequest(js, tx);
243 static int JsonDNP3LoggerToClient(
ThreadVars *
tv,
void *thread_data,
244 const Packet *
p,
Flow *
f,
void *state,
void *vtx, uint64_t tx_id)
256 SCJbOpenObject(js,
"dnp3");
257 JsonDNP3LogResponse(js, tx);
266 void *vtx, uint64_t tx_id)
275 JsonDNP3LoggerToServer(
tv, thread_data,
p,
f, state, vtx, tx_id);
277 JsonDNP3LoggerToClient(
tv, thread_data,
p,
f, state, vtx, tx_id);
282 static void OutputDNP3LogDeInitCtxSub(
OutputCtx *output_ctx)
284 SCLogDebug(
"cleaning up sub output_ctx %p", output_ctx);
296 if (
unlikely(dnp3log_ctx == NULL)) {
299 dnp3log_ctx->
eve_ctx = json_ctx;
306 output_ctx->
data = dnp3log_ctx;
307 output_ctx->
DeInit = OutputDNP3LogDeInitCtxSub;
309 SCLogInfo(
"DNP3 log sub-module initialized.");
313 result.
ctx = output_ctx;
319 static TmEcode JsonDNP3LogThreadInit(
ThreadVars *t,
const void *initdata,
void **data)
326 if (initdata == NULL) {
327 SCLogDebug(
"Error getting context for DNP3. \"initdata\" is NULL.");
333 if (thread->
ctx == NULL) {
337 *data = (
void *)thread;
349 if (thread == NULL) {
360 OutputDNP3LogInitSub,
ALPROTO_DNP3, JsonDNP3Logger, JsonDNP3LogThreadInit,
361 JsonDNP3LogThreadDeinit);
struct SCJsonBuilder SCJsonBuilder
struct HtpBodyChunk_ * next
void FreeEveThreadCtx(OutputJsonThreadCtx *ctx)
Struct to hold the list of decoded objects.
SCJsonBuilder * CreateEveHeader(const Packet *p, enum SCOutputJsonLogDirection dir, const char *event_type, JsonAddrInfo *addr, OutputJsonCtx *eve_ctx)
void JsonDNP3LogRegister(void)
#define TAILQ_EMPTY(head)
#define TAILQ_FOREACH(var, head, field)
OutputJsonThreadCtx * CreateEveThreadCtx(ThreadVars *t, OutputJsonCtx *ctx)
void OutputRegisterTxSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, AppProto alproto, TxLogger TxLogFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit)
int DNP3PrefixIsSize(uint8_t prefix_code)
Check if the prefix code is a size prefix.
#define DNP3_APP_FC_UNSOLICITED_RESP
void OutputJsonBuilderBuffer(ThreadVars *tv, const Packet *p, Flow *f, SCJsonBuilder *js, OutputJsonThreadCtx *ctx)
LogDNP3FileCtx * dnp3log_ctx
uint8_t include_object_data
#define JB_SET_STRING(jb, key, val)
#define DNP3_LINK_FCV(control)
void SCAppLayerParserRegisterLogger(uint8_t ipproto, AppProto alproto)
Per thread variable structure.
void OutputJsonDNP3SetItem(SCJsonBuilder *js, DNP3Object *object, DNP3Point *point)
#define DNP3_LINK_FCB(control)
#define DNP3_LINK_DIR(control)
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
struct LogDNP3LogThread_ LogDNP3LogThread
OutputJsonThreadCtx * ctx
void(* DeInit)(struct OutputCtx_ *)
#define DNP3_LINK_PRI(control)
struct LogDNP3FileCtx_ LogDNP3FileCtx
bool AlertJsonDnp3(void *vtx, SCJsonBuilder *js)
#define DNP3_LINK_FC(control)