Files
safe_duck/linux_kernel/msg.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);