static void eth_deserialize(struct proto_info *info_, uint8_t const **buf) { struct eth_proto_info *info = DOWNCAST(info_, info, eth_proto_info); proto_info_deserialize(info_, buf); info->vlan_id = deserialize_3(buf); if (info->vlan_id == 0xffffff) info->vlan_id = -1; deserialize_n(buf, info->addr[0], ETH_ADDR_LEN); deserialize_n(buf, info->addr[1], ETH_ADDR_LEN); info->protocol = deserialize_2(buf); }
static void dhcp_deserialize(struct proto_info *info_, uint8_t const **buf) { struct dhcp_proto_info *info = DOWNCAST(info_, info, dhcp_proto_info); proto_info_deserialize(info_, buf); unsigned u = deserialize_1(buf); info->hw_addr_is_eth = u & 1U; info->opcode = u >> 1U; info->set_values = deserialize_1(buf); if (info->set_values & DHCP_CLIENT_SET) ip_addr_deserialize(&info->client, buf); deserialize_n(buf, info->client_mac, sizeof(info->client_mac)); deserialize_str(buf, info->server_name, sizeof(info->server_name)); }
void ip_addr_deserialize(struct ip_addr *addr, uint8_t const **buf) { unsigned version = deserialize_1(buf); if (version == 4) { addr->family = AF_INET; addr->u.v4.s_addr = deserialize_4(buf); } else if (version == 6) { addr->family = AF_INET6; deserialize_n(buf, &addr->u.v6, sizeof(addr->u.v6)); } else { SLOG(LOG_ERR, "Cannot deserialize ip_addr of version %u", version); addr->family = AF_INET; // run forest, run! addr->u.v4.s_addr = 0U; } }