我有一个结构,我可以使用两个定义IP_V(ip)
和IP_HL(ip)
阅读,但我也需要写信给他们。在给定结构ip_vhl
的情况下,写入struct pkt_ip ip;
中较低和较高位的语法是什么?
struct pkt_ip
{
uint8_t ip_vhl; /* header length, version */
#define IP_V(ip) (((ip)->ip_vhl & 0xf0) >> 4)
#define IP_HL(ip) ((ip)->ip_vhl & 0x0f)
uint8_t ip_tos; /* type of service */
#define IP_DSCP(ip) (((ip)->ip_tos & 0xfc) >> 4)
#define IP_ECN(ip) ((ip)->ip_tos & 0x3f)
uint16_t ip_len; /* total length */
uint16_t ip_id; /* identification */
uint16_t ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
uint8_t ip_ttl; /* time to live */
uint8_t ip_p; /* protocol */
uint16_t ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
} __attribute__ ((__packed__));
答案 0 :(得分:0)
您需要自己在ip_vhl
字段上进行位操作。
设置版本:
header.ip_vhl = (header.ip_vhl & 0x0f) | ((new_version & 0xf) << 4);
设置标题长度:
header.ip_vhl = (header.ip_vhl & 0xf0) | (new_length & 0xf);
答案 1 :(得分:0)
我假设您要使用值myVal
,范围从0x0..0x0f
到ip_vhl
的低位或更高的半字节。然后您可以使用以下语句:
ip_vhl = (ip_vhl & 0x0f) | ((myVal & 0x0f) << 4)
ip_vhl = (ip_vhl & 0xf0) | (myVal & 0x0f)