static void dissect_mx_records(tvbuff_t* tvb, proto_tree* tree, guint32 nrec, int offset) { guint i, curr; guint /*len, namelen,*/ priority, dlen; const guchar *dname; proto_item* mx_rec_item, *rec_item; proto_tree* mx_rec_tree, *rec_tree; if(tree) { mx_rec_item = proto_tree_add_text(tree, tvb, offset, offset, "MX records (%d)", nrec); mx_rec_tree = proto_item_add_subtree(mx_rec_item, ett_mx_rec); } else return; curr = offset; for(i=0; i < nrec; i++) { /*len = tvb_get_ntohs(tvb, curr);*/ priority = tvb_get_ntohs(tvb, curr + 2); /*namelen = len - 4;*/ dlen = get_dns_name(tvb, curr + 4, 0, curr + 4, &dname); if(mx_rec_tree) { rec_item = proto_tree_add_text(mx_rec_tree, tvb, curr,6,"MX record: pri=%d,dname=%s", priority,dname); rec_tree = proto_item_add_subtree(rec_item, ett_mx_rec_item); } else return; proto_tree_add_uint(rec_tree, hf_srv_prio, tvb, curr + 2, 2, priority); proto_tree_add_text(rec_tree, tvb, curr + 4, dlen, "name: %s", dname); curr+=(int)((sizeof(short)*2) + dlen); } }
/** * Downloads a single file from the specified server. */ bool GetOneFile( const launcher::Settings &settings, const std::string &filename, const Signature crc) { Trace("Attempting to download " << filename); core::net::NetClient client(core::net::eConnectionMode::TCP_ASYNC); std::string hostName; for (auto server = settings.get_patch_server_begin(); server != settings.get_patch_server_end(); ++server) { client.start(settings.get_patch_server(0)); if (client.valid()) { hostName = wrappers::net::http::Uri(server->get_dns_name()).getHost(); break; } } if (!client.valid()) { Log(LL::Error) << "Unable to connect to any servers." << std::endl; return false; } wrappers::net::http::HttpHeader header = wrappers::net::http::HttpHeader::Builder() .setRequestType(wrappers::net::http::HttpHeader::eRequestType::HTTP_REQUEST_GET) .setRequestPath(std::string("/") + settings.get_server_patch_dir() + filename) .addHeader("host", hostName) .build(); if (!header.valid()) { return false; } client.send(header.asBlob()); const vfs::Path outputPath = GetOutputPath(filename); vfs::ofstream outfile(outputPath, std::ios::binary | std::ios::out); if (!outfile.is_open()) { Log(LL::Error) << "Unable to open file: " << outputPath.str() << std::endl; return false; } wrappers::net::http::HttpFileHandler fileHandler(outfile); while (client.valid() && !fileHandler.done()) { client.update(fileHandler); core::thread::thisthread::yield(); } client.stop(); outfile.flush(); if (!fileHandler.success()) { return false; } return CheckSignature(outputPath, crc); }
static void dissect_mx_records(tvbuff_t* tvb, proto_tree* tree, guint32 nrec, int offset) { guint i, curr; guint /*len, namelen,*/ priority, dlen; const guchar *dname; proto_tree* mx_rec_tree, *rec_tree; if(tree == NULL) return; mx_rec_tree = proto_tree_add_subtree_format(tree, tvb, offset, offset, ett_mx_rec, NULL, "MX records (%d)", nrec); curr = offset; for(i=0; i < nrec; i++) { /*len = tvb_get_ntohs(tvb, curr);*/ priority = tvb_get_ntohs(tvb, curr + 2); /*namelen = len - 4;*/ dlen = get_dns_name(tvb, curr + 4, 0, curr + 4, &dname); rec_tree = proto_tree_add_subtree_format(mx_rec_tree, tvb, curr,6,ett_mx_rec_item,NULL, "MX record: pri=%d,dname=%s", priority,dname); proto_tree_add_item(rec_tree, hf_srv_prio, tvb, curr + 2, 2, ENC_BIG_ENDIAN); proto_tree_add_string(rec_tree, hf_srv_dname, tvb, curr + 4, dlen, dname); curr+=(int)((sizeof(short)*2) + dlen); } }
static void dissect_ns_records(tvbuff_t* tvb, proto_tree* tree, guint32 nrec, int offset) { guint i, curr; guint /*len, namelen,*/ dlen; const guchar *dname; proto_item* ns_rec_item, *rec_item; proto_tree* ns_rec_tree, *rec_tree; if(tree) { ns_rec_item = proto_tree_add_text(tree, tvb, offset, offset, "NS record (%d)", nrec); ns_rec_tree = proto_item_add_subtree(ns_rec_item, ett_ns_rec); } else return; curr=offset; for(i=0;i<nrec;i++) { /*len = tvb_get_ntohs(tvb, curr);*/ /*namelen = len - 2;*/ dlen = get_dns_name(tvb, curr + 2, 0, curr + 2, &dname); if(ns_rec_tree) { rec_item = proto_tree_add_text(ns_rec_tree, tvb, curr,4, "NS record: dname=%s",dname); rec_tree = proto_item_add_subtree(rec_item, ett_ns_rec_item); } else return; proto_tree_add_text(rec_tree, tvb, curr + 2, dlen, "Name: %s", dname); curr+=(int)(sizeof(short) + dlen); } }
static void dissect_ns_records(tvbuff_t* tvb, proto_tree* tree, guint32 nrec, int offset) { guint i, curr; guint /*len, namelen,*/ dlen; const guchar *dname; proto_tree* ns_rec_tree, *rec_tree; if(tree == NULL) return; ns_rec_tree = proto_tree_add_subtree_format(tree, tvb, offset, offset, ett_ns_rec, NULL, "NS record (%d)", nrec); curr=offset; for(i=0;i<nrec;i++) { /*len = tvb_get_ntohs(tvb, curr);*/ /*namelen = len - 2;*/ dlen = get_dns_name(tvb, curr + 2, 0, curr + 2, &dname); rec_tree = proto_tree_add_subtree_format(ns_rec_tree, tvb, curr,4, ett_ns_rec_item, NULL, "NS record: dname=%s",dname); proto_tree_add_string(rec_tree, hf_ns_dname, tvb, curr + 2, dlen, dname); curr+=(int)(sizeof(short) + dlen); } }
static gint dissect_gsup_tlvs(tvbuff_t *tvb, int base_offs, int length, packet_info *pinfo, proto_tree *tree, proto_item *gsup_ti) { int offset = base_offs; while (offset - base_offs < length) { guint8 tag; unsigned int len; proto_item *ti; proto_tree *att_tree; const guchar *apn; const gchar *str; guint apn_len; tag = tvb_get_guint8(tvb, offset); offset++; len = tvb_get_guint8(tvb, offset); offset++; att_tree = proto_tree_add_subtree_format(tree, tvb, offset-2, len+2, ett_gsup_ie, &ti, "IE: %s", val_to_str(tag, gsup_iei_types, "Unknown 0x%02x")); proto_tree_add_item(att_tree, hf_gsup_iei, tvb, offset-2, 1, ENC_BIG_ENDIAN); proto_tree_add_uint(att_tree, hf_gsup_ie_len, tvb, offset-1, 1, len); switch (tag) { /* Nested TLVs */ case OSMO_GSUP_AUTH_TUPLE_IE: case OSMO_GSUP_PDP_INFO_IE: dissect_gsup_tlvs(tvb, offset, len, pinfo, att_tree, gsup_ti); break; /* Normal IEs */ case OSMO_GSUP_RAND_IE: proto_tree_add_item(att_tree, hf_gsup_rand, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_SRES_IE: proto_tree_add_item(att_tree, hf_gsup_sres, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_KC_IE: proto_tree_add_item(att_tree, hf_gsup_kc, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_IK_IE: proto_tree_add_item(att_tree, hf_gsup_ik, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_CK_IE: proto_tree_add_item(att_tree, hf_gsup_ck, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_AUTN_IE: proto_tree_add_item(att_tree, hf_gsup_autn, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_AUTS_IE: proto_tree_add_item(att_tree, hf_gsup_auts, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_RES_IE: proto_tree_add_item(att_tree, hf_gsup_res, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_CN_DOMAIN_IE: proto_tree_add_item(att_tree, hf_gsup_cn_domain, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_CANCEL_TYPE_IE: proto_tree_add_item(att_tree, hf_gsup_cancel_type, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_IMSI_IE: str = dissect_e212_imsi(tvb, pinfo, att_tree, offset, len, FALSE); proto_item_append_text(ti, ", %s", str); proto_item_append_text(gsup_ti, ", IMSI: %s", str); break; case OSMO_GSUP_MSISDN_IE: str = dissect_e164_msisdn(tvb, att_tree, offset+1, len-1, E164_ENC_BCD); proto_item_append_text(ti, ", %s", str); proto_item_append_text(gsup_ti, ", MSISDN: %s", str); break; case OSMO_GSUP_ACCESS_POINT_NAME_IE: if (len == 1) { guint8 ch = tvb_get_guint8(tvb, offset); proto_tree_add_item(att_tree, hf_gsup_ie_payload, tvb, offset, len, ENC_NA); if (ch == '*') proto_item_append_text(ti, ", '*' (Wildcard)"); } else { get_dns_name(tvb, offset, len, 0, &apn, &apn_len); proto_tree_add_string(att_tree, hf_gsup_apn, tvb, offset, len, apn); proto_item_append_text(ti, ", %s", apn); } break; case OSMO_GSUP_PDP_CONTEXT_ID_IE: proto_tree_add_item(att_tree, hf_gsup_pdp_context_id, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_CHARG_CHAR_IE: proto_tree_add_item(att_tree, hf_gsup_charg_char, tvb, offset, len, ENC_ASCII|ENC_NA); break; case OSMO_GSUP_CAUSE_IE: proto_tree_add_item(att_tree, hf_gsup_cause, tvb, offset, len, ENC_NA); break; /* boolean flags: either they're present or not */ case OSMO_GSUP_PDP_INFO_COMPL_IE: proto_tree_add_item(att_tree, hf_gsup_pdp_info_compl, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_FREEZE_PTMSI_IE: proto_tree_add_item(att_tree, hf_gsup_freeze_ptmsi, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_SESSION_ID_IE: proto_tree_add_item(att_tree, hf_gsup_session_id, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_SESSION_STATE_IE: proto_tree_add_item(att_tree, hf_gsup_session_state, tvb, offset, len, ENC_NA); break; case OSMO_GSUP_SS_INFO_IE: dissect_ss_info_ie(tvb, pinfo, offset, len, att_tree); break; case OSMO_GSUP_HLR_NUMBER_IE: case OSMO_GSUP_PDP_TYPE_IE: case OSMO_GSUP_PDP_QOS_IE: default: /* Unknown/unsupported IE: Print raw payload in addition to IEI + Length printed above */ proto_tree_add_item(att_tree, hf_gsup_ie_payload, tvb, offset, len, ENC_NA); break; } offset += len; } return offset; }
static void dissect_srv_records(tvbuff_t* tvb, proto_tree* tree,guint32 nrec,int offset) { guint32 i, curr; guint16 /*len, namelen,*/ priority, weight, port, dlen; const guchar *dname; proto_item* srv_rec_tree, *rec_tree; if(tree == NULL) return; srv_rec_tree = proto_tree_add_subtree_format(tree, tvb, offset, offset, ett_srv_rec, NULL, "SRV records (%d)", nrec); curr = offset; for(i=0; i < nrec; i++) { /*len = tvb_get_ntohs(tvb, curr);*/ priority = tvb_get_ntohs(tvb, curr + 2); weight = tvb_get_ntohs(tvb, curr + 4); port = tvb_get_ntohs(tvb, curr + 6); /*namelen = len - 8;*/ dlen = get_dns_name(tvb, curr + 8, 0, curr + 8, &dname); rec_tree = proto_tree_add_subtree_format(srv_rec_tree, tvb, curr, 6, ett_srv_rec_item, NULL, "SRV record:pri=%d,w=%d,port=%d,dname=%s", priority, weight, port, dname); proto_tree_add_uint(rec_tree, hf_srv_prio, tvb, curr + 2, 2, priority); proto_tree_add_uint(rec_tree, hf_srv_weight, tvb, curr + 4, 2, weight); proto_tree_add_uint(rec_tree, hf_srv_port, tvb, curr + 6, 2, port); proto_tree_add_string(rec_tree, hf_srv_dname, tvb, curr + 8, dlen, dname); curr+=(int)((sizeof(short)*4) + dlen); } }