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