История изменений
Исправление 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);
И дальше пересчет контрольных сумм. Пару раз передаст пакеты и упадет в панику ядра.