LINUX.ORG.RU

skb_trim


0

0

Есть необходимость модифицировать флаги пакета и удалить данные. Как корректно это сделать?

После skb_trim(skb, skb->len-10) < <-- для примера> модифицированный пакет не уходит в сеть (т.е. сниффером факт его ухода не виден), skb после skb_trim существует.

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

Ответ на: Re: skb_trim от vasily_pupkin

Re: skb_trim

Слышь, Васёк, если ты сам с собой общаешься, то избавь от этого форум. Ежели уважаешь читающих, опиши подробно свое решение, дабы потом, человек наступивший на твои грабли, мог воспользоваться твоими плодами, а не дублировать твой же вопрос в поисках ответа.

Deleted ()
Ответ на: Re: skb_trim от Deleted

Re: skb_trim

После модификации размера пакета нужно заново пересчитать его CRC (кто бы мог подумать )) ). И не забыть изменить данные о размера пакета во всех заинтересованных заголовках. 

Самый убойный вариант <для TCP/IPv4>: 

static inline void crc_tcpip_headers(struct sk_buff * ret_sk)
{
  ip_hdr(ret_sk)->check = 0x0;
  tcp_hdr(ret_sk)->check = 0x0;

  ret_sk->ip_summed = CHECKSUM_NONE;
  ip_hdr(ret_sk)->check = ip_fast_csum(ip_hdr(ret_sk), ip_hdr(ret_sk)->ihl);

  /* full checksum calculation */
  ret_sk->csum = skb_checksum(ret_sk,
                              ip_hdrlen(ret_sk),
                              ret_sk->len - ip_hdrlen(ret_sk), 0);

  tcp_hdr(ret_sk)->check = csum_tcpudp_magic(ip_hdr(ret_sk)->saddr,
                                             ip_hdr(ret_sk)->daddr,
                                             ret_sk->len - ip_hdrlen(ret_sk),
                                             IPPROTO_TCP,
                                             ret_sk->csum);

}

Вообще это не оч. оптимально и как то через задницу. Надо внимательнее почитать. 

Коменасай за самоболтание. Солидарен с мнением :]

vasily_pupkin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.