2013-05-20 2 views
0

При попытке узнать больше о сети Linux linux ... У меня есть модуль ядра, который содержит протокол, который работает поверх TCP. Это почти протокол прикладного уровня, с которым я экспериментирую. Вызовы передаются через обычный интерфейс системного вызова, выполняемый из пользовательского пространства.Когда использовать сетевые системные вызовы против sk_buff в KM

Так сеть вызовов внутри моего (слоя над TCP) модуль обычно выглядит следующим образом ...

ret = sock->ops->connect(sock, (struct sockaddr *) &myprot.daddr, 
    sizeof(myprot.daddr), flags); 

Я использовал sendmsg/recvmsg успешно в моем КМ для отправки и получения данных от клиента сервер (из двух отдельных экземпляров ядра). Вызовы внутри КМ в целом выглядит следующим образом:

ret = sock->ops->sendmsg(iocb, myprot.skt, &msg, sizeof(struct msghdr)); 

ret = sock->ops->recvmsg(iocb, sock, msg, total_len, flags); 

То, что я пытаюсь понять в том, как и когда использовать sk_buff делать то же самое. То есть когда использовать системные вызовы, такие как то, что я использую выше, и когда нужно напрямую обращаться к сетевому стеку через sk_buff для отправки и получения данных.

Я нашел много примеров того, как отправлять и получать данные из транспортных слоев с помощью sk_buff, но ничего из уровня выше транспорта, который также содержится в модуле ядра и с использованием sk_buff.

Обновление для уточнения.

Я переопределил struct proto_ops и заменил методы-члены для использования моих собственных протоколов, которые соответствуют системным вызовам из пользовательского пространства. Я понимаю, что sk_buff - это буферная система для ядра и где пакеты помещаются в очередь. Однако. Я не вижу причин, по которым я не могу использовать специфичные для протокола функции struct proto_ops, которые также обрабатывают сокеты и данные, наложенные на них (хотя и на более высоком уровне). Поэтому мне кажется, что есть два способа доступа к sk_buffs в зависимости от того, где вы хотите получить к ним доступ.

Если я работаю на транспортном уровне и хочу получить доступ к данным anywheres в сетевом стеке (например, транспорт, ip, mac), я мог бы напрямую обращаться к sk_buffs, но если я работаю над транспортным уровнем, я бы использовать абстрактные функции определенного протокола, которые соответствуют системным вызовам. В конце концов, они оба в конечном итоге работают над sk_buffs.

Я думаю, что мое замешательство, или то, что я пытаюсь подтвердить, что я поступаю правильно или неправильно, зная разницу в этих двух способах доступа к sk_buffs и откуда, ... если я отправляю данные над транспортом из TCP в ядре, чем я могу просто использовать системные вызовы proto_ops, которые относятся к TCP, если мне не нужно больше управления, в котором я бы тогда использовал функции skb нижнего уровня для управления очередями.

ответ

0

Не забудьте понять, потому что вы хотите использовать разные вещи для той же цели. proto_ops в sock->ops - это операции, вызываемые во время соответствующего системного вызова. sk_buff - это буферная система сокета ядра; это место, где пакет выставлены в очередь.

Существует не возможность делать то же самое с proto_ops с sk_buff, если это возможно, одна из этих структур бесполезна.

+0

Возможно, это связано с тем, что некоторые из моих замешательств лежат так, как мне кажется, поскольку функции члена proto_ops на более высоком уровне работают над sk_buffs, но есть возможность использовать sk_buffs напрямую с гораздо большим контролем. Таким образом, в какой-то степени вы можете сделать то же самое с любым из них. Я отредактировал OP, чтобы попытаться разъяснить мое замешательство. – Ender

Смежные вопросы