Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
pkt=(struct ip_pkt *)kmalloc(sizeof(struct ip_pkt),GFP_ATOMIC);
nf_register_hook(&our_ops);
pkt_ready = 0;
MOD_INC_USE_COUNT;
return 0;
}
При открытии устройства выделяем память для структуры pkt, регистрируем ловушку вызовом функции nf_register_hook и сбрасываем флаг готовности данных.
n Функция чтения из устройства:
static ssize_t read_pkt(struct file *file, char *buf, size_t count, loff_t *ppos)
{
if(pkt_ready) {
copy_to_user(buf,pkt,sizeof(struct ip_pkt));
count = pkt->pkt_len;
file->f_pos += count;
pkt_ready = 0;
return count;
}
return 0;
}
Если флаг pkt_ready установлен, блок данных (структура pkt) копируется в адресное пространство пользовательского процесса. После этого флаг pkt_ready сбрасывается. Функция возвращает длину принятого IP-пакета.
n Функция закрытия устройства:
static int close_pkt(struct inode *inode, struct file *file)
{
kfree(pkt);
nf_unregister_hook(&our_ops);
MOD_DEC_USE_COUNT;
return 0;
}
При закрытии устройства освобождается память, выделенная для структуры pkt и ловушка отключается путем вызова функции nf_unregister_hook. Аргументом этой функции является адрес структуры struct nf_hook_ops.
n Функции инициализации и выгрузки модуля выполняют стандартную процедуру регистрации и снятия регистрации устройства в системе:
int init_module(void)
{
if (register_chrdev(76,"nf_ip",&nf_fops)) return -EIO;
return 0;
}
void cleanup_module(void)
{
if(MOD_IN_USE) return;
unregister_chrdev(76,"nf_ip");
return;