101 lines
2.9 KiB
C
101 lines
2.9 KiB
C
#include "head.h"
|
|
struct msg_list g_msg_list;
|
|
spinlock_t g_msg_lock;
|
|
size_t g_msg_length;
|
|
void push_msg(struct kernel_msg_t *msg) {
|
|
if (get_msg_list_length() > 0x1000) {
|
|
printk(KERN_ERR "Too many messages in the list\n");
|
|
kfree(msg);
|
|
return;
|
|
}
|
|
struct msg_list *new_msg = kmalloc(sizeof(struct msg_list), GFP_KERNEL);
|
|
if (new_msg == NULL) {
|
|
printk(KERN_ERR "Failed to allocate memory for new msg\n");
|
|
return;
|
|
}
|
|
new_msg->msg = msg;
|
|
new_msg->msg->check_sum = MSG_CHECK_SUM;
|
|
spin_lock_bh(&g_msg_lock);
|
|
list_add_tail(&new_msg->node, &g_msg_list.node);
|
|
g_msg_length++;
|
|
spin_unlock_bh(&g_msg_lock);
|
|
if (g_is_r3_ready) {
|
|
wake_up_interruptible(&g_r3_wait_queue);
|
|
}
|
|
}
|
|
void push_msg_new_ip_connect(u32 ip_address) {
|
|
struct kernel_msg_t *msg = kmalloc(sizeof(struct kernel_msg_t), GFP_KERNEL);
|
|
if (msg == NULL) {
|
|
printk(KERN_ERR "Failed to allocate memory for new msg\n");
|
|
return;
|
|
}
|
|
msg->type = SD_MSG_TYPE_NEW_IP_CONNECT;
|
|
msg->u.ip_action.src_ip = ip_address;
|
|
push_msg(msg);
|
|
}
|
|
void push_msg_syn_attack(u32 ip_address) {
|
|
struct kernel_msg_t *msg = kmalloc(sizeof(struct kernel_msg_t), GFP_KERNEL);
|
|
if (msg == NULL) {
|
|
printk(KERN_ERR "Failed to allocate memory for new msg\n");
|
|
return;
|
|
}
|
|
msg->type = SD_MSG_TYPE_SYN_ATTACK;
|
|
msg->u.ip_action.src_ip = ip_address;
|
|
push_msg(msg);
|
|
}
|
|
void push_msg_ssh_bf_attack(u32 ip_address) {
|
|
struct kernel_msg_t *msg = kmalloc(sizeof(struct kernel_msg_t), GFP_KERNEL);
|
|
if (msg == NULL) {
|
|
printk(KERN_ERR "Failed to allocate memory for new msg\n");
|
|
return;
|
|
}
|
|
msg->type = SD_MSG_TYPE_SSH_BF_ATTACK;
|
|
msg->u.ip_action.src_ip = ip_address;
|
|
push_msg(msg);
|
|
}
|
|
struct kernel_msg_t *get_msg(void) {
|
|
struct kernel_msg_t *msg = NULL;
|
|
struct msg_list *tmp = NULL;
|
|
spin_lock_bh(&g_msg_lock);
|
|
if (list_empty(&g_msg_list.node)) {
|
|
spin_unlock_bh(&g_msg_lock);
|
|
return NULL;
|
|
}
|
|
tmp = list_first_entry(&g_msg_list.node, struct msg_list, node);
|
|
list_del(&tmp->node);
|
|
g_msg_length--;
|
|
spin_unlock_bh(&g_msg_lock);
|
|
msg = tmp->msg;
|
|
kfree(tmp);
|
|
return msg;
|
|
}
|
|
size_t get_msg_list_length(void) {
|
|
size_t len = 0;
|
|
spin_lock_bh(&g_msg_lock);
|
|
len = g_msg_length;
|
|
spin_unlock_bh(&g_msg_lock);
|
|
return len;
|
|
}
|
|
void cleanup_msg(void) {
|
|
struct msg_list *tmp = NULL;
|
|
struct msg_list *next = NULL;
|
|
spin_lock_bh(&g_msg_lock);
|
|
list_for_each_entry_safe(tmp, next, &g_msg_list.node, node) {
|
|
list_del(&tmp->node);
|
|
kfree(tmp->msg);
|
|
kfree(tmp);
|
|
}
|
|
g_msg_length = 0;
|
|
spin_unlock_bh(&g_msg_lock);
|
|
}
|
|
void init_msg(void) {
|
|
INIT_LIST_HEAD(&(g_msg_list.node));
|
|
spin_lock_init(&g_msg_lock);
|
|
g_msg_length = 0;
|
|
}
|
|
EXPORT_SYMBOL(push_msg);
|
|
EXPORT_SYMBOL(get_msg);
|
|
EXPORT_SYMBOL(get_msg_list_length);
|
|
EXPORT_SYMBOL(cleanup_msg);
|
|
EXPORT_SYMBOL(init_msg);
|