#define TEST_XMIT(skb, rt) \ NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, (skb), NULL, \ (rt)->u.dst.dev, dst_output);
#define IP_PARTS_NATIVE(n) \ (unsigned int)((n)&0xFF), \ (unsigned int)((n)>>8)&0xFF, \ (unsigned int)((n)>>16)&0xFF, \ (unsigned int)((n)>>24)&0xFF
#define TEST_BUG() BUG() #define TEST_ERR(msg...) printk(KERN_ERR "TEST: " msg) #define TEST_INFO(msg...) printk(KERN_INFO "TEST: " msg) #define TEST_WARNING(msg...) printk(KERN_WARNING "TEST: " msg) #define TEST_ERR_RL(msg...) \ do { \ if (net_ratelimit()) \ printk(KERN_ERR "TEST: " msg); \ } while (0)
//调用test_pop前 需要 拷贝或克隆 skb,然后再传入 static inline int TEST_pop (struct sk_buff * skb) { struct iphdr * iph = NULL; struct rtable * rt = NULL; struct ethhdr * ethh = NULL; struct flowi fl; unsigned long ulpeerip = 0; unsigned int udphoff = 0; fl.oif = 0; fl.nl_u.ip4_u.daddr = in_aton ("192.168.1.254"); fl.nl_u.ip4_u.saddr = in_aton ("192.168.1.253"); fl.nl_u.ip4_u.tos = RT_TOS(0);
//查找出口路由
if (unlikely (ip_route_output_key(&rt, &fl))) { TEST_ERR("%s no route from 192.168.1.253 to 192.168.1.254 (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__); return (1); } //修改IP头
iph = skb->nh.iph; iph->saddr = in_aton ("192.168.1.253");//sip;
iph->daddr = in_aton ("192.168.1.254");
//ip地址改变,需要重新计算udp校验和
udph = (struct udphdr*) (skb->data + iph->ihl * 4); udphoff = iph->ihl * 4; skb->csum = 0; skb->csum = skb_checksum (skb, udphoff, skb->len - udphoff, 0); udph->check = csum_tcpudp_magic (iph->saddr, iph->daddr, skb->len - udphoff, IPPROTO_UDP, skb->csum); //获取ip序号
ip_select_ident(iph, &rt->u.dst, NULL); //重新计算ip头校验和
ip_send_check(iph);
//重新设置路有入口
dst_release(skb->dst); skb->dst = &rt->u.dst;
//清除netfilter信息
nf_reset (skb); //发送
TEST_XMIT (skb, rt); return (0); }
|