Вот возник вопрос. Как получить доступ к исходящим данным tcp пакета? Например, при работе последней функции «сетевого уровня» [ __ip_local_out . Можно просмотреть через skb->data_len размер данных в пакете транспортного уровня (он указан верно). Указатели: skb->network_header; skb->transport_header; Корректно указывают на заголовки пакетов сетевого и транспортного уровней. Заголовки расположены последовательно в «хранилище данных пакета» (как и должно быть). Далее перемещаю указатель на данные после skb->transport_header; и пытаюсь их вывести. Но их в этом хранилище нет) (видимо их ещё туда не поместили) А так как __ip_local_out выглядит так.
int __ip_local_out(struct sk_buff *skb) {
struct iphdr *iph = ip_hdr(skb);
iph->tot_len = htons(skb->len);
ip_send_check(iph);
return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, dst_output);
}
Видим что дальше вызывается dst_output
static inline int dst_output(struct sk_buff *skb) { return skb_dst(skb)->output(skb); }
static inline struct dst_entry *skb_dst(const struct sk_buff *skb) { return (struct dst_entry *)skb->_skb_dst; }
Тоесть вызывается в конце концов int (*output)(struct sk_buff*); из «struct dst_entry»
То видимо данные tcp пакета, кладутся в хранилище, после данного вызовы.( хз правильно ли я думаю). Как получить доступ к этим данным???
И ещё один момент. Если вызвать skb_copy данного skb, то skb->data копии сокета, будет указывать на нужные мне данные, которые уже помещены в «хранилище буфера сокета».
Подведу итог вопроса: Как получить доступ к данным, отправляемого пакета в сеть, не прибегая к помощи skb_copy.