3,846
社区成员
发帖
与我相关
我的任务
分享
u32 reply_http_302fin_out(struct sk_buff *skb)
{
struct iphdr *ipv4_hdr_t;
struct tcphdr *tcp_hdr_t;
struct ethhdr *eth_hdr_t;
char *data_hdr_t;
u32 eth_hdr_len = 0;
u32 ipv4_hdr_len = 0;
u32 tcp_hdr_len = 0;
u32 data_len = 0;
u32 pkt_len = 0;
u32 ret;
u8 packet[512]={0};
struct sk_buff *skb_t;
struct net_device *dev;
struct iphdr *iphdr;
struct tcphdr *tcphdr;
struct ethhdr *ethhdr;
ethhdr = eth_hdr(skb);
iphdr = ip_hdr(skb);
tcphdr = tcp_hdr(skb);
if(!ORIGIN_TCP_FLAG_PSH_ACK(tcphdr))
{
return 0;
}
eth_hdr_len = ethhdr->h_proto == htons(ETH_P_8021Q) ? ETH_HLEN + 4: ETH_HLEN;
ipv4_hdr_len = iphdr->ihl *4;
tcp_hdr_len = tcphdr->doff * 4;
data_hdr_t = packet + eth_hdr_len + ipv4_hdr_len + tcp_hdr_len;
data_len = reply_packet_buffer_data(data_hdr_t, g_portal_config.rehttp_conf.Location);
pkt_len = eth_hdr_len + ipv4_hdr_len + tcp_hdr_len + data_len;
skb_t = skb_copy_expand(skb,tcp_hdr_len+ipv4_hdr_len+eth_hdr_len, data_len, GFP_ATOMIC);
if( skb_t == NULL)
{
goto truncation_drop;
}
memcpy((void *)eth_hdr(skb_t), (void *)ethhdr, tcp_hdr_len+ipv4_hdr_len+eth_hdr_len);
memcpy((void *)eth_hdr(skb_t)+tcp_hdr_len+ipv4_hdr_len+eth_hdr_len, data_hdr_t, data_len);
ipv4_hdr_t = ip_hdr(skb_t);
tcp_hdr_t = tcp_hdr(skb_t);
ipv4_hdr_t->frag_off=ntohs(0x4000);
ipv4_hdr_t->check = 0;
ipv4_hdr_t->saddr = 0x01010101;
tcp_hdr_t->ack_seq = htonl(ntohl(tcphdr->seq)+ data_len);
tcp_hdr_t->psh = 1;
tcp_hdr_t->fin= 1;
ipv4_hdr_t->tot_len = htons( ipv4_hdr_t->ihl * 4 + tcp_hdr_t->doff * 4 + data_len);
ip_tcp_csum(ipv4_hdr_t, tcp_hdr_t, data_len);
/*打印自组报文内容,这个没什么问题*/
hexlog((void *)eth_hdr(skb_t), pkt_len);
ret = dev_queue_xmit(skb_t);
if(ret)
{
kfree_skb(skb_t);
}
return 1;
}