IPMonitorAWDReport.m [plain text]
/*
* Copyright (c) 2018 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*
* IPMonitorAWDReport.m
* - C shim layer to interact with AWD to generate and submit a metric
*/
#import <WirelessDiagnostics/WirelessDiagnostics.h>
#import "AWDMetricIds_IPMonitor.h"
#import "AWDIPMonitorInterfaceAdvisoryReport.h"
#import "IPMonitorAWDReport.h"
#import <SystemConfiguration/SCPrivate.h>
#include "symbol_scope.h"
#if defined(TEST_IPMONITOR_AWD_REPORT) || defined(TEST_IPMONITOR_CONTROL)
#define my_log(__level, __format, ...) SCPrint(TRUE, stdout, CFSTR(__format "\n"), ## __VA_ARGS__)
#else /* TEST_IPMONITOR_AWD_REPORT || TEST_IPMONITOR_CONTROL */
#define my_log(__level, __format, ...) SC_log(__level, __format, ## __VA_ARGS__)
#endif /* TEST_IPMONITOR_AWD_REPORT || TEST_IPMONITOR_CONTROL */
STATIC AWDServerConnection *
IPMonitorAWDServerConnection(void)
{
AWDServerConnection * server;
if ([AWDServerConnection class] == nil) {
return (nil);
}
server = [[AWDServerConnection alloc]
initWithComponentId:AWDComponentId_IPMonitor];
if (server == NULL) {
my_log(LOG_NOTICE, "Failed to create AWD server connection");
}
return (server);
}
STATIC InterfaceAdvisoryReportRef
_InterfaceAdvisoryReportCreate(AWDIPMonitorInterfaceType type)
{
AWDIPMonitorInterfaceAdvisoryReport * metric;
if ([AWDServerConnection class] == nil) {
return (NULL);
}
metric = [[AWDIPMonitorInterfaceAdvisoryReport alloc] init];
metric.interfaceType = type;
/* default to zero values */
metric.flags = 0;
metric.advisoryCount = 0;
return ((InterfaceAdvisoryReportRef)metric);
}
PRIVATE_EXTERN InterfaceAdvisoryReportRef
InterfaceAdvisoryReportCreate(AWDIPMonitorInterfaceType type)
{
InterfaceAdvisoryReportRef report;
@autoreleasepool {
report = _InterfaceAdvisoryReportCreate(type);
}
return (report);
}
STATIC void
_InterfaceAdvisoryReportSubmit(InterfaceAdvisoryReportRef report)
{
AWDMetricContainer * container;
AWDServerConnection * server;
server = IPMonitorAWDServerConnection();
if (server == NULL) {
return;
}
container = [server newMetricContainerWithIdentifier:
AWDMetricId_IPMonitor_InterfaceAdvisoryReport];
[container setMetric:(AWDIPMonitorInterfaceAdvisoryReport *)report];
[server submitMetric:container];
[server release];
[container release];
return;
}
PRIVATE_EXTERN void
InterfaceAdvisoryReportSubmit(InterfaceAdvisoryReportRef report)
{
@autoreleasepool {
_InterfaceAdvisoryReportSubmit(report);
}
}
#define INTERFACE_ADVISORY_REPORT_SET_PROP(report, name, value) \
@autoreleasepool { \
AWDIPMonitorInterfaceAdvisoryReport * metric; \
\
metric = (AWDIPMonitorInterfaceAdvisoryReport *)report; \
metric.name = value; \
}
void
InterfaceAdvisoryReportSetFlags(InterfaceAdvisoryReportRef report,
AWDIPMonitorInterfaceAdvisoryReport_Flags flags)
{
INTERFACE_ADVISORY_REPORT_SET_PROP(report, flags, flags);
}
void
InterfaceAdvisoryReportSetAdvisoryCount(InterfaceAdvisoryReportRef report,
uint32_t count)
{
INTERFACE_ADVISORY_REPORT_SET_PROP(report, advisoryCount, count);
}
#ifdef TEST_IPMONITOR_AWD_REPORT
int
main(int argc, char * argv[])
{
InterfaceAdvisoryReportRef report;
AWDIPMonitorInterfaceType type;
type = AWDIPMonitorInterfaceType_IPMONITOR_INTERFACE_TYPE_WIFI;
report = InterfaceAdvisoryReportCreate(type);
if (report == NULL) {
fprintf(stderr, "WirelessDiagnostics framework not available\n");
exit(1);
}
printf("Before setting values:\n");
CFShow(report);
fflush(stdout);
/* set values */
InterfaceAdvisoryReportSetFlags(report,
AWDIPMonitorInterfaceAdvisoryReport_Flags_LINK_LAYER_ISSUE
| AWDIPMonitorInterfaceAdvisoryReport_Flags_UPLINK_ISSUE);
InterfaceAdvisoryReportSetAdvisoryCount(report, 2);
printf("After setting values:\n");
CFShow(report);
fflush(stdout);
InterfaceAdvisoryReportSubmit(report);
CFRelease(report);
if (argc > 1) {
fprintf(stderr, "pid is sleep(120);
}
}
#endif /* TEST_IPMONITOR_AWD_REPORT */