#define TYPE 0x0800
struct _data_str{
unsigned char data[5];
};
struct timer_list my_timer;
static void send_packet(void)
{
struct net_device * dev;
struct sk_buff * skb;
struct iphdr * iph;
struct udphdr * udph;
struct _data_str *data_str;
dev = dev_get_by_name(&init_net, "eth0");
skb = dev_alloc_skb(2*(dev->addr_len+4) + LL_MAX_HEADER + sizeof(struct data_str) + sizeof(struct iphdr) + sizeof(struct udphdr));
if(skb == NULL)
return;
if (skb_linearize(skb) < 0)
return;
skb_reset_network_header(skb);
skb_reserve(skb, LL_MAX_HEADER);
skb->dev = dev;
dev_hard_header(skb, dev, ETH_P_IP, "x00x1dx08x7fx46xf8", dev->dev_addr, skb->len);
iph = (struct iphdr*)skb_put(skb, sizeof(struct iphdr));
iph->daddr = 0x0101a8c0;
iph->saddr = 0x2601a8c0;
iph->version = IPVERSION;
//iph->ihl = sizeof(struct iphdr) / 4;
iph->ihl = 5;
iph->tos = 0;
iph->id = 0;
iph->frag_off = 0;
iph->protocol = IPPROTO_UDP;
iph->check = 0;
iph->ttl = 64;
iph->check = 0;
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
iph->tot_len = htons(sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(data_str->data));
udph = (struct udphdr*)skb_put(skb, sizeof(struct udphdr));
udph->source = htons(1234);
udph->dest = htons(1235);
udph->len = htons(sizeof(struct udphdr));
udph->check = 0;
data_str = (struct _data_str*)skb_put(skb,sizeof(struct _data_str));// + 2*(dev->addr_len+4));
memset(data_str->data, 0, sizeof(data_str->data));
memset(data_str->data, 'A', sizeof(data_str->data)-1);
dev_queue_xmit(skb);
return;
}
위 내용은 modue에서 사용되는 함수입니다. 문자열 "AAAA" 를 전송하게 되는데요.
패킷을 잡아서 보면 IP header checksum 이 틀리다고 나옵니다만 어디가 틀린지 모르겠습니다ㅠㅠ
몇시간동안 삽질 했다가 질문드립니다. 그리고 UDP checksum 초기화 할 때는 csum_tcpudp_magic() 함수
쓰면 되는건가요?
.
1. host byte order 문제.
2. IP or UDP frame offload 기능으로 인해 checksum 오류 발생.
등 여러 요인이 있을 수 있습니다.
해당 UDP packet이 전송이 될 때의 packet을 잡아서 pcap file로 올려 보세요.