/*====================================================================*
*
* Copyright (c) 2013 Qualcomm Atheros, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted (subject to the limitations
* in the disclaimer below) provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* * Neither the name of Qualcomm Atheros nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
* COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*--------------------------------------------------------------------*/
/*====================================================================*
*
* void Failure (struct plc * plc, char const *format, ...)
*
* error.h
*
* Inform the user that an operation failed; print the channel name,
* source device, error message and user defined message on stderr
* unless the PLC_SILENCE flags is set;
*
* This function is similar to Confirm () except that the message
* status or result code and description is output when the code
* is non-zero; overtime, result codes have replaced status codes
* and so we look in different places for codes in some MMEs;
*
* the status and result code fields appear at different offsets
* in different messages; consequently, check the MMTYPE to find
* field;
*
*
* Contributor(s);
* Charles Maier <cmaier@qca.qualcomm.com>
*
*--------------------------------------------------------------------*/
#ifndef FAILURE_SOURCE
#define FAILURE_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include "../plc/plc.h"
#include "../tools/error.h"
#include "../tools/flags.h"
#include "../tools/memory.h"
#include "../mme/mme.h"
#ifdef __GNUC__
__attribute__ ((format (printf, 2, 3)))
#endif
void Failure (struct plc * plc, char const *format, ...)
{
if (_allclr (plc->flags, PLC_SILENCE))
{
char address [ETHER_ADDR_LEN * 3];
struct channel * channel = (struct channel *)(plc->channel);
struct message * message = (struct message *)(plc->message);
struct __packed header_confirm
{
ethernet_hdr ethernet;
qualcomm_hdr qualcomm;
uint8_t MSTATUS;
}
* header = (struct header_confirm *)(message);
hexdecode (header->ethernet.OSA, sizeof (header->ethernet.OSA), address, sizeof (address));
fprintf (stderr, "%s %s ", channel->ifname, address);
switch (LE16TOH (header->qualcomm.MMTYPE))
{
case VS_CONN_ADD | MMTYPE_CNF:
case VS_CONN_MOD | MMTYPE_CNF:
case VS_CONN_REL | MMTYPE_CNF:
case VS_CONN_INFO | MMTYPE_CNF:
{
struct __packed header_confirm
{
struct ethernet_hdr ethernet;
struct qualcomm_hdr qualcomm;
uint32_t REQUEST;
uint8_t MSTATUS;
}
* header = (struct header_confirm *)(message);
if (header->MSTATUS)
{
fprintf (stderr, "%s (0x%02X): ", MMECode (header->qualcomm.MMTYPE, header->MSTATUS), header->MSTATUS);
}
}
break;
case VS_SELFTEST_RESULTS | MMTYPE_CNF:
case VS_FORWARD_CONFIG | MMTYPE_CNF:
{
struct __packed header_confirm
{
struct ethernet_hdr ethernet;
struct qualcomm_hdr qualcomm;
uint8_t MVERSION;
uint8_t RESULTCODE;
}
* header = (struct header_confirm *)(message);
if (header->RESULTCODE)
{
fprintf (stderr, "%s (0x%02X): ", MMECode (header->qualcomm.MMTYPE, header->RESULTCODE), header->RESULTCODE);
}
}
break;
default:
if (header->MSTATUS)
{
fprintf (stderr, "%s (0x%02X): ", MMECode (header->qualcomm.MMTYPE, header->MSTATUS), header->MSTATUS);
}
break;
}
if ((format) && (*format))
{
va_list arglist;
va_start (arglist, format);
vfprintf (stderr, format, arglist);
va_end (arglist);
}
fprintf (stderr, "\n");
}
if (_anyset (plc->flags, PLC_BAILOUT))
{
if (_allclr (plc->flags, PLC_SILENCE))
{
error (1, 0, "Bailing Out!");
}
exit (1);
}
return;
}
#endif