]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust/dhcp: Support get-info-by-id
authorJeff Lucovsky <jeff@lucovsky.org>
Tue, 11 Jun 2019 22:55:36 +0000 (18:55 -0400)
committerVictor Julien <victor@inliniac.net>
Thu, 20 Jun 2019 18:14:58 +0000 (20:14 +0200)
rust/src/dhcp/dhcp.rs

index 3ea14d95f93a90b3807e7a879f19a5088a348e19..ebf80071233862e6aa81c1a6b807c9aadbf01277 100644 (file)
@@ -76,6 +76,16 @@ pub enum DHCPEvent {
     MalformedOptions,
 }
 
+impl DHCPEvent {
+    fn from_i32(value: i32) -> Option<DHCPEvent> {
+        match value {
+            0 => Some(DHCPEvent::TruncatedOptions),
+            1 => Some(DHCPEvent::MalformedOptions),
+            _ => None,
+        }
+    }
+}
+
 /// The concept of a transaction is more to satisfy the Suricata
 /// app-layer. This DHCP parser is actually stateless where each
 /// message is its own transaction.
@@ -326,6 +336,26 @@ pub extern "C" fn rs_dhcp_tx_set_logged(_state: *mut std::os::raw::c_void,
     tx.logged.set(logged);
 }
 
+#[no_mangle]
+pub extern "C" fn rs_dhcp_state_get_event_info_by_id(event_id: std::os::raw::c_int,
+                                                     event_name: *mut *const std::os::raw::c_char,
+                                                     event_type: *mut core::AppLayerEventType)
+                                                     -> i8
+{
+    if let Some(e) = DHCPEvent::from_i32(event_id as i32) {
+        let estr = match e {
+            DHCPEvent::TruncatedOptions => { "truncated_options\0" },
+            DHCPEvent::MalformedOptions => { "malformed_options\0" },
+        };
+        unsafe{
+            *event_name = estr.as_ptr() as *const std::os::raw::c_char;
+            *event_type = core::APP_LAYER_EVENT_TYPE_TRANSACTION;
+        };
+        0
+    } else {
+        -1
+    }
+}
 #[no_mangle]
 pub extern "C" fn rs_dhcp_state_get_events(tx: *mut std::os::raw::c_void)
                                            -> *mut core::AppLayerDecoderEvents
@@ -394,33 +424,34 @@ pub unsafe extern "C" fn rs_dhcp_register_parser() {
     let ports = CString::new("[67,68]").unwrap();
     let parser = RustParser {
         name: PARSER_NAME.as_ptr() as *const std::os::raw::c_char,
-        default_port: ports.as_ptr(),
-        ipproto: IPPROTO_UDP,
-        probe_ts: rs_dhcp_probing_parser,
-        probe_tc: rs_dhcp_probing_parser,
-        min_depth: 0,
-        max_depth: 16,
-        state_new: rs_dhcp_state_new,
-        state_free: rs_dhcp_state_free,
-        tx_free: rs_dhcp_state_tx_free,
-        parse_ts: rs_dhcp_parse,
-        parse_tc: rs_dhcp_parse,
-        get_tx_count: rs_dhcp_state_get_tx_count,
-        get_tx: rs_dhcp_state_get_tx,
-        tx_get_comp_st: rs_dhcp_state_progress_completion_status,
-        tx_get_progress: rs_dhcp_tx_get_alstate_progress,
-        get_tx_logged: Some(rs_dhcp_tx_get_logged),
-        set_tx_logged: Some(rs_dhcp_tx_set_logged),
-        get_de_state: rs_dhcp_tx_get_detect_state,
-        set_de_state: rs_dhcp_tx_set_detect_state,
-        get_events: Some(rs_dhcp_state_get_events),
-        get_eventinfo: Some(rs_dhcp_state_get_event_info),
-        localstorage_new: None,
-        localstorage_free: None,
-        get_tx_mpm_id: None,
-        set_tx_mpm_id: None,
-        get_files: None,
-        get_tx_iterator: Some(rs_dhcp_state_get_tx_iterator),
+        default_port       : ports.as_ptr(),
+        ipproto            : IPPROTO_UDP,
+        probe_ts           : rs_dhcp_probing_parser,
+        probe_tc           : rs_dhcp_probing_parser,
+        min_depth          : 0,
+        max_depth          : 16,
+        state_new          : rs_dhcp_state_new,
+        state_free         : rs_dhcp_state_free,
+        tx_free            : rs_dhcp_state_tx_free,
+        parse_ts           : rs_dhcp_parse,
+        parse_tc           : rs_dhcp_parse,
+        get_tx_count       : rs_dhcp_state_get_tx_count,
+        get_tx             : rs_dhcp_state_get_tx,
+        tx_get_comp_st     : rs_dhcp_state_progress_completion_status,
+        tx_get_progress    : rs_dhcp_tx_get_alstate_progress,
+        get_tx_logged      : Some(rs_dhcp_tx_get_logged),
+        set_tx_logged      : Some(rs_dhcp_tx_set_logged),
+        get_de_state       : rs_dhcp_tx_get_detect_state,
+        set_de_state       : rs_dhcp_tx_set_detect_state,
+        get_events         : Some(rs_dhcp_state_get_events),
+        get_eventinfo      : Some(rs_dhcp_state_get_event_info),
+        get_eventinfo_byid : None,
+        localstorage_new   : None,
+        localstorage_free  : None,
+        get_tx_mpm_id      : None,
+        set_tx_mpm_id      : None,
+        get_files          : None,
+        get_tx_iterator    : Some(rs_dhcp_state_get_tx_iterator),
     };
 
     let ip_proto_str = CString::new("udp").unwrap();