static void sip_deserialize(struct proto_info *info_, uint8_t const **buf) { struct sip_proto_info *info = DOWNCAST(info_, info, sip_proto_info); proto_info_deserialize(info_, buf); info->set_values = deserialize_2(buf); if (info->set_values & SIP_CMD_SET) info->cmd = deserialize_1(buf); if (info->set_values & SIP_FROM_SET) deserialize_str(buf, info->from, sizeof(info->from)); if (info->set_values & SIP_TO_SET) deserialize_str(buf, info->to, sizeof(info->to)); if (info->set_values & SIP_CALLID_SET) deserialize_str(buf, info->call_id, sizeof(info->call_id)); if (info->set_values & SIP_MIME_SET) deserialize_str(buf, info->mime_type, sizeof(info->mime_type)); if (info->set_values & SIP_VIA_SET) { info->via.protocol = deserialize_1(buf); ip_addr_deserialize(&info->via.addr, buf); info->via.port = deserialize_2(buf); } if (info->set_values & SIP_LENGTH_SET) info->content_length = deserialize_4(buf); if (info->set_values & SIP_CODE_SET) info->code = deserialize_4(buf); if (info->set_values & SIP_CSEQ_SET) info->cseq = deserialize_4(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)); }
int deserialize_version(struct buff *buf, btc_msg_version *v) { int res; memset(v, 0, sizeof *v); res = deserialize_uint32(buf, &v->version); res |= deserialize_uint64(buf, &v->services); res |= deserialize_uint64(buf, &v->time); res |= deserialize_addr(BTC_PROTO_MIN, buf, &v->addrTo); res |= deserialize_addr(BTC_PROTO_MIN, buf, &v->addrFrom); res |= deserialize_uint64(buf, &v->nonce); res |= deserialize_str(buf, v->strVersion, sizeof v->strVersion); res |= deserialize_uint32(buf, &v->startingHeight); if (v->version >= BTC_PROTO_FILTERING && buff_space_left(buf) > 0) { res |= deserialize_uint8(buf, &v->relayTx); } else { v->relayTx = 1; } ASSERT(buff_space_left(buf) == 0); return res; }