Всем привет. Пишу модуль для ядра Linux. Перехватываю пакет через хук, меняю данные и хочу отправить в сеть. Проблема в том, что после изменения данных и пересчета контрольной суммы - пакет не отправляется. Помогите, пожалуйста. разобраться. Код:
Получаю адрес начала данных:
user_data_ptr = (char *)(skb->data + sizeof(struct iphdr) + sizeof(struct udphdr));
Вычисляю длину данных:
unsigned long iLenData = skb->len - (sizeof(struct iphdr) + sizeof(struct udphdr));
Модифицирую данные, например так:
user_data_ptr[iLenData-2] = ‘k’;
Пересчитываю контрольные суммы:
udp->check = 0;
udp->check = csum((uint16_t*) udp, (iLenData+sizeof(struct udphdr)));
ip->check = 0;
ip->check = csum((uint16_t*) ip, (ip->ihl << 1));
Еще вопросик: Как добавить свои данные к эти данным? Нужно ли менять tot_len и len в заголовках?
Если ничего не трогать, то пакет отправляется в сеть, но я хочу его модифицировать.
Спасибо за ответы!