1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cloud_print/gcp20/prototype/dns_packet_parser.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/big_endian.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/logging.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDnsPacketParser::DnsPacketParser(const char* packet, size_t length) 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : packet_(packet), 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch length_(length), 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch record_parser_(packet, length, sizeof(header_)) { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::BigEndianReader reader(packet, length); 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_header_read_ = reader.ReadU16(&header_.id) && 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reader.ReadU16(&header_.flags) && 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reader.ReadU16(&header_.qdcount) && 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reader.ReadU16(&header_.ancount) && 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reader.ReadU16(&header_.nscount) && 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reader.ReadU16(&header_.arcount); 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool DnsPacketParser::ReadRecord(DnsQueryRecord* out) { 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(packet_); 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DnsQueryRecord result; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t consumed = ReadName(&result.qname); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!consumed) 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::BigEndianReader reader(packet_ + GetOffset() + consumed, 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) length_ - (GetOffset() + consumed)); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (reader.ReadU16(&result.qtype) && reader.ReadU16(&result.qclass) && 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch record_parser_.SkipQuestion()) { // instead of |cur_ = reader.ptr();| 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *out = result; 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40