/* * Copyright (c) 2002-2003 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. * * Author: Hartmut Brandt * Kendy Kutzner * * $Begemot: libunimsg/netnatm/sig/sig_print.c,v 1.6 2004/08/05 07:11:02 brandt Exp $ */ #include #ifdef _KERNEL #include #include #include #include #else #include #include #include #include #endif #include #include #include #include #include #include #include #include const char * uni_strerr(u_int err) { static const char *const errstr[] = { #define DEF(NAME, VAL, STR) [UNIAPI_##NAME] = STR, UNIAPI_DEF_ERRORS(DEF) #undef DEF }; static char buf[100]; if (err >= sizeof(errstr)/sizeof(errstr[0]) || errstr[err] == NULL) { sprintf(buf, "Unknown error %u", err); return (buf); } return (errstr[err]); } #define D(M) [M] = #M static const char *const msgs[] = { D(UNIAPI_ERROR), D(UNIAPI_CALL_CREATED), D(UNIAPI_CALL_DESTROYED), D(UNIAPI_PARTY_CREATED), D(UNIAPI_PARTY_DESTROYED), D(UNIAPI_LINK_ESTABLISH_request), D(UNIAPI_LINK_ESTABLISH_confirm), D(UNIAPI_LINK_RELEASE_request), D(UNIAPI_LINK_RELEASE_confirm), D(UNIAPI_RESET_request), D(UNIAPI_RESET_confirm), D(UNIAPI_RESET_indication), D(UNIAPI_RESET_ERROR_indication), D(UNIAPI_RESET_response), D(UNIAPI_RESET_ERROR_response), D(UNIAPI_RESET_STATUS_indication), D(UNIAPI_SETUP_request), D(UNIAPI_SETUP_indication), D(UNIAPI_SETUP_response), D(UNIAPI_SETUP_confirm), D(UNIAPI_SETUP_COMPLETE_indication), D(UNIAPI_SETUP_COMPLETE_request), D(UNIAPI_ALERTING_request), D(UNIAPI_ALERTING_indication), D(UNIAPI_PROCEEDING_request), D(UNIAPI_PROCEEDING_indication), D(UNIAPI_RELEASE_request), D(UNIAPI_RELEASE_indication), D(UNIAPI_RELEASE_response), D(UNIAPI_RELEASE_confirm), D(UNIAPI_NOTIFY_request), D(UNIAPI_NOTIFY_indication), D(UNIAPI_STATUS_indication), D(UNIAPI_STATUS_ENQUIRY_request), D(UNIAPI_ADD_PARTY_request), D(UNIAPI_ADD_PARTY_indication), D(UNIAPI_PARTY_ALERTING_request), D(UNIAPI_PARTY_ALERTING_indication), D(UNIAPI_ADD_PARTY_ACK_request), D(UNIAPI_ADD_PARTY_ACK_indication), D(UNIAPI_ADD_PARTY_REJ_request), D(UNIAPI_ADD_PARTY_REJ_indication), D(UNIAPI_DROP_PARTY_request), D(UNIAPI_DROP_PARTY_indication), D(UNIAPI_DROP_PARTY_ACK_request), D(UNIAPI_DROP_PARTY_ACK_indication), D(UNIAPI_ABORT_CALL_request), }; #undef D void uni_print_api(char *buf, size_t bufsiz, u_int type, u_int cookie, const void *msg, struct unicx *cx) { int old_dont_init = cx->dont_init; uni_print_init(buf, bufsiz, cx); cx->dont_init = 1; if (type >= sizeof(msgs) / sizeof(msgs[0]) || msgs[type] == NULL) { uni_print_flag("UNIAPI_UNKNOWN", cx); uni_print_entry(cx, "sig", "%u", type); uni_print_entry(cx, "cookie", "%u", cookie); goto out; } uni_print_flag(msgs[type], cx); uni_print_entry(cx, "cookie", "%u", cookie); cx->indent++; switch (type) { case UNIAPI_ERROR: { const struct uniapi_error *api = msg; uni_print_eol(cx); uni_print_entry(cx, "reason", "%s", uni_strerr(api->reason)); uni_print_entry(cx, "state", "U%u", api->state); break; } case UNIAPI_CALL_CREATED: { const struct uniapi_call_created *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); break; } case UNIAPI_CALL_DESTROYED: { const struct uniapi_call_destroyed *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); break; } case UNIAPI_PARTY_CREATED: { const struct uniapi_party_created *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_EPREF, (const union uni_ieall *)&api->epref, cx); break; } case UNIAPI_PARTY_DESTROYED: { const struct uniapi_party_destroyed *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_EPREF, (const union uni_ieall *)&api->epref, cx); break; } case UNIAPI_LINK_ESTABLISH_request: case UNIAPI_LINK_ESTABLISH_confirm: case UNIAPI_LINK_RELEASE_request: case UNIAPI_LINK_RELEASE_confirm: break; case UNIAPI_RESET_request: { const struct uniapi_reset_request *api = msg; uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_RESTART, (const union uni_ieall *)&api->restart, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CONNID, (const union uni_ieall *)&api->restart, cx); break; } case UNIAPI_RESET_confirm: { const struct uniapi_reset_confirm *api = msg; uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_RESTART, (const union uni_ieall *)&api->restart, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CONNID, (const union uni_ieall *)&api->restart, cx); break; } case UNIAPI_RESET_indication: { const struct uniapi_reset_indication *api = msg; uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_RESTART, (const union uni_ieall *)&api->restart, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CONNID, (const union uni_ieall *)&api->restart, cx); break; } case UNIAPI_RESET_ERROR_indication: { const struct uniapi_reset_error_indication *api = msg; static const struct uni_print_tbl reason[] = { #define DEF(NAME, VALUE, STR) { STR, VALUE }, UNIAPI_DEF_RESET_ERRORS(DEF) #undef DEF { NULL, 0 } }; static const struct uni_print_tbl source[] = { { "start", 0 }, { "respond", 1 }, { NULL, 0 } }; uni_print_eol(cx); uni_print_tbl("source", api->source, source, cx); uni_print_tbl("reason", api->reason, reason, cx); break; } case UNIAPI_RESET_response: { const struct uniapi_reset_response *api = msg; uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_RESTART, (const union uni_ieall *)&api->restart, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CONNID, (const union uni_ieall *)&api->restart, cx); break; } case UNIAPI_RESET_ERROR_response: { const struct uniapi_reset_error_response *api = msg; uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CAUSE, (const union uni_ieall *)&api->cause, cx); break; } case UNIAPI_RESET_STATUS_indication: { const struct uniapi_reset_status_indication *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CALLSTATE, (const union uni_ieall *)&api->callstate, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CAUSE, (const union uni_ieall *)&api->cause, cx); break; } case UNIAPI_SETUP_request: { const struct uniapi_setup_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_SETUP, (const union uni_msgall *)&api->setup, cx); break; } case UNIAPI_SETUP_indication: { const struct uniapi_setup_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_SETUP, (const union uni_msgall *)&api->setup, cx); break; } case UNIAPI_SETUP_response: { const struct uniapi_setup_response *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CONNECT, (const union uni_msgall *)&api->connect, cx); break; } case UNIAPI_SETUP_confirm: { const struct uniapi_setup_confirm *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CONNECT, (const union uni_msgall *)&api->connect, cx); break; } case UNIAPI_SETUP_COMPLETE_indication: { const struct uniapi_setup_complete_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CONNECT_ACK, (const union uni_msgall *)&api->connect_ack, cx); break; } case UNIAPI_SETUP_COMPLETE_request: { const struct uniapi_setup_complete_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CONNECT_ACK, (const union uni_msgall *)&api->connect_ack, cx); break; } case UNIAPI_ALERTING_request: { const struct uniapi_alerting_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ALERTING, (const union uni_msgall *)&api->alerting, cx); break; } case UNIAPI_ALERTING_indication: { const struct uniapi_alerting_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ALERTING, (const union uni_msgall *)&api->alerting, cx); break; } case UNIAPI_PROCEEDING_request: { const struct uniapi_proceeding_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CALL_PROC, (const union uni_msgall *)&api->call_proc, cx); break; } case UNIAPI_PROCEEDING_indication: { const struct uniapi_proceeding_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_CALL_PROC, (const union uni_msgall *)&api->call_proc, cx); break; } case UNIAPI_RELEASE_request: { const struct uniapi_release_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_RELEASE, (const union uni_msgall *)&api->release, cx); break; } case UNIAPI_RELEASE_indication: { const struct uniapi_release_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_RELEASE, (const union uni_msgall *)&api->release, cx); break; } case UNIAPI_RELEASE_response: { const struct uniapi_release_response *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_RELEASE_COMPL, (const union uni_msgall *)&api->release_compl, cx); break; } case UNIAPI_RELEASE_confirm: { const struct uniapi_release_confirm *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_RELEASE, (const union uni_msgall *)&api->release, cx); break; } case UNIAPI_NOTIFY_request: { const struct uniapi_notify_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_NOTIFY, (const union uni_msgall *)&api->notify, cx); break; } case UNIAPI_NOTIFY_indication: { const struct uniapi_notify_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_NOTIFY, (const union uni_msgall *)&api->notify, cx); break; } case UNIAPI_STATUS_indication: { const struct uniapi_status_indication *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); uni_print_eol(cx); uni_print_entry(cx, "my_state", "U%u", api->my_state); uni_print_entry(cx, "my_cause", "%s", uni_ie_cause2str(UNI_CODING_ITU, api->my_cause)); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CALLSTATE, (const union uni_ieall *)&api->his_state, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CAUSE, (const union uni_ieall *)&api->his_cause, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_EPREF, (const union uni_ieall *)&api->epref, cx); break; } case UNIAPI_STATUS_ENQUIRY_request: { const struct uniapi_status_enquiry_request *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_EPREF, (const union uni_ieall *)&api->epref, cx); break; } case UNIAPI_ADD_PARTY_request: { const struct uniapi_add_party_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY, (const union uni_msgall *)&api->add, cx); break; } case UNIAPI_ADD_PARTY_indication: { const struct uniapi_add_party_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY, (const union uni_msgall *)&api->add, cx); break; } case UNIAPI_PARTY_ALERTING_request: { const struct uniapi_party_alerting_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_PARTY_ALERTING, (const union uni_msgall *)&api->alert, cx); break; } case UNIAPI_PARTY_ALERTING_indication: { const struct uniapi_party_alerting_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_PARTY_ALERTING, (const union uni_msgall *)&api->alert, cx); break; } case UNIAPI_ADD_PARTY_ACK_request: { const struct uniapi_add_party_ack_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY_ACK, (const union uni_msgall *)&api->ack, cx); break; } case UNIAPI_ADD_PARTY_ACK_indication: { const struct uniapi_add_party_ack_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY_ACK, (const union uni_msgall *)&api->ack, cx); break; } case UNIAPI_ADD_PARTY_REJ_request: { const struct uniapi_add_party_rej_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY_REJ, (const union uni_msgall *)&api->rej, cx); break; } case UNIAPI_ADD_PARTY_REJ_indication: { const struct uniapi_add_party_rej_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_ADD_PARTY_REJ, (const union uni_msgall *)&api->rej, cx); break; } case UNIAPI_DROP_PARTY_request: { const struct uniapi_drop_party_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_DROP_PARTY, (const union uni_msgall *)&api->drop, cx); break; } case UNIAPI_DROP_PARTY_indication: { const struct uniapi_drop_party_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_DROP_PARTY, (const union uni_msgall *)&api->drop, cx); break; } case UNIAPI_DROP_PARTY_ACK_request: { const struct uniapi_drop_party_ack_request *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_DROP_PARTY_ACK, (const union uni_msgall *)&api->ack, cx); break; } case UNIAPI_DROP_PARTY_ACK_indication: { const struct uniapi_drop_party_ack_indication *api = msg; uni_print_eol(cx); uni_print_msg(NULL, 0, UNI_DROP_PARTY, (const union uni_msgall *)&api->drop, cx); uni_print_eol(cx); uni_print_ie(NULL, 0, UNI_IE_CRANKBACK, (const union uni_ieall *)&api->crankback, cx); break; } case UNIAPI_ABORT_CALL_request: { const struct uniapi_abort_call_request *api = msg; uni_print_cref(NULL, 0, &api->cref, cx); break; } } out: cx->dont_init = old_dont_init; }