LINUX.ORG.RU

История изменений

Исправление WeSTMan, (текущая версия) :

Спасибо за статью. Подход работает, только я иногда ловлю панику ядра. Вот код, и я думаю, что в нем есть проблемы. Как минимум - я увидел, что tail > end, но как исправить - пока не могу додуматься. Помогите, пожалуйста, разобраться!

unsigned char extra_data[] = «MyData»;

unsigned char *temp;

data = (char *)(skb->data + sizeof(struct iphdr) + sizeof(struct udphdr));

temp = kmalloc(1550 * sizeof(char), GFP_ATOMIC);

data_len = skb->len - TOT_HDR_LEN;

memcpy(temp, data, data_len);

unsigned char *ptr = temp + data_len;

extra_data_len = sizeof(extra_data);

memcpy(ptr, extra_data, extra_data_len);

tot_data_len = data_len + extra_data_len - 1;

skb_put(skb, extra_data_len - 1);

memcpy(data, temp, tot_data_len);

kfree(temp);

ip->tot_len = htons(tot_data_len + TOT_HDR_LEN);

udp->len = htons(tot_data_len + UDP_HDR_LEN);

ip->daddr = in_aton(«IP_dest»);

udp->dest = htons(iPort);

И дальше пересчет контрольных сумм. Пару раз передаст пакеты и упадет в панику ядра.

Ошибка:

skbuff: skb_over_panic: text:ffffffffc0207181 len:675 put:20 head
:ffff8800d7030800 data:ffff8800d7030820 tail:0x2c3 end:0x2c0 dev:ppp0

Исходная версия WeSTMan, :

Спасибо за статью. Подход работает, только я иногда ловлю панику ядра. Вот код, и я думаю, что в нем есть проблемы. Как минимум - я увидел, что tail > end, но как исправить - пока не могу додуматься. Помогите, пожалуйста, разобраться!

unsigned char extra_data[] = «MyData»;

unsigned char *temp;

data = (char *)(skb->data + sizeof(struct iphdr) + sizeof(struct udphdr));

temp = kmalloc(1550 * sizeof(char), GFP_ATOMIC);

data_len = skb->len - TOT_HDR_LEN;

memcpy(temp, data, data_len);

unsigned char *ptr = temp + data_len;

extra_data_len = sizeof(extra_data);

memcpy(ptr, extra_data, extra_data_len);

tot_data_len = data_len + extra_data_len - 1;

skb_put(skb, extra_data_len - 1);

memcpy(data, temp, tot_data_len);

kfree(temp);

ip->tot_len = htons(tot_data_len + TOT_HDR_LEN);

udp->len = htons(tot_data_len + UDP_HDR_LEN);

ip->daddr = in_aton(«IP_dest»);

udp->dest = htons(iPort);

И дальше пересчет контрольных сумм. Пару раз передаст пакеты и упадет в панику ядра.