392 lines
9.9 KiB
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;
|
|
}
|