我这里的重定向环境是对客户端的请求直接截断重定向到其他页面。
以太头和Ip头想应数据对调。
Tcp头flags标记和序号问题。主要问题
数据内容主要的就两条:
"HTTP/1.1 302 Moved Temporarily"
"Location: 路径"
一、以太头结构
在帧结构里我用到的有MAC源和目的地址,以太类型。至于802.1Q标签,如果加了,对以太类型想对地址要向生移4个字节。源来的地址值则为0x8100。
用到的以太类型是 0x800 表以后一个负载段的内容是一个IP包。这个宏定义在if_ether.h头文件里。
#define ETH_P_PUPAT 0x0201 /*Xerox PUP Addr Trans packet */
#define ETH_P_IP 0x0800 /*Internet Protocol packet */
#define ETH_P_X25 0x0805 /* CCITTX.25 */
#define ETH_P_ARP 0x0806 /*Address Resolution packet */
先看是不是IP包
是:对换MAC地址,复制以太头结构到buffer
不是:这个就直接转发的转发,丢包的丢包了不管了。
unsignedshort *port = NULL;
unsignedshort h_poto = 0;
if(pkt->eth_hdr_ptr->h_proto== htons(ETH_P_8021Q))
{
h_poto= *((unsigned short *) pkt ->eth_hdr_ptr + 8);
}
else
{
h_poto= pkt ->eth_hdr_ptr->h_proto;
}
if( h_poto != htons(ETH_P_IP) )
{
returnERROR_FAIL;
}
port= (unsigned short *) pkt->l4_hdr_ptr;
if(port== NULL)
{
returnERROR_FAIL;
}
二、IP报文头结构的话
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Pleasefix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;