isdn4k-utils/isdnlog/isdnlog/asn1_address.c

392 lines
9.9 KiB
C

/* $Id: asn1_address.c,v 1.2 1999/04/26 22:11:52 akool Exp $
*
* ISDN accounting for isdn4linux. (ASN.1 parser)
*
* Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
*
* ASN.1 parser written by Kai Germaschewski <kai@thphy.uni-duesseldorf.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: asn1_address.c,v $
* Revision 1.2 1999/04/26 22:11:52 akool
* isdnlog Version 3.21
*
* - CVS headers added to the asn* files
* - repaired the "4.CI" message directly on CONNECT
* - HANGUP message extended (CI's and EH's shown)
* - reactivated the OVERLOAD message
* - rate-at.dat extended
* - fixes from Michael Reinelt
*
*
* Revision 0.1 1999/04/25 20:00.00 akool
* Initial revision
*
*/
#include "asn1.h"
ELEMENT_1(ParsePresentedAddressScreened, char, );
ELEMENT_1(ParsePresentedAddressUnscreened, char, );
ELEMENT_1(ParsePresentedNumberScreened, char, );
ELEMENT_1(ParsePresentedNumberUnscreened, char, );
ELEMENT_1(ParseAddressScreened, char, );
ELEMENT_1(ParseNumberScreened, char, );
ELEMENT_1(ParseAddress, char, );
ELEMENT_1(ParsePartyNumber, char, );
ELEMENT_1(ParsePublicPartyNumber, char, );
ELEMENT_1(ParsePrivatePartyNumber, char, );
ELEMENT_1(ParseNumberDigits, char, );
ELEMENT_1(ParsePublicTypeOfNumber, int, );
ELEMENT_1(ParsePrivateTypeOfNumber, int, );
ELEMENT_1(ParsePartySubaddress, char, );
ELEMENT_1(ParseUserSpecifiedSubaddress, char, );
ELEMENT_1(ParseNSAPSubaddress, char, );
ELEMENT_1(ParseSubaddressInformation, char, );
ELEMENT_1(ParseScreeningIndicator, int, );
char* PublicTypeOfNumber[] = {
"unknown",
"internationalNumber",
"nationalNumber",
"networkSpecificNumber",
"subscriberNumber",
"--",
"abbreviatedNumber",
};
const int NPublicTypeOfNumber = 7;
char* PrivateTypeOfNumber[] = {
"unknown",
"level2RegionalNumber",
"level1RegionalNumber",
"pTNSpecificNumber",
"localNumber",
"--",
"abbreviatedNumber",
};
const int NPrivateTypeOfNumber = 7;
char* ScreeningIndicator[] = {
"userProvidedNotScreened",
"userProvidedVerifiedAndPassed",
"userProvidedVerifiedAndFailed",
"networkProvided",
};
const int NScreeningIndicator = 4;
ELEMENT_1(ParsePresentedAddressScreened, char, num)
{
char tmp[255];
MY_DEBUG("ParsePresentedAddressScreened");
switch (IMP_TAG(el.tag)) {
CASE_TAGGED_1(0, ParseAddressScreened, tmp);
CASE_TAGGED_1(3, ParseAddressScreened, tmp);
}
switch (IMP_TAG(el.tag)) {
case 0 : sprintf(num, "presentationAllowedAddress: %s", tmp); break;
case 1 : strcpy(num, "presentationRestricted"); break;
case 2 : strcpy(num, "numberNotAvailableDueToInterworking"); break;
case 3 : sprintf(num, "presentationRestrictedAddress: %s", tmp); break;
default : return 0;
}
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", num);
return 1;
}
ELEMENT_1(ParsePresentedAddressUnscreened, char, num)
{
char tmp[255];
MY_DEBUG("ParsePresentedAddressUnscreened");
switch (IMP_TAG(el.tag)) {
CASE_TAGGED_1(0, ParseAddress, tmp);
CASE_TAGGED_1(3, ParseAddress, tmp);
}
switch (IMP_TAG(el.tag)) {
case 0 : sprintf(num, "presentationAllowedAddress: %s", tmp); break;
case 1 : strcpy(num, "presentationRestricted"); break;
case 2 : strcpy(num, "numberNotAvailableDueToInterworking"); break;
case 3 : sprintf(num, "presentationRestrictedAddress: %s", tmp); break;
default : return 0;
}
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", num);
return 1;
}
ELEMENT_1(ParsePresentedNumberScreened, char, num)
{
char tmp[255];
MY_DEBUG("ParsePresentedNumberScreened");
switch (IMP_TAG(el.tag)) {
CASE_TAGGED_1(0, ParseNumberScreened, tmp);
CASE_TAGGED_1(3, ParseNumberScreened, tmp);
}
switch (IMP_TAG(el.tag)) {
case 0 : sprintf(num, "presentationAllowedNumber: %s", tmp); break;
case 1 : strcpy(num, "presentationRestricted"); break;
case 2 : strcpy(num, "numberNotAvailableDueToInterworking"); break;
case 3 : sprintf(num, "presentationRestrictedNumber: %s", tmp); break;
default : return 0;
}
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", num);
return 1;
}
ELEMENT_1(ParsePresentedNumberUnscreened, char, num)
{
char tmp[255];
MY_DEBUG("ParsePresentedNumberUnscreened");
switch (IMP_TAG(el.tag)) {
CASE_TAGGED_1(0, ParsePartyNumber, tmp);
CASE_TAGGED_1(3, ParsePartyNumber, tmp);
}
switch (IMP_TAG(el.tag)) {
case 0 : sprintf(num, "presentationAllowedNumber: %s", tmp); break;
case 1 : strcpy(num, "presentationRestricted"); break;
case 2 : strcpy(num, "numberNotAvailableDueToInterworking"); break;
case 3 : sprintf(num, "presentationRestrictedNumber: %s", tmp); break;
default : return 0;
}
print_msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", num);
return 1;
}
ELEMENT_1(ParseAddressScreened, char, addr)
{
char num[BUF_SIZE];
char sa[BUF_SIZE];
int screeningIndicator;
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParseAddressScreened");
strcpy(sa, "");
SEQ_NOT_TAGGED_1(ParsePartyNumber, num);
SEQ_NOT_TAGGED_1(ParseScreeningIndicator, &screeningIndicator);
SEQOPT_NOT_TAGGED_1(ParsePartySubaddress, sa);
if (strcmp(sa, "") != 0)
sprintf(addr, "%s SUB %s", num, sa);
else
strcpy(addr, num);
return 1;
}
ELEMENT_1(ParseNumberScreened, char, addr)
{
int screeningIndicator;
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParseNumberScreened");
SEQ_NOT_TAGGED_1(ParsePartyNumber, addr);
SEQ_NOT_TAGGED_1(ParseScreeningIndicator, &screeningIndicator);
return 1;
}
ELEMENT_1(ParseAddress, char, addr)
{
char num[BUF_SIZE];
char sa[BUF_SIZE];
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParseAddress");
strcpy(sa, "");
SEQ_NOT_TAGGED_1(ParsePartyNumber, num);
SEQOPT_NOT_TAGGED_1(ParsePartySubaddress, sa);
if (strcmp(sa, "") != 0)
sprintf(addr, "%s SUB %s", num, sa);
else
strcpy(addr, num);
return 1;
}
ELEMENT_1(ParsePartyNumber, char, num)
{
int a1, a2, a3, a4;
MY_DEBUG("ParsePartyNumber");
switch (IMP_TAG(el.tag)) {
CASE_TAGGED_1(0, ParseNumberDigits, num); // unknownPartyNumber
CASE_TAGGED_1(1, ParsePublicPartyNumber, num); // publicPartyNumber
CASE_TAGGED_1(3, ParseNumberDigits, num); // dataPartyNumber
CASE_TAGGED_1(4, ParseNumberDigits, num); // telexPartyNumber
CASE_TAGGED_1(5, ParsePrivatePartyNumber, num); // privatePartyNumber
CASE_TAGGED_1(8, ParseNumberDigits, num); // nationalStandardPartyNumber
default:
return 0;
}
if (el.tag == 0) {
buildnumber(num, 0, 0, call[6].num[CLIP],
VERSION_EDSS1, &a1, &a2, &a3, &a4, 0, 999);
strcpy(num, vnum(6, CLIP));
}
return 1;
}
ELEMENT_1(ParsePublicPartyNumber, char, num)
{
int pton;
char digits[BUF_SIZE];
int a1, a2, a3, a4;
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParsePublicPartyNumber");
SEQ_NOT_TAGGED_1(ParsePublicTypeOfNumber, &pton);
SEQ_NOT_TAGGED_1(ParseNumberDigits, digits);
buildnumber(digits, pton << 4, 0, call[6].num[CLIP],
VERSION_EDSS1, &a1, &a2, &a3, &a4, 0, 999);
strcpy(num, vnum(6, CLIP));
return 1;
}
ELEMENT_1(ParsePrivatePartyNumber, char, num)
{
int pton;
char digits[BUF_SIZE];
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParsePrivatePartyNumber");
SEQ_NOT_TAGGED_1(ParsePrivateTypeOfNumber, &pton);
SEQ_NOT_TAGGED_1(ParseNumberDigits, digits);
sprintf(num, "%s %s", PrivateTypeOfNumber[pton], digits);
return 1;
}
ELEMENT_1(ParseNumberDigits, char, s)
{
MY_DEBUG("ParseNumberDigits");
return ParseNumericString(el, tag, s);
}
ELEMENT_1(ParsePublicTypeOfNumber, int, publicTypeOfNumber)
{
MY_DEBUG("ParsePublicTypeOfNumber");
if (!ParseEnum(el, tag, publicTypeOfNumber)) return 0;
if ((*publicTypeOfNumber < 0) || (*publicTypeOfNumber > NPublicTypeOfNumber))
return 0;
print_msg(PRT_DEBUG_DECODE, " DEBUG> publicTypeOfNumber = %s\n",
PublicTypeOfNumber[*publicTypeOfNumber]);
return 1;
}
ELEMENT_1(ParsePrivateTypeOfNumber, int, privateTypeOfNumber)
{
MY_DEBUG("ParsePrivateTypeOfNumber");
if (!ParseEnum(el, tag, privateTypeOfNumber)) return 0;
if ((*privateTypeOfNumber < 0) || (*privateTypeOfNumber > NPrivateTypeOfNumber))
return 0;
print_msg(PRT_DEBUG_DECODE, " DEBUG> publicTypeOfNumber = %s\n",
PrivateTypeOfNumber[*privateTypeOfNumber]);
return 1;
}
ELEMENT_1(ParsePartySubaddress, char, sa)
{
MY_DEBUG("ParsePartySubaddress");
switch (el.tag &~ 0x20) {
CASE_1(ASN1_TAG_SEQUENCE, ParseUserSpecifiedSubaddress, sa);
CASE_1(ASN1_TAG_OCTET_STRING, ParseNSAPSubaddress, sa);
default:
return 0;
}
return 1;
}
ELEMENT_1(ParseUserSpecifiedSubaddress, char, sa)
{
int oddCountIndicator = -2;
CHECK_TAG(ASN1_TAG_SEQUENCE);
MY_DEBUG("ParsePublicPartyNumber");
SEQ_NOT_TAGGED_1(ParseSubaddressInformation, sa);
SEQOPT_NOT_TAGGED_1(ParseBoolean, &oddCountIndicator);
if (oddCountIndicator != -2) {
sprintf(sa, "%s %s", sa, oddCountIndicator?"odd":"even");
}
return 1;
}
ELEMENT_1(ParseNSAPSubaddress, char, sa)
{
MY_DEBUG("ParseNSAPSubaddress");
return ParseOctetString(el, tag, sa);
}
ELEMENT_1(ParseSubaddressInformation, char, sa)
{
MY_DEBUG("ParseSubaddressInformation");
return ParseOctetString(el, tag, sa);
}
ELEMENT_1(ParseScreeningIndicator, int, screeningIndicator)
{
MY_DEBUG("ParseScreeningIndicator");
if (!ParseEnum(el, tag, screeningIndicator)) return 0;
if ((*screeningIndicator < 0) || (*screeningIndicator > NScreeningIndicator))
return 0;
print_msg(PRT_DEBUG_DECODE, " DEBUG> screeningIndicator = %s\n",
ScreeningIndicator[*screeningIndicator]);
return 1;
}