Closed chenyuan0001 closed 11 months ago
ennnn.....看样子这里错的很离谱,应该是:
static try_inline u8 get_ip_header_len(u8 h) { u8 len = (h & 0x0F) * 4; return len > IP_H_LEN ? len: IP_H_LEN; }
IP头部长度放的是低4-bits?这里原先取的实际上是IP的版本 :/
邮件已收到,谢谢!
ennnn.....看样子这里错的很离谱,应该是:
static try_inline u8 get_ip_header_len(u8 h) { u8 len = (h & 0x0F) * 4; return len > IP_H_LEN ? len: IP_H_LEN; }
IP头部长度放的是低4-bits?这里原先取的实际上是IP的版本 :/
长度是放在高4-bits的,取的没有问题,但是计算长度的时候需要通过移位去掉低4-bits的版本信息,否则算出来是个大于4*15的值
ennnn.....看样子这里错的很离谱,应该是: static try_inline u8 get_ip_header_len(u8 h) { u8 len = (h & 0x0F) * 4; return len > IP_H_LEN ? len: IP_H_LEN; } IP头部长度放的是低4-bits?这里原先取的实际上是IP的版本 :/
长度是放在高4-bits的,取的没有问题,但是计算长度的时候需要通过移位去掉低4-bits的版本信息,否则算出来是个大于4*15的值
我测试(打印)了一下,(h & 0x0F) * 4是没问题的,打印出来的是20;直接打印h & 0xF0的话,是64,也就是4 << 4
IP头部是这样的:
4-byte | 4-byte version | ihl
ihl的位置是在低4位的,byte里面靠左的是高位嘛
ennnn.....看样子这里错的很离谱,应该是: static try_inline u8 get_ip_header_len(u8 h) { u8 len = (h & 0x0F) * 4; return len > IP_H_LEN ? len: IP_H_LEN; } IP头部长度放的是低4-bits?这里原先取的实际上是IP的版本 :/
长度是放在高4-bits的,取的没有问题,但是计算长度的时候需要通过移位去掉低4-bits的版本信息,否则算出来是个大于4*15的值
我测试(打印)了一下,(h & 0x0F) * 4是没问题的,打印出来的是20;直接打印h & 0xF0的话,是64,也就是4 << 4
IP头部是这样的:
4-byte | 4-byte version | ihl
ihl的位置是在低4位的,byte里面靠左的是高位嘛
嗯,是的,我刚刚抓了个包看了下,长度是在低4-bits的
static try_inline u8 get_ip_header_len(u8 h) { u8 len = (h & 0xF0) * 4; // 这里应该是需要右移4位后乘4? return len > IP_H_LEN ? len: IP_H_LEN; }