// 分片标志定义
#define PROTO_IP_FRAG 0x2000 // More Fragments标志位 0010 0000 0000 0000
#define PROTO_IPFRAG_OFFSET 0x1FFF // 分片偏移掩码(低13位) 0001 1111 1111 1111
// 分片类型标志
#define PROTO_IPFRAG_FLAG_NOFRAG 0x00 // 无分片
#define PROTO_IPFRAG_FLAG_FIRST 0x01 // 第一个分片
#define PROTO_IPFRAG_FLAG_NEXT 0x04 // 后续分片
#define PROTO_IPFRAG_FLAG_LAST 0x08 // 最后一个分片

根据协议标准,Flags和FragmentOffset分别占3和13bit
0 1 2
+-----+------+------+
| 0 | DF | MF |
+-----+------+------+
- Bit 0: 保留位,必须为0。
- Bit 1: DF(Don’t Fragment),能否分片位,0表示可以分片,1表示不能分片。
- Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。
// 分片
if (pIp->fragoffset & PROTO_IPFRAG_OFFSET)
{
pIp->flag = PROTO_IPFRAG_FLAG_NEXT;
// 最后一个分片
if (!(pIp->fragoffset & PROTO_IP_FRAG))
{
pIp->flag |= PROTO_IPFRAG_FLAG_LAST;
}
}
else
{
// 第一个分片MF为1,后13为为0
if (pIp->fragoffset & PROTO_IP_FRAG)
{
pIp->flag = PROTO_IPFRAG_FLAG_FIRST;
}
else
{
pIp->flag = PROTO_IPFRAG_FLAG_NOFRAG;
}
}
209

被折叠的 条评论
为什么被折叠?



