Open
Description
https://godbolt.org/z/cnjvbzj9a
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;
typedef long int intptr_t;
typedef struct MBuf {
void *buf_addr;
union {
void *userdata;
uint64_t udata64;
};
} __attribute__((__aligned__(64))) MBuf_t;
typedef struct MBuf MBuf;
typedef union {
struct {
uint32_t srcIp;
uint32_t dstIp;
uint16_t srcPort;
uint16_t dstPort;
uint16_t vrfIndex;
uint8_t protocol;
} detail;
} FlowKey;
typedef struct {
union {
uint8_t u6_ucaddr[16];
uint16_t u6_usaddr[8];
uint32_t u6_uladdr[4];
uint64_t u6_ulladdr[2];
} u6_addr;
} In6Addr;
typedef struct {
uint16_t vsys_index;
FlowKey packet_key;
uint16_t dst_nat_port;
uint32_t dst_nat_ip;
struct {
In6Addr src_ip;
In6Addr dst_ip;
} ipv6_pkt_info;
} __attribute__((__aligned__(64))) MbufContext;
typedef struct {
_Bool is_ipv6;
union {
uint32_t v4;
In6Addr v6;
} addr;
} ip_addr_t;
typedef struct fc_fwd_flow_info_s {
ip_addr_t src_ip;
ip_addr_t src_natip;
ip_addr_t dst_ip;
ip_addr_t dst_natip;
uint16_t vsys_id;
uint16_t vrf_index;
uint16_t src_port;
uint16_t dst_port;
uint16_t dst_natport;
uint8_t proto;
uint8_t nat_type;
} flow_info_t;
enum PORT_TYPE {
TYPE_ONE,
TYPE_TWO,
TYPE_THREE,
TYPE_FOUR,
TYPE_FIVE,
TYPE_MAX
};
void foo(MBuf *mbuf, flow_info_t *info)
{
info->vsys_id = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->vsys_index);
info->vrf_index = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.vrfIndex);
info->proto = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.protocol);
info->src_port = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcPort);
info->dst_port = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstPort);
info->dst_natport = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->dst_nat_port);
info->dst_natip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->dst_nat_ip);
switch (info->nat_type) {
case TYPE_ONE: {
info->src_ip.addr.v6 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->ipv6_pkt_info.src_ip);
info->dst_ip.addr.v6 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->ipv6_pkt_info.dst_ip);
break;
}
case TYPE_TWO:
info->src_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcIp);
info->dst_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstIp);
break;
case TYPE_THREE:
case TYPE_FOUR:
default: {
info->src_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcIp);
info->dst_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstIp);
break;
}
}
}
the TBAA matedata is omnipotent char
cause the cast path have uint8_t *
,
I'm not familiar with GCC's TBAA, but I think there are potential for performance improvement.