Changeset 2723609 in rtems-libbsd


Ignore:
Timestamp:
Sep 19, 2018, 6:57:22 AM (8 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
a87e0f4f5c4795f77dc3956c7d1543f90f7d7710, 16fa6a4651faaa77ef72c7e03d285c143d6e54fa
Children:
ab4fe11
Parents:
1e55d820
git-author:
Sebastian Huber <sebastian.huber@…> (09/19/18 06:57:22)
git-committer:
Sebastian Huber <sebastian.huber@…> (09/20/18 09:23:34)
Message:

mDNSResponder: Update to v878.30.4

The sources can be obtained via:

https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-878.30.4.tar.gz

Close #3522.

Location:
mDNSResponder
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • mDNSResponder/Makefile

    r1e55d820 r2723609  
    1717include $(MAKEFILEPATH)/pb_makefiles/platform.make
    1818
    19 MVERS = "mDNSResponder-878.20.3"
     19MVERS = "mDNSResponder-878.30.4"
    2020
    2121VER =
  • mDNSResponder/mDNSCore/mDNS.c

    r1e55d820 r2723609  
    11/* -*- Mode: C; tab-width: 4 -*-
    22 *
    3  * Copyright (c) 2002-2015 Apple Inc. All rights reserved.
     3 * Copyright (c) 2002-2017 Apple Inc. All rights reserved.
    44 *
    55 * Licensed under the Apache License, Version 2.0 (the "License");
     
    41714171            }
    41724172
    4173             MetricsUpdateUDNSQueryStats(queryName, q->qtype, &rr->resrec, q->metrics.querySendCount, responseLatencyMs, isForCellular);
     4173            MetricsUpdateDNSQueryStats(queryName, q->qtype, &rr->resrec, q->metrics.querySendCount, responseLatencyMs, isForCellular);
    41744174            q->metrics.answered = mDNStrue;
    41754175        }
    41764176        if (q->metrics.querySendCount > 0)
    41774177        {
    4178             MetricsUpdateUDNSResolveStats(queryName, &rr->resrec, isForCellular);
     4178            MetricsUpdateDNSResolveStats(queryName, &rr->resrec, isForCellular);
    41794179        }
    41804180    }
     
    89458945           response->h.numAdditionals, response->h.numAdditionals == 1 ? " "    : "s", end - response->data, LLQType);
    89468946
     8947#if AWD_METRICS
     8948    if (mDNSSameIPPort(srcport, UnicastDNSPort))
     8949    {
     8950        MetricsUpdateDNSResponseSize((mDNSu32)(end - (mDNSu8 *)response));
     8951    }
     8952#endif
     8953
    89478954    // According to RFC 2181 <http://www.ietf.org/rfc/rfc2181.txt>
    89488955    //    When a DNS client receives a reply with TC
     
    1212812135        isForCell  = (question->qDNSServer && question->qDNSServer->cellIntf);
    1212912136        durationMs = ((m->timenow - question->metrics.firstQueryTime) * 1000) / mDNSPlatformOneSecond;
    12130         MetricsUpdateUDNSQueryStats(queryName, question->qtype, mDNSNULL, question->metrics.querySendCount, durationMs, isForCell);
     12137        MetricsUpdateDNSQueryStats(queryName, question->qtype, mDNSNULL, question->metrics.querySendCount, durationMs, isForCell);
    1213112138    }
    1213212139#endif
  • mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h

    r1e55d820 r2723609  
    11/* -*- Mode: C; tab-width: 4 -*-
    22 *
    3  * Copyright (c) 2002-2015 Apple Inc. All rights reserved.
     3 * Copyright (c) 2002-2017 Apple Inc. All rights reserved.
    44 *
    55 * Licensed under the Apache License, Version 2.0 (the "License");
     
    18971897#define UUID_SIZE       16
    18981898
    1899 #define AWD_METRICS (USE_AWD && TARGET_OS_EMBEDDED)
     1899#define AWD_METRICS (USE_AWD && TARGET_OS_IOS)
    19001900
    19011901#if AWD_METRICS
     
    20402040    mDNSQuestionCallback *QuestionCallback;
    20412041    void                 *QuestionContext;
    2042 #if TARGET_OS_EMBEDDED
     2042#if AWD_METRICS
    20432043    uDNSMetrics metrics;                    // Data used for collecting unicast DNS query metrics.
    20442044#endif
  • mDNSResponder/mDNSCore/uDNS.c

    r1e55d820 r2723609  
    11/* -*- Mode: C; tab-width: 4 -*-
    22 *
    3  * Copyright (c) 2002-2015 Apple Inc. All rights reserved.
     3 * Copyright (c) 2002-2017 Apple Inc. All rights reserved.
    44 *
    55 * Licensed under the Apache License, Version 2.0 (the "License");
     
    2525#endif
    2626#include "uDNS.h"
     27
     28#if AWD_METRICS
     29#include "Metrics.h"
     30#endif
    2731
    2832#if (defined(_MSC_VER))
     
    13301334        err = mDNSSendDNSMessage(m, &tcpInfo->request, end, mDNSInterface_Any, mDNSNULL, &tcpInfo->Addr, tcpInfo->Port, sock, AuthInfo, mDNSfalse);
    13311335        if (err) { debugf("ERROR: tcpCallback: mDNSSendDNSMessage - %d", err); err = mStatus_UnknownErr; goto exit; }
     1336#if AWD_METRICS
     1337        if (mDNSSameIPPort(tcpInfo->Port, UnicastDNSPort))
     1338        {
     1339            MetricsUpdateDNSQuerySize((mDNSu32)(end - (mDNSu8 *)&tcpInfo->request));
     1340        }
     1341#endif
    13321342
    13331343        // Record time we sent this question
     
    47594769                    {
    47604770                        err = mDNSSendDNSMessage(m, &m->omsg, end, q->qDNSServer->interface, q->LocalSocket, &q->qDNSServer->addr, q->qDNSServer->port, mDNSNULL, mDNSNULL, q->UseBackgroundTrafficClass);
    4761 #if TARGET_OS_EMBEDDED
     4771#if AWD_METRICS
    47624772                        if (!err)
    47634773                        {
     4774                            MetricsUpdateDNSQuerySize((mDNSu32)(end - (mDNSu8 *)&m->omsg));
    47644775                            if (q->metrics.answered)
    47654776                            {
  • mDNSResponder/mDNSMacOSX/Metrics.h

    r1e55d820 r2723609  
    1 /* -*- Mode: C; tab-width: 4 -*-
    2  *
    3  * Copyright (c) 2016 Apple Inc. All rights reserved.
     1/*
     2 * Copyright (c) 2016-2017 Apple Inc. All rights reserved.
    43 *
    54 * Licensed under the Apache License, Version 2.0 (the "License");
     
    1615 */
    1716
    18 #include "mDNSEmbeddedAPI.h"
    19 
    2017#ifndef __Metrics_h
    2118#define __Metrics_h
     19
     20#include "mDNSEmbeddedAPI.h"
     21#include <TargetConditionals.h>
    2222
    2323#ifdef  __cplusplus
     
    2525#endif
    2626
    27 #if TARGET_OS_EMBEDDED
     27#if TARGET_OS_IOS
    2828mStatus MetricsInit(void);
    29 void    MetricsUpdateUDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
    30 void    MetricsUpdateUDNSResolveStats(const domainname *inQueryName, const ResourceRecord *inRR, mDNSBool inForCell);
     29void    MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
     30void    MetricsUpdateDNSResolveStats(const domainname *inQueryName, const ResourceRecord *inRR, mDNSBool inForCell);
     31void    MetricsUpdateDNSQuerySize(mDNSu32 inSize);
     32void    MetricsUpdateDNSResponseSize(mDNSu32 inSize);
    3133void    LogMetrics(void);
    3234#endif
  • mDNSResponder/mDNSMacOSX/Metrics.m

    r1e55d820 r2723609  
    1 /* -*- Mode: C; tab-width: 4 -*-
    2  *
    3  * Copyright (c) 2016 Apple Inc. All rights reserved.
     1/*
     2 * Copyright (c) 2016-2017 Apple Inc. All rights reserved.
    43 *
    54 * Licensed under the Apache License, Version 2.0 (the "License");
     
    1817#import "Metrics.h"
    1918
    20 #if (TARGET_OS_EMBEDDED)
     19#if (TARGET_OS_IOS)
    2120#import <CoreUtils/SoftLinking.h>
    2221#import <WirelessDiagnostics/AWDDNSDomainStats.h>
     22#import <WirelessDiagnostics/AWDMDNSResponderDNSMessageSizeStats.h>
    2323#import <WirelessDiagnostics/AWDMDNSResponderDNSStatistics.h>
    2424#import <WirelessDiagnostics/AWDMDNSResponderResolveStats.h>
     
    2727#import <WirelessDiagnostics/AWDMDNSResponderResolveStatsHostname.h>
    2828#import <WirelessDiagnostics/AWDMDNSResponderResolveStatsResult.h>
     29#import <WirelessDiagnostics/AWDMDNSResponderServicesStats.h>
    2930#import <WirelessDiagnostics/AWDMetricIds_MDNSResponder.h>
    3031#import <WirelessDiagnostics/WirelessDiagnostics.h>
    31 #import <WirelessDiagnostics/AWDMDNSResponderServicesStats.h>
    3232
    3333#import "DNSCommon.h"
     
    4141SOFT_LINK_FRAMEWORK(PrivateFrameworks, WirelessDiagnostics)
    4242
     43// AWDServerConnection class
     44
     45SOFT_LINK_CLASS(WirelessDiagnostics, AWDServerConnection)
     46
     47#define AWDServerConnectionSoft     getAWDServerConnectionClass()
     48
     49// Classes for query stats
     50
     51SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderDNSStatistics)
    4352SOFT_LINK_CLASS(WirelessDiagnostics, AWDDNSDomainStats)
    44 SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderDNSStatistics)
     53
     54#define AWDMDNSResponderDNSStatisticsSoft       getAWDMDNSResponderDNSStatisticsClass()
     55#define AWDDNSDomainStatsSoft                   getAWDDNSDomainStatsClass()
     56
     57// Classes for resolve stats
     58
    4559SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderResolveStats)
    4660SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderResolveStatsDNSServer)
     
    4862SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderResolveStatsHostname)
    4963SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderResolveStatsResult)
    50 SOFT_LINK_CLASS(WirelessDiagnostics, AWDServerConnection)
    51 SOFT_LINK_CLASS(WirelessDiagnostics, AWDMetricManager)
    52 
    53 #define AWDDNSDomainStatsSoft                           getAWDDNSDomainStatsClass()
    54 #define AWDMDNSResponderDNSStatisticsSoft               getAWDMDNSResponderDNSStatisticsClass()
     64
    5565#define AWDMDNSResponderResolveStatsSoft                getAWDMDNSResponderResolveStatsClass()
    56 #define AWDMDNSResponderResolveStatsResultSoft          getAWDMDNSResponderResolveStatsResultClass()
    5766#define AWDMDNSResponderResolveStatsDNSServerSoft       getAWDMDNSResponderResolveStatsDNSServerClass()
    5867#define AWDMDNSResponderResolveStatsDomainSoft          getAWDMDNSResponderResolveStatsDomainClass()
    5968#define AWDMDNSResponderResolveStatsHostnameSoft        getAWDMDNSResponderResolveStatsHostnameClass()
    60 #define AWDServerConnectionSoft                         getAWDServerConnectionClass()
    61 #define AWDMetricManagerSoft                            getAWDMetricManagerClass()
     69#define AWDMDNSResponderResolveStatsResultSoft          getAWDMDNSResponderResolveStatsResultClass()
     70
     71// Classes for services stats
     72
     73SOFT_LINK_CLASS(WirelessDiagnostics, AWDMetricManager)
     74
     75#define AWDMetricManagerSoft        getAWDMetricManagerClass()
     76
     77// Classes for DNS message size stats
     78
     79SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderDNSMessageSizeStats)
     80
     81#define AWDMDNSResponderDNSMessageSizeStatsSoft     getAWDMDNSResponderDNSMessageSizeStatsClass()
    6282
    6383//===========================================================================================================================
     
    83103//===========================================================================================================================
    84104
    85 typedef struct
    86 {
    87     const char *            cstr;       // Name of domain as a c-string.
    88     const domainname *      name;       // Name of domain as length-prefixed labels.
    89     int                     labelCount; // Number of labels in domain name. Used for domain name comparisons.
    90 
    91 }   Domain;
    92 
    93 // Important: Do not add to this list without getting privacy approval beforehand. See <rdar://problem/24155761&26397203>.
    94 // If you get approval and do add a domain to this list, make sure it passes ValidateDNSStatsDomains() below.
    95 
    96 static const Domain     kQueryStatsDomains[] =
    97 {
    98     { ".",              (domainname *)"",                            0 },
    99     { "apple.com.",     (domainname *)"\x5" "apple"     "\x3" "com", 2 },
    100     { "icloud.com.",    (domainname *)"\x6" "icloud"    "\x3" "com", 2 },
    101     { "mzstatic.com.",  (domainname *)"\x8" "mzstatic"  "\x3" "com", 2 },
    102     { "google.com.",    (domainname *)"\x6" "google"    "\x3" "com", 2 },
    103     { "facebook.com.",  (domainname *)"\x8" "facebook"  "\x3" "com", 2 },
    104     { "baidu.com.",     (domainname *)"\x5" "baidu"     "\x3" "com", 2 },
    105     { "yahoo.com.",     (domainname *)"\x5" "yahoo"     "\x3" "com", 2 },
    106     { "qq.com.",        (domainname *)"\x2" "qq"        "\x3" "com", 2 },
     105// Data structures for query stats.
     106
     107typedef struct QueryStats       QueryStats;
     108typedef struct DNSHistSet       DNSHistSet;
     109typedef mDNSBool                (*QueryNameTest_f)(const QueryStats *inStats, const domainname *inQueryName);
     110
     111struct QueryStats
     112{
     113    QueryStats *        next;           // Pointer to next domain stats in list.
     114    const char *        domainStr;      // Domain (see below) as a C string.
     115    uint8_t *           domain;         // Domain for which these stats are collected.
     116    const char *        altDomainStr;   // Alt domain string to use in the AWD version of the stats instead of domainStr.
     117    DNSHistSet *        nonCellular;    // Query stats for queries sent over non-cellular interfaces.
     118    DNSHistSet *        cellular;       // Query stats for queries sent over cellular interfaces.
     119    QueryNameTest_f     test;           // Function that tests whether a given query's stats belong based on the query name.
     120    int                 labelCount;     // Number of labels in domain name. Used for domain name comparisons.
     121    mDNSBool            terminal;       // If true and test passes, then no other QueryStats on the list should be visited.
    107122};
    108123
    109 check_compile_time(countof(kQueryStatsDomains) == 9);
     124check_compile_time(sizeof(QueryStats) <= 64);
    110125
    111126// DNSHist contains the per domain per network type histogram data that goes in a DNSDomainStats protobuf message. See
     
    165180check_compile_time(countof_field(DNSHist, negResponseLatencyBins)      == (countof(kResponseLatencyMsLimits) + 1));
    166181
    167 typedef struct
     182struct DNSHistSet
    168183{
    169184    DNSHist *       histA;      // Histogram data for queries for A resource records.
    170185    DNSHist *       histAAAA;   // Histogram data for queries for AAAA resource records.
    171 
    172 }   DNSHistSet;
    173 
    174 typedef struct DNSDomainStats       DNSDomainStats;
    175 struct DNSDomainStats
    176 {
    177     DNSDomainStats *        next;           // Pointer to next domain stats in list.
    178     const Domain *          domain;         // Domain for which these stats are collected.
    179     DNSHistSet *            nonCellular;    // Query stats for queries sent over non-cellular interfaces.
    180     DNSHistSet *            cellular;       // Query stats for queries sent over cellular interfaces.
    181186};
    182187
    183 check_compile_time(sizeof(struct DNSDomainStats) <= 32);
    184 
    185 static const Domain     kResolveStatsDomains[] =
    186 {
    187     { "apple.com.",     (domainname *)"\x5" "apple"    "\x3" "com", 2 },
    188     { "icloud.com.",    (domainname *)"\x6" "icloud"   "\x3" "com", 2 },
    189     { "mzstatic.com.",  (domainname *)"\x8" "mzstatic" "\x3" "com", 2 },
    190     { "me.com.",        (domainname *)"\x2" "me"       "\x3" "com", 2 },
     188typedef struct
     189{
     190    const char *        domainStr;
     191    const char *        altDomainStr;
     192    QueryNameTest_f     test;
     193    mDNSBool            terminal;
     194
     195}   QueryStatsArgs;
     196
     197// Data structures for resolve stats.
     198
     199static const char * const       kResolveStatsDomains[] =
     200{
     201    "apple.com.",
     202    "icloud.com.",
     203    "mzstatic.com.",
     204    "me.com."
    191205};
    192206
     
    203217{
    204218    ResolveStatsDomain *        next;           // Next domain object in list.
     219    const char *                domainStr;
     220    uint8_t *                   domain;         // Domain for which these stats are collected.
     221    int                         labelCount;     // Number of labels in domain name. Used for domain name comparisons.
    205222    ResolveStatsHostname *      hostnameList;   // List of hostname objects in this domain.
    206     const Domain *              domainInfo;     // Pointer to domain info.
    207223};
     224
     225check_compile_time(sizeof(ResolveStatsDomain) <= 40);
    208226
    209227struct ResolveStatsHostname
     
    291309}   Response;
    292310
    293 //===========================================================================================================================
    294 //  Globals
    295 //===========================================================================================================================
    296 
    297 static DNSDomainStats *             gDomainStatsList            = NULL;
    298 static ResolveStatsDomain *         gResolveStatsList           = NULL;
    299 static ResolveStatsDNSServer *      gResolveStatsServerList     = NULL;
    300 static unsigned int                 gResolveStatsNextServerID   = 0;
    301 static int                          gResolveStatsObjCount       = 0;
    302 static AWDServerConnection *        gAWDServerConnection        = nil;
     311// Data structures for DNS message size stats.
     312
     313#define kQuerySizeBinWidth      16
     314#define kQuerySizeBinMax        512
     315#define kQuerySizeBinCount      ((kQuerySizeBinMax / kQuerySizeBinWidth) + 1)
     316
     317check_compile_time(kQuerySizeBinWidth > 0);
     318check_compile_time(kQuerySizeBinCount > 0);
     319check_compile_time((kQuerySizeBinMax % kQuerySizeBinWidth) == 0);
     320
     321#define kResponseSizeBinWidth       16
     322#define kResponseSizeBinMax         512
     323#define kResponseSizeBinCount       ((kResponseSizeBinMax / kResponseSizeBinWidth) + 1)
     324
     325check_compile_time(kResponseSizeBinWidth > 0);
     326check_compile_time(kResponseSizeBinCount > 0);
     327check_compile_time((kResponseSizeBinMax % kResponseSizeBinWidth) == 0);
     328
     329typedef struct
     330{
     331    uint16_t    querySizeBins[kQuerySizeBinCount];
     332    uint16_t    responseSizeBins[kResponseSizeBinCount];
     333
     334}   DNSMessageSizeStats;
     335
     336check_compile_time(sizeof(DNSMessageSizeStats) <= 132);
    303337
    304338//===========================================================================================================================
     
    306340//===========================================================================================================================
    307341
    308 mDNSlocal mStatus   DNSDomainStatsCreate(const Domain *inDomain, DNSDomainStats **outStats);
    309 mDNSlocal void      DNSDomainStatsFree(DNSDomainStats *inStats);
    310 mDNSlocal void      DNSDomainStatsFreeList(DNSDomainStats *inList);
    311 mDNSlocal mStatus   DNSDomainStatsUpdate(DNSDomainStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
    312 
    313 mDNSlocal mStatus   ResolveStatsDomainCreate(const Domain *inDomain, ResolveStatsDomain **outDomain);
     342// Query stats
     343
     344mDNSlocal mStatus       QueryStatsCreate(const char *inDomainStr, const char *inAltDomainStr, QueryNameTest_f inTest, mDNSBool inTerminal, QueryStats **outStats);
     345mDNSlocal void          QueryStatsFree(QueryStats *inStats);
     346mDNSlocal void          QueryStatsFreeList(QueryStats *inList);
     347mDNSlocal mStatus       QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
     348mDNSlocal const char *  QueryStatsGetDomainString(const QueryStats *inStats);
     349mDNSlocal mDNSBool      QueryStatsDomainTest(const QueryStats *inStats, const domainname *inQueryName);
     350mDNSlocal mDNSBool      QueryStatsHostnameTest(const QueryStats *inStats, const domainname *inQueryName);
     351mDNSlocal mDNSBool      QueryStatsContentiCloudTest(const QueryStats *inStats, const domainname *inQueryName);
     352mDNSlocal mDNSBool      QueryStatsCourierPushTest(const QueryStats *inStats, const domainname *inQueryName);
     353
     354// Resolve stats
     355
     356mDNSlocal mStatus   ResolveStatsDomainCreate(const char *inDomainStr, ResolveStatsDomain **outDomain);
    314357mDNSlocal void      ResolveStatsDomainFree(ResolveStatsDomain *inDomain);
    315358mDNSlocal mStatus   ResolveStatsDomainUpdate(ResolveStatsDomain *inDomain, const domainname *inHostname, const Response *inResp, const mDNSAddr *inDNSAddr, mDNSBool inForCell);
     
    335378mDNSlocal mStatus   ResolveStatsGetServerID(const mDNSAddr *inServerAddr, mDNSBool inForCell, uint8_t *outServerID);
    336379
    337 mDNSlocal mStatus   CreateDomainStatsList(DNSDomainStats **outList);
     380// DNS message size stats
     381
     382mDNSlocal mStatus   DNSMessageSizeStatsCreate(DNSMessageSizeStats **outStats);
     383mDNSlocal void      DNSMessageSizeStatsFree(DNSMessageSizeStats *inStats);
     384
     385mDNSlocal mStatus   CreateQueryStatsList(QueryStats **outList);
    338386mDNSlocal mStatus   CreateResolveStatsList(ResolveStatsDomain **outList);
    339387mDNSlocal void      FreeResolveStatsList(ResolveStatsDomain *inList);
     
    342390mDNSlocal mStatus   SubmitAWDMetricQueryStats(void);
    343391mDNSlocal mStatus   SubmitAWDMetricResolveStats(void);
     392mDNSlocal mStatus   SubmitAWDMetricDNSMessageSizeStats(void);
    344393mDNSlocal mStatus   CreateAWDDNSDomainStats(DNSHist *inHist, const char *inDomain, mDNSBool inForCell, AWDDNSDomainStats_RecordType inType, AWDDNSDomainStats **outStats);
    345 mDNSlocal mStatus   AddAWDDNSDomainStats(AWDMDNSResponderDNSStatistics *inMetric, DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell);
    346394mDNSlocal void      LogDNSHistSet(const DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell);
    347395mDNSlocal void      LogDNSHist(const DNSHist *inHist, const char *inDomain, mDNSBool inForCell, const char *inType);
    348396mDNSlocal void      LogDNSHistSendCounts(const uint16_t inSendCountBins[kQueryStatsSendCountBinCount]);
    349397mDNSlocal void      LogDNSHistLatencies(const uint16_t inLatencyBins[kQueryStatsLatencyBinCount]);
    350 #if (METRICS_VALIDATE_DNS_STATS_DOMAINS)
    351 mDNSlocal void      ValidateDNSStatsDomains(void);
    352 #endif
     398mDNSlocal void      LogDNSMessageSizeStats(const uint16_t *inBins, size_t inBinCount, unsigned int inBinWidth);
     399
     400mDNSlocal size_t    CopyHistogramBins(uint32_t *inDstBins, uint16_t *inSrcBins, size_t inBinCount);
     401
     402//===========================================================================================================================
     403//  Globals
     404//===========================================================================================================================
     405
     406static AWDServerConnection *        gAWDServerConnection        = nil;
     407static QueryStats *                 gQueryStatsList             = NULL;
     408static ResolveStatsDomain *         gResolveStatsList           = NULL;
     409static ResolveStatsDNSServer *      gResolveStatsServerList     = NULL;
     410static unsigned int                 gResolveStatsNextServerID   = 0;
     411static int                          gResolveStatsObjCount       = 0;
     412static DNSMessageSizeStats *        gDNSMessageSizeStats        = NULL;
     413
     414// Important: Do not add to this list without getting privacy approval. See <rdar://problem/24155761&26397203&34763471>.
     415
     416static const QueryStatsArgs     kQueryStatsArgs[] =
     417{
     418    { ".",                      NULL,                               QueryStatsDomainTest,           mDNSfalse },
     419    { "",                       "alt:*-courier.push.apple.com.",    QueryStatsCourierPushTest,      mDNSfalse },
     420    { "apple.com.",             NULL,                               QueryStatsDomainTest,           mDNStrue  },
     421    { "gateway.icloud.com.",    "alt:gateway.icloud.com",           QueryStatsHostnameTest,         mDNSfalse },
     422    { "",                       "alt:*-content.icloud.com.",        QueryStatsContentiCloudTest,    mDNSfalse },
     423    { "icloud.com.",            NULL,                               QueryStatsDomainTest,           mDNStrue  },
     424    { "mzstatic.com.",          NULL,                               QueryStatsDomainTest,           mDNStrue  },
     425    { "google.com.",            NULL,                               QueryStatsDomainTest,           mDNStrue  },
     426    { "baidu.com.",             NULL,                               QueryStatsDomainTest,           mDNStrue  },
     427    { "yahoo.com.",             NULL,                               QueryStatsDomainTest,           mDNStrue  },
     428    { "qq.com.",                NULL,                               QueryStatsDomainTest,           mDNStrue  }
     429};
     430
     431check_compile_time(countof(kQueryStatsArgs) == 11);
    353432
    354433//===========================================================================================================================
     
    358437mStatus MetricsInit(void)
    359438{
    360 #if (METRICS_VALIDATE_DNS_STATS_DOMAINS)
    361     ValidateDNSStatsDomains();
    362 #endif
    363 
    364439    @autoreleasepool
    365440    {
     
    390465                }
    391466                forIdentifier: (UInt32)AWDMetricId_MDNSResponder_ServicesStats];
     467
     468            [gAWDServerConnection
     469                registerQueriableMetricCallback: ^(UInt32 inMetricID)
     470                {
     471                    SubmitAWDMetric(inMetricID);
     472                }
     473                forIdentifier: (UInt32)AWDMetricId_MDNSResponder_DNSMessageSizeStats];
    392474        }
    393475        else
     
    399481    if( gAWDServerConnection )
    400482    {
    401         CreateDomainStatsList(&gDomainStatsList);
     483        CreateQueryStatsList(&gQueryStatsList);
    402484        CreateResolveStatsList(&gResolveStatsList);
     485        DNSMessageSizeStatsCreate(&gDNSMessageSizeStats);
    403486    }
    404487
     
    407490
    408491//===========================================================================================================================
    409 //  MetricsUpdateUDNSQueryStats
    410 //===========================================================================================================================
    411 
    412 mDNSexport void MetricsUpdateUDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
    413 {
    414     DNSDomainStats *        stats;
    415     int                     queryLabelCount;
    416     const domainname *      queryParentDomain;
    417     mDNSBool                isQueryInDomain;
    418     int                     skipCount;
    419     int                     skipCountLast = -1;
     492//  MetricsUpdateDNSQueryStats
     493//===========================================================================================================================
     494
     495mDNSexport void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
     496{
     497    QueryStats *        stats;
     498    mDNSBool            match;
    420499
    421500    require_quiet(gAWDServerConnection, exit);
    422501    require_quiet((inType == kDNSType_A) || (inType == kDNSType_AAAA), exit);
    423502
    424     queryLabelCount = CountLabels(inQueryName);
    425 
    426     for (stats = gDomainStatsList; stats; stats = stats->next)
    427     {
    428         isQueryInDomain = mDNSfalse;
    429         if (strcmp(stats->domain->cstr, ".") == 0)
    430         {
    431             // All queries are in the root domain.
    432             isQueryInDomain = mDNStrue;
    433         }
    434         else
    435         {
    436             skipCount = queryLabelCount - stats->domain->labelCount;
    437             if (skipCount >= 0)
    438             {
    439                 if (skipCount != skipCountLast)
    440                 {
    441                     queryParentDomain = SkipLeadingLabels(inQueryName, skipCount);
    442                     skipCountLast = skipCount;
    443                 }
    444                 isQueryInDomain = SameDomainName(queryParentDomain, stats->domain->name);
    445             }
    446         }
    447 
    448         if (isQueryInDomain)
    449         {
    450             DNSDomainStatsUpdate(stats, inType, inRR, inSendCount, inLatencyMs, inForCell);
     503    for (stats = gQueryStatsList; stats; stats = stats->next)
     504    {
     505        match = stats->test(stats, inQueryName);
     506        if (match)
     507        {
     508            QueryStatsUpdate(stats, inType, inRR, inSendCount, inLatencyMs, inForCell);
     509            if (stats->terminal) break;
    451510        }
    452511    }
     
    457516
    458517//===========================================================================================================================
    459 //  MetricsUpdateUDNSResolveStats
    460 //===========================================================================================================================
    461 
    462 mDNSexport void MetricsUpdateUDNSResolveStats(const domainname *inQueryName, const ResourceRecord *inRR, mDNSBool inForCell)
    463 {
    464     ResolveStatsDomain *        domain;
     518//  MetricsUpdateDNSResolveStats
     519//===========================================================================================================================
     520
     521mDNSexport void MetricsUpdateDNSResolveStats(const domainname *inQueryName, const ResourceRecord *inRR, mDNSBool inForCell)
     522{
     523    ResolveStatsDomain *        domainStats;
    465524    domainname                  hostname;
    466525    size_t                      hostnameLen;
     
    478537    queryLabelCount = CountLabels(inQueryName);
    479538
    480     for (domain = gResolveStatsList; domain; domain = domain->next)
     539    for (domainStats = gResolveStatsList; domainStats; domainStats = domainStats->next)
    481540    {
    482541        isQueryInDomain = mDNSfalse;
    483         skipCount = queryLabelCount - domain->domainInfo->labelCount;
     542        skipCount = queryLabelCount - domainStats->labelCount;
    484543        if (skipCount >= 0)
    485544        {
     
    489548                skipCountLast = skipCount;
    490549            }
    491             isQueryInDomain = SameDomainName(queryParentDomain, domain->domainInfo->name);
     550            isQueryInDomain = SameDomainName(queryParentDomain, (const domainname *)domainStats->domain);
    492551        }
    493552        if (!isQueryInDomain) continue;
     
    509568            response.data = (inRR->rrtype == kDNSType_A) ? inRR->rdata->u.ipv4.b : inRR->rdata->u.ipv6.b;
    510569        }
    511         ResolveStatsDomainUpdate(domain, &hostname, &response, &inRR->rDNSServer->addr, inForCell);
     570        ResolveStatsDomainUpdate(domainStats, &hostname, &response, &inRR->rDNSServer->addr, inForCell);
    512571    }
    513572
     
    517576
    518577//===========================================================================================================================
     578//  MetricsUpdateDNSQuerySize
     579//===========================================================================================================================
     580
     581mDNSlocal void UpdateMessageSizeCounts(uint16_t *inBins, size_t inBinCount, unsigned int inBinWidth, uint32_t inSize);
     582
     583mDNSexport void MetricsUpdateDNSQuerySize(mDNSu32 inSize)
     584{
     585    if (!gDNSMessageSizeStats) return;
     586    UpdateMessageSizeCounts(gDNSMessageSizeStats->querySizeBins, kQuerySizeBinCount, kQuerySizeBinWidth, inSize);
     587}
     588
     589mDNSlocal void UpdateMessageSizeCounts(uint16_t *inBins, size_t inBinCount, unsigned int inBinWidth, uint32_t inSize)
     590{
     591    size_t      i;
     592
     593    if (inSize == 0) return;
     594    i = (inSize - 1) / inBinWidth;
     595    if (i >= inBinCount) i = inBinCount - 1;
     596    increment_saturate(inBins[i], UINT16_MAX);
     597}
     598
     599//===========================================================================================================================
     600//  MetricsUpdateDNSResponseSize
     601//===========================================================================================================================
     602
     603mDNSexport void MetricsUpdateDNSResponseSize(mDNSu32 inSize)
     604{
     605    if (!gDNSMessageSizeStats) return;
     606    UpdateMessageSizeCounts(gDNSMessageSizeStats->responseSizeBins, kResponseSizeBinCount, kResponseSizeBinWidth, inSize);
     607}
     608
     609//===========================================================================================================================
    519610//  LogMetrics
    520611//===========================================================================================================================
     
    522613mDNSexport void LogMetrics(void)
    523614{
    524     DNSDomainStats *                    stats;
     615    QueryStats *                        stats;
    525616    const ResolveStatsDomain *          domain;
    526617    const ResolveStatsHostname *        hostname;
     
    539630    LogMsgNoIdent("---- DNS query stats by domain -----");
    540631
    541     for (stats = gDomainStatsList; stats; stats = stats->next)
     632    for (stats = gQueryStatsList; stats; stats = stats->next)
    542633    {
    543634        if (!stats->nonCellular && !stats->cellular)
    544635        {
    545             LogMsgNoIdent("No data for %s", stats->domain->cstr);
     636            LogMsgNoIdent("No data for %s", QueryStatsGetDomainString(stats));
    546637            continue;
    547638        }
    548         if (stats->nonCellular) LogDNSHistSet(stats->nonCellular, stats->domain->cstr, mDNSfalse);
    549         if (stats->cellular)    LogDNSHistSet(stats->cellular,    stats->domain->cstr, mDNStrue);
     639        if (stats->nonCellular) LogDNSHistSet(stats->nonCellular, QueryStatsGetDomainString(stats), mDNSfalse);
     640        if (stats->cellular)    LogDNSHistSet(stats->cellular,    QueryStatsGetDomainString(stats), mDNStrue);
    550641    }
    551642
     
    566657        hostnameObjCount += hostnameCount;
    567658
    568         LogMsgNoIdent("%##s (%d hostname%s)", domain->domainInfo->name, hostnameCount, (hostnameCount == 1) ? "" : "s");
     659        LogMsgNoIdent("%s (%d hostname%s)", domain->domainStr, hostnameCount, (hostnameCount == 1) ? "" : "s");
    569660
    570661        for (hostname = domain->hostnameList; hostname; hostname = hostname->next)
     
    623714    LogMsgNoIdent("Total object count: %3d (server %d hostname %d address %d)",
    624715        serverObjCount + hostnameObjCount + addrObjCount, serverObjCount, hostnameObjCount, addrObjCount);
    625    
     716
    626717    LogMsgNoIdent("---- Num of Services Registered -----");
    627718    LogMsgNoIdent("Current_number_of_services_registered :[%d], Max_number_of_services_registered :[%d]",
    628719                  curr_num_regservices, max_num_regservices);
    629 }
    630 
    631 //===========================================================================================================================
    632 //  DNSDomainStatsCreate
    633 //===========================================================================================================================
    634 
    635 mDNSlocal mStatus DNSDomainStatsCreate(const Domain *inDomain, DNSDomainStats **outStats)
    636 {
    637     mStatus                 err;
    638     DNSDomainStats *        obj;
    639 
    640     obj = (DNSDomainStats *)calloc(1, sizeof(*obj));
     720
     721    if (gDNSMessageSizeStats)
     722    {
     723        LogMsgNoIdent("---- DNS query size stats ---");
     724        LogDNSMessageSizeStats(gDNSMessageSizeStats->querySizeBins, kQuerySizeBinCount, kQuerySizeBinWidth);
     725
     726        LogMsgNoIdent("-- DNS response size stats --");
     727        LogDNSMessageSizeStats(gDNSMessageSizeStats->responseSizeBins, kResponseSizeBinCount, kResponseSizeBinWidth);
     728    }
     729    else
     730    {
     731        LogMsgNoIdent("No DNS message size stats.");
     732    }
     733}
     734
     735//===========================================================================================================================
     736//  QueryStatsCreate
     737//===========================================================================================================================
     738
     739mDNSlocal mStatus StringToDomainName(const char *inString, uint8_t **outDomainName);
     740
     741mDNSlocal mStatus QueryStatsCreate(const char *inDomainStr, const char *inAltDomainStr, QueryNameTest_f inTest, mDNSBool inTerminal, QueryStats **outStats)
     742{
     743    mStatus             err;
     744    QueryStats *        obj;
     745
     746    obj = (QueryStats *)calloc(1, sizeof(*obj));
    641747    require_action_quiet(obj, exit, err = mStatus_NoMemoryErr);
    642748
    643     obj->domain = inDomain;
     749    obj->domainStr = inDomainStr;
     750    err = StringToDomainName(obj->domainStr, &obj->domain);
     751    require_noerr_quiet(err, exit);
     752
     753    obj->altDomainStr   = inAltDomainStr;
     754    obj->test           = inTest;
     755    obj->labelCount     = CountLabels((const domainname *)obj->domain);
     756    obj->terminal       = inTerminal;
    644757
    645758    *outStats = obj;
     759    obj = NULL;
    646760    err = mStatus_NoError;
    647761
    648762exit:
     763    if (obj) QueryStatsFree(obj);
    649764    return (err);
    650765}
    651766
    652 //===========================================================================================================================
    653 //  DNSDomainStatsFree
    654 //===========================================================================================================================
    655 
    656 mDNSlocal void DNSDomainStatsFree(DNSDomainStats *inStats)
    657 {
     767mDNSlocal mStatus StringToDomainName(const char *inString, uint8_t **outDomainName)
     768{
     769    mStatus             err;
     770    uint8_t *           domainPtr = NULL;
     771    size_t              domainLen;
     772    const mDNSu8 *      ptr;
     773    domainname          domain;
     774
     775    if (strcmp(inString, ".") == 0)
     776    {
     777        domain.c[0] = 0;
     778    }
     779    else
     780    {
     781        ptr = MakeDomainNameFromDNSNameString(&domain, inString);
     782        require_action_quiet(ptr, exit, err = mStatus_BadParamErr);
     783    }
     784    domainLen = DomainNameLength(&domain);
     785
     786    domainPtr = (uint8_t *)malloc(domainLen);
     787    require_action_quiet(domainPtr, exit, err = mStatus_NoMemoryErr);
     788
     789    memcpy(domainPtr, domain.c, domainLen);
     790
     791    *outDomainName = domainPtr;
     792    domainPtr = NULL;
     793    err = mStatus_NoError;
     794
     795exit:
     796    return(err);
     797}
     798
     799//===========================================================================================================================
     800//  QueryStatsFree
     801//===========================================================================================================================
     802
     803mDNSlocal void QueryStatsFree(QueryStats *inStats)
     804{
     805    ForgetMem(&inStats->domain);
    658806    if (inStats->nonCellular)
    659807    {
     
    674822
    675823//===========================================================================================================================
    676 //  DNSDomainStatsFreeList
    677 //===========================================================================================================================
    678 
    679 mDNSlocal void DNSDomainStatsFreeList(DNSDomainStats *inList)
    680 {
    681     DNSDomainStats *        stats;
     824//  QueryStatsFreeList
     825//===========================================================================================================================
     826
     827mDNSlocal void QueryStatsFreeList(QueryStats *inList)
     828{
     829    QueryStats *        stats;
    682830
    683831    while ((stats = inList) != NULL)
    684832    {
    685833        inList = stats->next;
    686         DNSDomainStatsFree(stats);
    687     }
    688 }
    689 
    690 //===========================================================================================================================
    691 //  DNSDomainStatsUpdate
    692 //===========================================================================================================================
    693 
    694 mDNSlocal mStatus DNSDomainStatsUpdate(DNSDomainStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
     834        QueryStatsFree(stats);
     835    }
     836}
     837
     838//===========================================================================================================================
     839//  QueryStatsUpdate
     840//===========================================================================================================================
     841
     842mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
    695843{
    696844    mStatus             err;
     
    752900
    753901//===========================================================================================================================
     902//  QueryStatsGetDomainString
     903//===========================================================================================================================
     904
     905mDNSlocal const char * QueryStatsGetDomainString(const QueryStats *inStats)
     906{
     907    return (inStats->altDomainStr ? inStats->altDomainStr : inStats->domainStr);
     908}
     909
     910//===========================================================================================================================
     911//  QueryStatsDomainTest
     912//===========================================================================================================================
     913
     914mDNSlocal mDNSBool QueryStatsDomainTest(const QueryStats *inStats, const domainname *inQueryName)
     915{
     916    const domainname *      parentDomain;
     917    int                     labelCount;
     918
     919    if (inStats->domain[0] == 0) return (mDNStrue);
     920
     921    labelCount = CountLabels(inQueryName);
     922    if (labelCount < inStats->labelCount) return (mDNSfalse);
     923
     924    parentDomain = SkipLeadingLabels(inQueryName, labelCount - inStats->labelCount);
     925    return (SameDomainName(parentDomain, (const domainname *)inStats->domain));
     926}
     927
     928//===========================================================================================================================
     929//  QueryStatsHostnameTest
     930//===========================================================================================================================
     931
     932mDNSlocal mDNSBool QueryStatsHostnameTest(const QueryStats *inStats, const domainname *inQueryName)
     933{
     934    return (SameDomainName(inQueryName, (const domainname *)inStats->domain));
     935}
     936
     937//===========================================================================================================================
     938//  QueryStatsContentiCloudTest
     939//===========================================================================================================================
     940
     941mDNSlocal const uint8_t *LocateLabelSuffix(const uint8_t *inLabel, const uint8_t *inSuffixPtr, size_t inSuffixLen);
     942
     943#define kContentSuffixStr       "-content"
     944
     945mDNSlocal mDNSBool QueryStatsContentiCloudTest(const QueryStats *inStats, const domainname *inQueryName)
     946{
     947    const mDNSu8 * const    firstLabel = inQueryName->c;
     948    const uint8_t *         suffix;
     949    const domainname *      parentDomain;
     950    int                     labelCount;
     951
     952    (void) inStats; // Unused.
     953
     954    labelCount = CountLabels(inQueryName);
     955    if (labelCount != 3) return (mDNSfalse);
     956
     957    suffix = LocateLabelSuffix(firstLabel, (const uint8_t *)kContentSuffixStr, sizeof_string(kContentSuffixStr));
     958    if (suffix && (suffix > &firstLabel[1]))
     959    {
     960        parentDomain = SkipLeadingLabels(inQueryName, 1);
     961        if (SameDomainName(parentDomain, (const domainname *)"\x6" "icloud" "\x3" "com"))
     962        {
     963            return (mDNStrue);
     964        }
     965    }
     966
     967    return (mDNSfalse);
     968}
     969
     970mDNSlocal const uint8_t *LocateLabelSuffix(const uint8_t *inLabel, const uint8_t *inSuffixPtr, size_t inSuffixLen)
     971{
     972    const uint8_t *     ptr;
     973    const uint8_t *     lp;
     974    const uint8_t *     sp;
     975    size_t              len;
     976    const size_t        labelLen = inLabel[0];
     977
     978    if (labelLen < inSuffixLen) return (NULL);
     979
     980    ptr = &inLabel[1 + labelLen - inSuffixLen];
     981    lp  = ptr;
     982    sp  = inSuffixPtr;
     983    for (len = inSuffixLen; len > 0; --len)
     984    {
     985        if (tolower(*lp) != tolower(*sp)) return (NULL);
     986        ++lp;
     987        ++sp;
     988    }
     989
     990    return (ptr);
     991}
     992
     993//===========================================================================================================================
     994//  QueryStatsCourierPushTest
     995//===========================================================================================================================
     996
     997#define kCourierSuffixStr       "-courier"
     998
     999mDNSlocal mDNSBool QueryStatsCourierPushTest(const QueryStats *inStats, const domainname *inQueryName)
     1000{
     1001    const mDNSu8 * const    firstLabel = inQueryName->c;
     1002    const uint8_t *         suffix;
     1003    const uint8_t *         ptr;
     1004    const domainname *      parentDomain;
     1005    int                     labelCount;
     1006
     1007    (void) inStats; // Unused.
     1008
     1009    labelCount = CountLabels(inQueryName);
     1010    if (labelCount != 4) return (mDNSfalse);
     1011
     1012    suffix = LocateLabelSuffix(firstLabel, (const mDNSu8 *)kCourierSuffixStr, sizeof_string(kCourierSuffixStr));
     1013    if (suffix && (suffix > &firstLabel[1]))
     1014    {
     1015        for (ptr = &firstLabel[1]; ptr < suffix; ++ptr)
     1016        {
     1017            if (!isdigit(*ptr)) break;
     1018        }
     1019        if (ptr == suffix)
     1020        {
     1021            parentDomain = SkipLeadingLabels(inQueryName, 1);
     1022            if (SameDomainName(parentDomain, (const domainname *)"\x4" "push" "\x5" "apple" "\x3" "com"))
     1023            {
     1024                return (mDNStrue);
     1025            }
     1026        }
     1027    }
     1028
     1029    return (mDNSfalse);
     1030}
     1031
     1032//===========================================================================================================================
    7541033//  ResolveStatsDomainCreate
    7551034//===========================================================================================================================
    7561035
    757 mDNSlocal mStatus ResolveStatsDomainCreate(const Domain *inDomain, ResolveStatsDomain **outDomain)
     1036mDNSlocal mStatus ResolveStatsDomainCreate(const char *inDomainStr, ResolveStatsDomain **outDomain)
    7581037{
    7591038    mStatus                     err;
     
    7631042    require_action_quiet(obj, exit, err = mStatus_NoMemoryErr);
    7641043
    765     obj->domainInfo = inDomain;
     1044    obj->domainStr = inDomainStr;
     1045    err = StringToDomainName(obj->domainStr, &obj->domain);
     1046    require_noerr_quiet(err, exit);
     1047
     1048    obj->labelCount = CountLabels((const domainname *)obj->domain);
    7661049
    7671050    *outDomain = obj;
     1051    obj = NULL;
    7681052    err = mStatus_NoError;
    7691053
    7701054exit:
     1055    if (obj) ResolveStatsDomainFree(obj);
    7711056    return (err);
    7721057}
     
    7801065    ResolveStatsHostname *      hostname;
    7811066
     1067    ForgetMem(&inDomain->domain);
    7821068    while ((hostname = inDomain->hostnameList) != NULL)
    7831069    {
     
    8631149    require_action_quiet(domain, exit, err = mStatus_UnknownErr);
    8641150
    865     name = [[NSString alloc] initWithUTF8String:inDomain->domainInfo->cstr];
     1151    name = [[NSString alloc] initWithUTF8String:inDomain->domainStr];
    8661152    require_action_quiet(name, exit, err = mStatus_UnknownErr);
    8671153
     
    13581644        gResolveStatsObjCount++;
    13591645
    1360         server->id   = gResolveStatsNextServerID++;
     1646        server->id   = (uint8_t)gResolveStatsNextServerID++;
    13611647        server->next = gResolveStatsServerList;
    13621648        gResolveStatsServerList = server;
     
    13771663
    13781664//===========================================================================================================================
    1379 //  CreateDomainStatsList
    1380 //===========================================================================================================================
    1381 
    1382 mDNSlocal mStatus CreateDomainStatsList(DNSDomainStats **outList)
    1383 {
    1384     mStatus                 err;
    1385     int                     i;
    1386     DNSDomainStats *        stats;
    1387     DNSDomainStats **       p;
    1388     DNSDomainStats *        list = NULL;
     1665//  DNSMessageSizeStatsCreate
     1666//===========================================================================================================================
     1667
     1668mDNSlocal mStatus DNSMessageSizeStatsCreate(DNSMessageSizeStats **outStats)
     1669{
     1670    mStatus                     err;
     1671    DNSMessageSizeStats *       stats;
     1672
     1673    stats = (DNSMessageSizeStats *)calloc(1, sizeof(*stats));
     1674    require_action_quiet(stats, exit, err = mStatus_NoMemoryErr);
     1675
     1676    *outStats = stats;
     1677    err = mStatus_NoError;
     1678
     1679exit:
     1680    return (err);
     1681}
     1682
     1683//===========================================================================================================================
     1684//  DNSMessageSizeStatsFree
     1685//===========================================================================================================================
     1686
     1687mDNSlocal void DNSMessageSizeStatsFree(DNSMessageSizeStats *inStats)
     1688{
     1689    free(inStats);
     1690}
     1691
     1692//===========================================================================================================================
     1693//  CreateQueryStatsList
     1694//===========================================================================================================================
     1695
     1696mDNSlocal mStatus CreateQueryStatsList(QueryStats **outList)
     1697{
     1698    mStatus                             err;
     1699    QueryStats **                       p;
     1700    QueryStats *                        stats;
     1701    const QueryStatsArgs *              args;
     1702    const QueryStatsArgs * const        end     = kQueryStatsArgs + countof(kQueryStatsArgs);
     1703    QueryStats *                        list    = NULL;
    13891704
    13901705    p = &list;
    1391     for (i = 0; i < (int)countof(kQueryStatsDomains); ++i)
    1392     {
    1393         err = DNSDomainStatsCreate(&kQueryStatsDomains[i], &stats);
     1706    for (args = kQueryStatsArgs; args < end; ++args)
     1707    {
     1708        err = QueryStatsCreate(args->domainStr, args->altDomainStr, args->test, args->terminal, &stats);
    13941709        require_noerr_quiet(err, exit);
    13951710
     
    14001715    *outList = list;
    14011716    list = NULL;
    1402 
    1403 exit:
    1404     DNSDomainStatsFreeList(list);
     1717    err = mStatus_NoError;
     1718
     1719exit:
     1720    QueryStatsFreeList(list);
    14051721    return (err);
    14061722}
     
    14131729{
    14141730    mStatus                     err;
    1415     int                         i;
     1731    unsigned int                i;
    14161732    ResolveStatsDomain *        domain;
    14171733    ResolveStatsDomain **       p;
     
    14191735
    14201736    p = &list;
    1421     for (i = 0; i < (int)countof(kResolveStatsDomains); ++i)
    1422     {
    1423         err = ResolveStatsDomainCreate(&kResolveStatsDomains[i], &domain);
     1737    for (i = 0; i < (unsigned int)countof(kResolveStatsDomains); ++i)
     1738    {
     1739        err = ResolveStatsDomainCreate(kResolveStatsDomains[i], &domain);
    14241740        require_noerr_quiet(err, exit);
    14251741
     
    14301746    *outList = list;
    14311747    list = NULL;
     1748    err = mStatus_NoError;
    14321749
    14331750exit:
     
    14921809            err = mStatus_NoError;
    14931810            break;
    1494            
     1811
     1812        case AWDMetricId_MDNSResponder_DNSMessageSizeStats:
     1813            err = SubmitAWDMetricDNSMessageSizeStats();
     1814            break;
     1815
    14951816        default:
    14961817            err = mStatus_UnsupportedErr;
     
    15061827//===========================================================================================================================
    15071828
     1829mDNSlocal mStatus   AddQueryStats(AWDMDNSResponderDNSStatistics *inMetric, const QueryStats *inStats);
     1830mDNSlocal mStatus   AddDNSHistSet(AWDMDNSResponderDNSStatistics *inMetric, DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell);
     1831
    15081832mDNSlocal mStatus SubmitAWDMetricQueryStats(void)
    15091833{
    15101834    mStatus                             err;
    15111835    BOOL                                success;
    1512     DNSDomainStats *                    stats;
    1513     DNSDomainStats *                    newDomainStatsList;
    1514     DNSDomainStats *                    domainStatsList = NULL;
    1515     AWDMetricContainer *                container       = nil;
    1516     AWDMDNSResponderDNSStatistics *     metric          = nil;
    1517 
    1518     err = CreateDomainStatsList(&newDomainStatsList);
    1519     require_noerr_quiet(err, exit);
     1836    QueryStats *                        stats;
     1837    QueryStats *                        statsList;
     1838    QueryStats *                        newStatsList;
     1839    AWDMetricContainer *                container   = nil;
     1840    AWDMDNSResponderDNSStatistics *     metric      = nil;
     1841
     1842    newStatsList = NULL;
     1843    CreateQueryStatsList(&newStatsList);
    15201844
    15211845    KQueueLock();
    1522     domainStatsList = gDomainStatsList;
    1523     gDomainStatsList = newDomainStatsList;
     1846    statsList       = gQueryStatsList;
     1847    gQueryStatsList = newStatsList;
    15241848    KQueueUnlock("SubmitAWDMetricQueryStats");
    15251849
     
    15301854    require_action_quiet(metric, exit, err = mStatus_UnknownErr);
    15311855
    1532     while ((stats = domainStatsList) != NULL)
    1533     {
    1534         if (stats->nonCellular)
    1535         {
    1536             err = AddAWDDNSDomainStats(metric, stats->nonCellular, stats->domain->cstr, mDNSfalse);
    1537             require_noerr_quiet(err, exit);
    1538         }
    1539         if (stats->cellular)
    1540         {
    1541             err = AddAWDDNSDomainStats(metric, stats->cellular, stats->domain->cstr, mDNStrue);
    1542             require_noerr_quiet(err, exit);
    1543         }
    1544         domainStatsList = stats->next;
    1545         DNSDomainStatsFree(stats);
     1856    while ((stats = statsList) != NULL)
     1857    {
     1858        err = AddQueryStats(metric, stats);
     1859        require_noerr_quiet(err, exit);
     1860
     1861        statsList = stats->next;
     1862        QueryStatsFree(stats);
    15461863    }
    15471864
    15481865    container.metric = metric;
    15491866    success = [gAWDServerConnection submitMetric:container];
    1550     LogMsg("SubmitAWDMetricQueryStats: metric submission %s.", success ? "succeeded" : "failed" );
     1867    LogMsg("SubmitAWDMetricQueryStats: metric submission %s.", success ? "succeeded" : "failed");
    15511868    err = success ? mStatus_NoError : mStatus_UnknownErr;
    15521869
     
    15541871    [metric release];
    15551872    [container release];
    1556     DNSDomainStatsFreeList(domainStatsList);
     1873    QueryStatsFreeList(statsList);
     1874    return (err);
     1875}
     1876
     1877mDNSlocal mStatus AddQueryStats(AWDMDNSResponderDNSStatistics *inMetric, const QueryStats *inStats)
     1878{
     1879    mStatus     err;
     1880
     1881    if (inStats->nonCellular)
     1882    {
     1883        err = AddDNSHistSet(inMetric, inStats->nonCellular, QueryStatsGetDomainString(inStats), mDNSfalse);
     1884        require_noerr_quiet(err, exit);
     1885    }
     1886    if (inStats->cellular)
     1887    {
     1888        err = AddDNSHistSet(inMetric, inStats->cellular, QueryStatsGetDomainString(inStats), mDNStrue);
     1889        require_noerr_quiet(err, exit);
     1890    }
     1891    err = mStatus_NoError;
     1892
     1893exit:
     1894    return (err);
     1895}
     1896
     1897mDNSlocal mStatus AddDNSHistSet(AWDMDNSResponderDNSStatistics *inMetric, DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell)
     1898{
     1899    mStatus                 err;
     1900    AWDDNSDomainStats *     awdStats;
     1901
     1902    if (inSet->histA)
     1903    {
     1904        err = CreateAWDDNSDomainStats(inSet->histA, inDomain, inForCell, AWDDNSDomainStats_RecordType_A, &awdStats);
     1905        require_noerr_quiet(err, exit);
     1906
     1907        [inMetric addStats:awdStats];
     1908        [awdStats release];
     1909    }
     1910    if (inSet->histAAAA)
     1911    {
     1912        err = CreateAWDDNSDomainStats(inSet->histAAAA, inDomain, inForCell, AWDDNSDomainStats_RecordType_AAAA, &awdStats);
     1913        require_noerr_quiet(err, exit);
     1914
     1915        [inMetric addStats:awdStats];
     1916        [awdStats release];
     1917    }
     1918    err = mStatus_NoError;
     1919
     1920exit:
    15571921    return (err);
    15581922}
     
    16201984    container.metric = metric;
    16211985    success = [gAWDServerConnection submitMetric:container];
    1622     LogMsg("SubmitAWDMetricResolveStats: metric submission %s.", success ? "succeeded" : "failed" );
     1986    LogMsg("SubmitAWDMetricResolveStats: metric submission %s.", success ? "succeeded" : "failed");
    16231987    err = success ? mStatus_NoError : mStatus_UnknownErr;
    16241988
     
    16321996
    16331997//===========================================================================================================================
     1998//  SubmitAWDMetricDNSMessageSizeStats
     1999//===========================================================================================================================
     2000
     2001mDNSlocal mStatus SubmitAWDMetricDNSMessageSizeStats(void)
     2002{
     2003    mStatus                                     err;
     2004    DNSMessageSizeStats *                       stats;
     2005    DNSMessageSizeStats *                       newStats;
     2006    AWDMetricContainer *                        container;
     2007    AWDMDNSResponderDNSMessageSizeStats *       metric = nil;
     2008    BOOL                                        success;
     2009
     2010    newStats = NULL;
     2011    DNSMessageSizeStatsCreate(&newStats);
     2012
     2013    KQueueLock();
     2014    stats                   = gDNSMessageSizeStats;
     2015    gDNSMessageSizeStats    = newStats;
     2016    KQueueUnlock("SubmitAWDMetricDNSMessageSizeStats");
     2017
     2018    container = [gAWDServerConnection newMetricContainerWithIdentifier:AWDMetricId_MDNSResponder_DNSMessageSizeStats];
     2019    require_action_quiet(container, exit, err = mStatus_UnknownErr);
     2020
     2021    metric = [[AWDMDNSResponderDNSMessageSizeStatsSoft alloc] init];
     2022    require_action_quiet(metric, exit, err = mStatus_UnknownErr);
     2023
     2024    if (stats)
     2025    {
     2026        size_t          binCount;
     2027        uint32_t        bins[Max(kQuerySizeBinCount, kResponseSizeBinCount)];
     2028
     2029        // Set query size counts.
     2030
     2031        binCount = CopyHistogramBins(bins, stats->querySizeBins, kQuerySizeBinCount);
     2032        [metric setQuerySizeCounts:bins count:(NSUInteger)binCount];
     2033
     2034        // Set response size counts.
     2035
     2036        binCount = CopyHistogramBins(bins, stats->responseSizeBins, kResponseSizeBinCount);
     2037        [metric setResponseSizeCounts:bins count:(NSUInteger)binCount];
     2038    }
     2039
     2040    container.metric = metric;
     2041    success = [gAWDServerConnection submitMetric:container];
     2042    LogMsg("SubmitAWDMetricDNSMessageSizeStats: metric submission %s.", success ? "succeeded" : "failed");
     2043    err = success ? mStatus_NoError : mStatus_UnknownErr;
     2044
     2045exit:
     2046    [metric release];
     2047    [container release];
     2048    if (stats) DNSMessageSizeStatsFree(stats);
     2049    return (err);
     2050}
     2051
     2052//===========================================================================================================================
    16342053//  CreateAWDDNSDomainStats
    16352054//===========================================================================================================================
     
    16402059    AWDDNSDomainStats *     awdStats    = nil;
    16412060    NSString *              domain      = nil;
     2061    size_t                  binCount;
    16422062    uint32_t                sendCountBins[kQueryStatsSendCountBinCount];
    16432063    uint32_t                latencyBins[kQueryStatsLatencyBinCount];
    1644     int                     i;
    1645     unsigned int            totalAnswered;
    1646     unsigned int            totalNegAnswered;
    1647     unsigned int            totalUnanswered;
    16482064
    16492065    awdStats = [[AWDDNSDomainStatsSoft alloc] init];
     
    16572073    awdStats.recordType  = inType;
    16582074
    1659     totalAnswered = 0;
    1660     for (i = 0; i < kQueryStatsSendCountBinCount; ++i)
    1661     {
    1662         sendCountBins[i] = inHist->answeredQuerySendCountBins[i];
    1663         totalAnswered   += inHist->answeredQuerySendCountBins[i];
    1664     }
    1665     [awdStats setAnsweredQuerySendCounts:sendCountBins count:kQueryStatsSendCountBinCount];
    1666 
    1667     totalNegAnswered = 0;
    1668     for (i = 0; i < kQueryStatsSendCountBinCount; ++i)
    1669     {
    1670         sendCountBins[i]  = inHist->negAnsweredQuerySendCountBins[i];
    1671         totalNegAnswered += inHist->negAnsweredQuerySendCountBins[i];
    1672     }
    1673     [awdStats setNegAnsweredQuerySendCounts:sendCountBins count:kQueryStatsSendCountBinCount];
    1674 
    1675     totalUnanswered = 0;
    1676     for (i = 0; i < kQueryStatsSendCountBinCount; ++i)
    1677     {
    1678         sendCountBins[i] = inHist->unansweredQuerySendCountBins[i];
    1679         totalUnanswered += inHist->unansweredQuerySendCountBins[i];
    1680     }
    1681     [awdStats setUnansweredQuerySendCounts:sendCountBins count:kQueryStatsSendCountBinCount];
    1682 
    1683     if (totalAnswered > inHist->answeredQuerySendCountBins[0])
    1684     {
    1685         for (i = 0; i < kQueryStatsLatencyBinCount; ++i)
    1686         {
    1687             latencyBins[i] = inHist->responseLatencyBins[i];
    1688         }
    1689         [awdStats setResponseLatencyMs:latencyBins count:kQueryStatsLatencyBinCount];
    1690     }
    1691 
    1692     if (totalNegAnswered > inHist->negAnsweredQuerySendCountBins[0])
    1693     {
    1694         for (i = 0; i < kQueryStatsLatencyBinCount; ++i)
    1695         {
    1696             latencyBins[i] = inHist->negResponseLatencyBins[i];
    1697         }
    1698         [awdStats setNegResponseLatencyMs:latencyBins count:kQueryStatsLatencyBinCount];
    1699     }
    1700 
    1701     if (totalUnanswered > 0)
    1702     {
    1703         for (i = 0; i < kQueryStatsLatencyBinCount; ++i)
    1704         {
    1705             latencyBins[i] = inHist->unansweredQueryDurationBins[i];
    1706         }
    1707         [awdStats setUnansweredQueryDurationMs:latencyBins count:kQueryStatsLatencyBinCount];
     2075    // Positively answered query send counts
     2076
     2077    binCount = CopyHistogramBins(sendCountBins, inHist->answeredQuerySendCountBins, kQueryStatsSendCountBinCount);
     2078    [awdStats setAnsweredQuerySendCounts:sendCountBins count:(NSUInteger)binCount];
     2079
     2080    // binCount > 1 means that at least one of the non-zero send count bins had a non-zero count, i.e., at least one query
     2081    // was sent out on the wire. In that case, include the associated latency bins as well.
     2082
     2083    if (binCount > 1)
     2084    {
     2085        binCount = CopyHistogramBins(latencyBins, inHist->responseLatencyBins, kQueryStatsLatencyBinCount);
     2086        [awdStats setResponseLatencyMs:latencyBins count:(NSUInteger)binCount];
     2087    }
     2088
     2089    // Negatively answered query send counts
     2090
     2091    binCount = CopyHistogramBins(sendCountBins, inHist->negAnsweredQuerySendCountBins, kQueryStatsSendCountBinCount);
     2092    [awdStats setNegAnsweredQuerySendCounts:sendCountBins count:(NSUInteger)binCount];
     2093
     2094    if (binCount > 1)
     2095    {
     2096        binCount = CopyHistogramBins(latencyBins, inHist->negResponseLatencyBins, kQueryStatsLatencyBinCount);
     2097        [awdStats setNegResponseLatencyMs:latencyBins count:(NSUInteger)binCount];
     2098    }
     2099
     2100    // Unanswered query send counts
     2101
     2102    binCount = CopyHistogramBins(sendCountBins, inHist->unansweredQuerySendCountBins, kQueryStatsSendCountBinCount);
     2103    [awdStats setUnansweredQuerySendCounts:sendCountBins count:(NSUInteger)binCount];
     2104
     2105    if (binCount > 1)
     2106    {
     2107        binCount = CopyHistogramBins(latencyBins, inHist->unansweredQueryDurationBins, kQueryStatsLatencyBinCount);
     2108        [awdStats setUnansweredQueryDurationMs:latencyBins count:(NSUInteger)binCount];
    17082109    }
    17092110
     
    17192120
    17202121//===========================================================================================================================
    1721 //  AddAWDDNSDomainStats
    1722 //===========================================================================================================================
    1723 
    1724 mDNSlocal mStatus AddAWDDNSDomainStats(AWDMDNSResponderDNSStatistics *inMetric, DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell)
    1725 {
    1726     mStatus                 err;
    1727     AWDDNSDomainStats *     awdStats;
    1728 
    1729     if (inSet->histA)
    1730     {
    1731         err = CreateAWDDNSDomainStats(inSet->histA, inDomain, inForCell, AWDDNSDomainStats_RecordType_A, &awdStats);
    1732         require_noerr_quiet(err, exit);
    1733 
    1734         [inMetric addStats:awdStats];
    1735         [awdStats release];
    1736     }
    1737     if (inSet->histAAAA)
    1738     {
    1739         err = CreateAWDDNSDomainStats(inSet->histAAAA, inDomain, inForCell, AWDDNSDomainStats_RecordType_AAAA, &awdStats);
    1740         require_noerr_quiet(err, exit);
    1741 
    1742         [inMetric addStats:awdStats];
    1743         [awdStats release];
    1744     }
    1745     err = mStatus_NoError;
    1746 
    1747 exit:
    1748     return (err);
    1749 }
    1750 
    1751 //===========================================================================================================================
    17522122//  LogDNSHistSet
    17532123//===========================================================================================================================
     
    17632133//===========================================================================================================================
    17642134
    1765 #define Percent(N, D)       ((N) * 100) / (D), (((N) * 10000) / (D)) % 100
     2135#define Percent(N, D)       (((N) * 100) / (D)), ((((N) * 10000) / (D)) % 100)
    17662136#define PercentFmt          "%3u.%02u"
    17672137#define LogStat(LABEL, COUNT, ACCUMULATOR, TOTAL) \
     
    19042274
    19052275//===========================================================================================================================
    1906 //  ValidateDNSStatsDomains
    1907 //===========================================================================================================================
    1908 
    1909 #if (METRICS_VALIDATE_DNS_STATS_DOMAINS)
    1910 #warning "Do not include ValidateDNSStatsDomains() in customer release!"
    1911 mDNSlocal void ValidateDNSStatsDomains(void)
    1912 {
    1913     int                 i;
    1914     const Domain *      domain;
    1915     mDNSu8 *            ptr;
    1916     domainname          domainNameExpected;
    1917     int                 labelCountExpected;
    1918     mDNSBool            domainNamesEqual;
    1919     mDNSBool            failed = mDNSfalse;
    1920 
    1921     for (i = 0; i < countof(kQueryStatsDomains); ++i)
    1922     {
    1923         domain = &kQueryStatsDomains[i];
    1924 
    1925         if (strcmp(domain->cstr, ".") == 0)
    1926         {
    1927             domainNameExpected.c[0] = 0;
    1928         }
    1929         else
    1930         {
    1931             ptr = MakeDomainNameFromDNSNameString(&domainNameExpected, domain->cstr);
    1932             if (!ptr)
     2276//  LogDNSMessageSizeStats
     2277//===========================================================================================================================
     2278
     2279mDNSlocal void LogDNSMessageSizeStats(const uint16_t *inBins, size_t inBinCount, unsigned int inBinWidth)
     2280{
     2281    size_t          i;
     2282    uint32_t        total;
     2283
     2284    total = 0;
     2285    for (i = 0; i < inBinCount; ++i)
     2286    {
     2287        total += inBins[i];
     2288    }
     2289
     2290    if (total > 0)
     2291    {
     2292        uint32_t            accumulator;
     2293        unsigned int        lower, upper;
     2294        char                label[16];
     2295
     2296        accumulator = 0;
     2297        upper      = 0;
     2298        for (i = 0; i < inBinCount; ++i)
     2299        {
     2300            accumulator += inBins[i];
     2301            lower = upper + 1;
     2302            if (i < (inBinCount - 1))
    19332303            {
    1934                 LogMsg("ValidateDNSStatsDomains: Failed to make domain name for \"%s\".", domain->cstr);
    1935                 failed = mDNStrue;
    1936                 goto exit;
     2304                upper += inBinWidth;
     2305                snprintf(label, sizeof(label), "%3u - %-3u", lower, upper);
    19372306            }
    1938         }
    1939 
    1940         domainNamesEqual = SameDomainName(domain->name, &domainNameExpected);
    1941         labelCountExpected = CountLabels(&domainNameExpected);
    1942         if (domainNamesEqual && (domain->labelCount == labelCountExpected))
    1943         {
    1944             LogMsg("ValidateDNSStatsDomains: \"%s\" passed.", domain->cstr);
    1945         }
    1946         else
    1947         {
    1948             if (!domainNamesEqual)
     2307            else
    19492308            {
    1950                 LogMsg("ValidateDNSStatsDomains: \"%s\" failed: incorrect domain name.", domain->cstr);
     2309                snprintf(label, sizeof(label), "%3u+     ", lower);
    19512310            }
    1952             if (domain->labelCount != labelCountExpected)
    1953             {
    1954                 LogMsg("ValidateDNSStatsDomains: \"%s\" failed: incorrect label count. Actual %d, expected %d.",
    1955                     domain->cstr, domain->labelCount, labelCountExpected);
    1956             }
    1957             failed = mDNStrue;
    1958         }
    1959     }
    1960 
    1961 exit:
    1962     if (failed) abort();
    1963 }
    1964 #endif
    1965 #endif // TARGET_OS_EMBEDDED
     2311            LogStat(label, inBins[i], accumulator, total);
     2312            if (accumulator == total) break;
     2313        }
     2314    }
     2315    else
     2316    {
     2317        LogMsgNoIdent("No data.");
     2318    }
     2319}
     2320
     2321//===========================================================================================================================
     2322//  CopyHistogramBins
     2323//
     2324//  Note: The return value is the size (in number of elements) of the smallest contiguous sub-array that contains the first
     2325//  bin and all bins with non-zero values.
     2326//===========================================================================================================================
     2327
     2328mDNSlocal size_t CopyHistogramBins(uint32_t *inDstBins, uint16_t *inSrcBins, size_t inBinCount)
     2329{
     2330    size_t      i;
     2331    size_t      minCount;
     2332
     2333    if (inBinCount == 0) return (0);
     2334
     2335    minCount = 1;
     2336    for (i = 0; i < inBinCount; ++i)
     2337    {
     2338        inDstBins[i] = inSrcBins[i];
     2339        if (inDstBins[i] > 0) minCount = i + 1;
     2340    }
     2341
     2342    return (minCount);
     2343}
     2344#endif // TARGET_OS_IOS
  • mDNSResponder/mDNSMacOSX/daemon.c

    r1e55d820 r2723609  
    4646#include "helper.h"
    4747
    48 #if TARGET_OS_EMBEDDED
     48#if AWD_METRICS
    4949#include "Metrics.h"
    5050#endif
     
    559559    }
    560560
    561 #if TARGET_OS_EMBEDDED
     561#if AWD_METRICS
    562562    LogMetrics();
    563563#endif
     
    13611361            if (events_found > kEventsToReadAtOnce || (events_found < 0 && errno != EINTR))
    13621362            {
     1363                const int kevent_errno = errno;
    13631364                // Not sure what to do here, our kqueue has failed us - this isn't ideal
    1364                 LogMsg("ERROR: KQueueLoop - kevent failed errno %d (%s)", errno, strerror(errno));
    1365                 exit(errno);
     1365                LogMsg("ERROR: KQueueLoop - kevent failed errno %d (%s)", kevent_errno, strerror(kevent_errno));
     1366                exit(kevent_errno);
    13661367            }
    13671368
     
    13911392    // Ask launchd for our socket
    13921393    int result = launch_activate_socket("Listeners", &launchd_fds, &launchd_fds_count);
    1393     if (result != 0) { LogMsg("launch_activate_socket() failed errno %d (%s)", errno, strerror(errno)); }
     1394    if (result != 0) { LogMsg("launch_activate_socket() failed error %d (%s)", result, strerror(result)); }
    13941395    return launchd_fds_count;
    13951396}
     
    16211622    // Create the kqueue, mutex and thread to support KQSockets
    16221623    KQueueFD = kqueue();
    1623     if (KQueueFD == -1) { LogMsg("kqueue() failed errno %d (%s)", errno, strerror(errno)); status = errno; goto exit; }
     1624    if (KQueueFD == -1)
     1625    {
     1626        const int kqueue_errno = errno;
     1627        LogMsg("kqueue() failed errno %d (%s)", kqueue_errno, strerror(kqueue_errno));
     1628        status = kqueue_errno;
     1629        goto exit;
     1630    }
    16241631
    16251632    i = pthread_mutex_init(&PlatformStorage.BigMutex, NULL);
    1626     if (i == -1) { LogMsg("pthread_mutex_init() failed errno %d (%s)", errno, strerror(errno)); status = errno; goto exit; }
     1633    if (i != 0) { LogMsg("pthread_mutex_init() failed error %d (%s)", i, strerror(i)); status = i; goto exit; }
    16271634
    16281635    int fdpair[2] = {0, 0};
    16291636    i = socketpair(AF_UNIX, SOCK_STREAM, 0, fdpair);
    1630     if (i == -1) { LogMsg("socketpair() failed errno %d (%s)", errno, strerror(errno)); status = errno; goto exit; }
     1637    if (i == -1)
     1638    {
     1639        const int socketpair_errno = errno;
     1640        LogMsg("socketpair() failed errno %d (%s)", socketpair_errno, strerror(socketpair_errno));
     1641        status = socketpair_errno;
     1642        goto exit;
     1643    }
    16311644
    16321645    // Socket pair returned us two identical sockets connected to each other
     
    16451658    SandboxProcess();
    16461659
    1647 #if TARGET_OS_EMBEDDED
     1660#if AWD_METRICS
    16481661    status = MetricsInit();
    16491662    if (status) { LogMsg("Daemon start: MetricsInit failed (%d)", status); }
     
    16671680    pthread_t KQueueThread;
    16681681    i = pthread_create(&KQueueThread, NULL, KQueueLoop, &mDNSStorage);
    1669     if (i == -1) { LogMsg("pthread_create() failed errno %d (%s)", errno, strerror(errno)); status = errno; goto exit; }
     1682    if (i != 0) { LogMsg("pthread_create() failed error %d (%s)", i, strerror(i)); status = i; goto exit; }
    16701683    if (status == 0)
    16711684    {
  • mDNSResponder/mDNSMacOSX/helper.c

    r1e55d820 r2723609  
    14571457    if (sysctlnametomib("net.inet.tcp.info", mib, &sz) == -1)
    14581458    {
    1459         os_log(log_handle, "RetrieveTCPInfo: sysctlnametomib failed %d, %s", errno, strerror(errno));
    1460         *err = errno;
     1459        const int sysctl_errno = errno;
     1460        os_log(log_handle, "RetrieveTCPInfo: sysctlnametomib failed %d, %s", sysctl_errno, strerror(sysctl_errno));
     1461        *err = sysctl_errno;
    14611462    }
    14621463    miblen = (unsigned int)sz;
     
    14641465    if (sysctl(mib, miblen, &ti, &len, &itpl, sizeof(struct info_tuple)) == -1)
    14651466    {
    1466         os_log(log_handle, "RetrieveTCPInfo: sysctl failed %d, %s", errno, strerror(errno));
    1467         *err = errno;
     1467        const int sysctl_errno = errno;
     1468        os_log(log_handle, "RetrieveTCPInfo: sysctl failed %d, %s", sysctl_errno, strerror(sysctl_errno));
     1469        *err = sysctl_errno;
    14681470    }
    14691471   
     
    17461748        else if (result < 0)
    17471749        {
    1748             os_log_debug(log_handle, "select returned %d errno %d %s", result, errno, strerror(errno));
    1749             if (errno != EINTR) break;
     1750            const int select_errno = errno;
     1751            os_log_debug(log_handle, "select returned %d errno %d %s", result, select_errno, strerror(select_errno));
     1752            if (select_errno != EINTR) break;
    17501753        }
    17511754    }
     
    18281831    if (0 > write(s, &msg, msg.hdr.rtm_msglen))
    18291832    {
    1830         int errno_ = errno;
     1833        const int errno_ = errno;
    18311834       
    18321835        os_log_info(log_handle,"write to routing socket failed: %s", strerror(errno_));
     
    18731876    if (0 > write(s, &msg, msg.hdr.rtm_msglen))
    18741877    {
    1875         int errno_ = errno;
     1878        const int errno_ = errno;
    18761879       
    18771880        os_log_debug(log_handle,"write to routing socket failed: %s", strerror(errno_));
  • mDNSResponder/mDNSMacOSX/mDNSMacOSX.c

    r1e55d820 r2723609  
    662662    int s = -1, err;
    663663    mStatus result = mStatus_NoError;
     664    int sendto_errno;
    664665
    665666    if (InterfaceID)
     
    737738            if (err < 0)
    738739            {
     740                const int setsockopt_errno = errno;
    739741                char name[IFNAMSIZ];
    740742                if (if_indextoname(info->scope_id, name) != NULL)
    741                     LogMsg("setsockopt - IPV6_MULTICAST_IF error %d errno %d (%s)", err, errno, strerror(errno));
     743                    LogMsg("setsockopt - IPV6_MULTICAST_IF error %d errno %d (%s)", err, setsockopt_errno, strerror(setsockopt_errno));
    742744                else
    743745                    LogInfo("setsockopt - IPV6_MUTLICAST_IF scopeid %d, not a valid interface", info->scope_id);
     
    780782
    781783    err = sendto(s, msg, (UInt8*)end - (UInt8*)msg, 0, (struct sockaddr *)&to, to.ss_len);
     784    sendto_errno = (err < 0) ? errno : 0;
    782785
    783786    // set traffic class back to default value
     
    789792        static int MessageCount = 0;
    790793        LogInfo("mDNSPlatformSendUDP -> sendto(%d) failed to send packet on InterfaceID %p %5s/%d to %#a:%d skt %d error %d errno %d (%s) %lu",
    791                 s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, errno, strerror(errno), (mDNSu32)(m->timenow));
     794                s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, sendto_errno, strerror(sendto_errno), (mDNSu32)(m->timenow));
    792795        if (!mDNSAddressIsAllDNSLinkGroup(dst))
    793796        {
    794             if (errno == EHOSTUNREACH) return(mStatus_HostUnreachErr);
    795             if (errno == EHOSTDOWN || errno == ENETDOWN || errno == ENETUNREACH) return(mStatus_TransientErr);
     797            if (sendto_errno == EHOSTUNREACH) return(mStatus_HostUnreachErr);
     798            if (sendto_errno == EHOSTDOWN || sendto_errno == ENETDOWN || sendto_errno == ENETUNREACH) return(mStatus_TransientErr);
    796799        }
    797800        // Don't report EHOSTUNREACH in the first three minutes after boot
    798801        // This is because mDNSResponder intentionally starts up early in the boot process (See <rdar://problem/3409090>)
    799802        // but this means that sometimes it starts before configd has finished setting up the multicast routing entries.
    800         if (errno == EHOSTUNREACH && (mDNSu32)(mDNSPlatformRawTime()) < (mDNSu32)(mDNSPlatformOneSecond * 180)) return(mStatus_TransientErr);
     803        if (sendto_errno == EHOSTUNREACH && (mDNSu32)(mDNSPlatformRawTime()) < (mDNSu32)(mDNSPlatformOneSecond * 180)) return(mStatus_TransientErr);
    801804        // Don't report EADDRNOTAVAIL ("Can't assign requested address") if we're in the middle of a network configuration change
    802         if (errno == EADDRNOTAVAIL && m->NetworkChanged) return(mStatus_TransientErr);
    803         if (errno == EHOSTUNREACH || errno == EADDRNOTAVAIL || errno == ENETDOWN)
     805        if (sendto_errno == EADDRNOTAVAIL && m->NetworkChanged) return(mStatus_TransientErr);
     806        if (sendto_errno == EHOSTUNREACH || sendto_errno == EADDRNOTAVAIL || sendto_errno == ENETDOWN)
    804807            LogInfo("mDNSPlatformSendUDP sendto(%d) failed to send packet on InterfaceID %p %5s/%d to %#a:%d skt %d error %d errno %d (%s) %lu",
    805                     s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, errno, strerror(errno), (mDNSu32)(m->timenow));
     808                    s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, sendto_errno, strerror(sendto_errno), (mDNSu32)(m->timenow));
    806809        else
    807810        {
     
    809812            if (MessageCount < 50)  // Cap and ensure NO spamming of LogMsgs
    810813                LogMsg("mDNSPlatformSendUDP: sendto(%d) failed to send packet on InterfaceID %p %5s/%d to %#a:%d skt %d error %d errno %d (%s) %lu MessageCount is %d",
    811                        s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, errno, strerror(errno), (mDNSu32)(m->timenow), MessageCount);
     814                       s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, sendto_errno, strerror(sendto_errno), (mDNSu32)(m->timenow), MessageCount);
    812815            else  // If logging is enabled, remove the cap and log aggressively
    813816                LogInfo("mDNSPlatformSendUDP: sendto(%d) failed to send packet on InterfaceID %p %5s/%d to %#a:%d skt %d error %d errno %d (%s) %lu MessageCount is %d",
    814                         s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, errno, strerror(errno), (mDNSu32)(m->timenow), MessageCount);
     817                        s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, sendto_errno, strerror(sendto_errno), (mDNSu32)(m->timenow), MessageCount);
    815818        }
    816819
     
    10721075        // All of this is racy, as data may have arrived after the call to select()
    10731076        static unsigned int numLogMessages = 0;
    1074         int save_errno = errno;
     1077        const int save_errno = errno;
    10751078        int so_error = -1;
    10761079        int so_nread = -1;
     
    19131916    char *errstr = mDNSNULL;
    19141917    const int mtu = 0;
     1918    int saved_errno;
    19151919
    19161920    cp->closeFlag = mDNSNULL;
     
    20452049
    20462050fail:
     2051    saved_errno = errno;
    20472052    // For "bind" failures, only write log messages for our shared mDNS port, or for binding to zero
    20482053    if (strcmp(errstr, "bind") || mDNSSameIPPort(port, MulticastDNSPort) || mDNSIPPortIsZero(port))
    2049         LogMsg("%s skt %d port %d error %d errno %d (%s)", errstr, skt, mDNSVal16(port), err, errno, strerror(errno));
     2054        LogMsg("%s skt %d port %d error %d errno %d (%s)", errstr, skt, mDNSVal16(port), err, saved_errno, strerror(saved_errno));
    20502055
    20512056    // If we got a "bind" failure of EADDRINUSE, inform the caller as it might need to try another random port
    2052     if (!strcmp(errstr, "bind") && errno == EADDRINUSE)
     2057    if (!strcmp(errstr, "bind") && saved_errno == EADDRINUSE)
    20532058    {
    20542059        err = EADDRINUSE;
     
    23262331    if (sock < 0)
    23272332    {
    2328         LogMsg("getMACAddress: Can not open the socket - %s", strerror(errno));
    2329         return errno;
     2333        const int socket_errno = errno;
     2334        LogMsg("getMACAddress: Can not open the socket - %s", strerror(socket_errno));
     2335        return socket_errno;
    23302336    }
    23312337   
     
    23592365    if (write(sock, (char *)&m_rtmsg, rlen) < 0)
    23602366    {
    2361         LogMsg("getMACAddress: writing to routing socket: %s", strerror(errno));
     2367        const int write_errno = errno;
     2368        LogMsg("getMACAddress: writing to routing socket: %s", strerror(write_errno));
    23622369        close(sock);
    2363         return errno;
     2370        return write_errno;
    23642371    }
    23652372   
     
    32363243{
    32373244    // We only use Sleep Proxy Service on multicast-capable interfaces, except loopback and D2D.
    3238     if (!SPSInterface(i)) return(mDNSfalse);
     3245    if (!MulticastInterface(i) || (i->ifa_flags & IFF_LOOPBACK) || i->D2DInterface)
     3246    {
     3247        LogSPS("NetWakeInterface: returning false for %s", i->ifinfo.ifname);
     3248        return(mDNSfalse);
     3249    }
    32393250
    32403251    // If the interface supports TCPKeepalive, it is capable of waking up for a magic packet
     
    32543265    if (ioctl(s, SIOCGIFWAKEFLAGS, &ifr) < 0)
    32553266    {
     3267        const int ioctl_errno = errno;
    32563268        // For some strange reason, in /usr/include/sys/errno.h, EOPNOTSUPP is defined to be
    32573269        // 102 when compiling kernel code, and 45 when compiling user-level code. Since this
    32583270        // error code is being returned from the kernel, we need to use the kernel version.
    32593271        #define KERNEL_EOPNOTSUPP 102
    3260         if (errno != KERNEL_EOPNOTSUPP) // "Operation not supported on socket", the expected result on Leopard and earlier
    3261             LogMsg("NetWakeInterface SIOCGIFWAKEFLAGS %s errno %d (%s)", i->ifinfo.ifname, errno, strerror(errno));
     3272        if (ioctl_errno != KERNEL_EOPNOTSUPP) // "Operation not supported on socket", the expected result on Leopard and earlier
     3273            LogMsg("NetWakeInterface SIOCGIFWAKEFLAGS %s errno %d (%s)", i->ifinfo.ifname, ioctl_errno, strerror(ioctl_errno));
    32623274        // If on Leopard or earlier, we get EOPNOTSUPP, so in that case
    32633275        // we enable WOL if this interface is not AirPort and "Wake for Network access" is turned on.
    3264         ifr.ifr_wake_flags = (errno == KERNEL_EOPNOTSUPP && !(i)->BSSID.l[0] && i->m->SystemWakeOnLANEnabled) ? IF_WAKE_ON_MAGIC_PACKET : 0;
     3276        ifr.ifr_wake_flags = (ioctl_errno == KERNEL_EOPNOTSUPP && !(i)->BSSID.l[0] && i->m->SystemWakeOnLANEnabled) ? IF_WAKE_ON_MAGIC_PACKET : 0;
    32653277    }
    32663278
  • mDNSResponder/mDNSShared/dns_sd.h

    r1e55d820 r2723609  
    6767
    6868#ifndef _DNS_SD_H
    69 #define _DNS_SD_H 8782003
     69#define _DNS_SD_H 8783004
    7070
    7171#ifdef  __cplusplus
Note: See TracChangeset for help on using the changeset viewer.