OpenCloudOS / nettrace

nettrace is a eBPF-based tool to trace network packet and diagnose network problem.
Other
326 stars 80 forks source link

ip头长度计算问题 #80

Closed chenyuan0001 closed 11 months ago

chenyuan0001 commented 11 months ago

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; }

menglongdong commented 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的版本 :/

chenyuan0001 commented 11 months ago

邮件已收到,谢谢!

chenyuan0001 commented 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的版本 :/

长度是放在高4-bits的,取的没有问题,但是计算长度的时候需要通过移位去掉低4-bits的版本信息,否则算出来是个大于4*15的值

menglongdong commented 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的版本 :/

长度是放在高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里面靠左的是高位嘛

chenyuan0001 commented 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的版本 :/

长度是放在高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的