mISDN/drivers/isdn/hardware/mISDN/asn1_enc.c

202 lines
3.9 KiB
C
Raw Normal View History

2001-02-21 19:22:35 +00:00
/* $Id$
*
*/
#include "m_capi.h"
2001-02-21 19:22:35 +00:00
#include "helper.h"
#include "asn1_enc.h"
int encodeNull(__u8 *dest)
{
dest[0] = 0x05; // null
dest[1] = 0; // length
return 2;
}
2006-03-06 12:52:08 +00:00
int encodeBoolean(__u8 *dest, __u32 i)
{
dest[0] = 0x01; // BOOLEAN
dest[1] = 1; // length 1
dest[3] = i ? 1:0; // Value
return 3;
}
2001-02-21 19:22:35 +00:00
int encodeInt(__u8 *dest, __u32 i)
{
__u8 *p;
dest[0] = 0x02; // integer
dest[1] = 0; // length
p = &dest[2];
do {
*p++ = i;
i >>= 8;
} while (i);
dest[1] = p - &dest[2];
return p - dest;
}
int encodeEnum(__u8 *dest, __u32 i)
{
__u8 *p;
dest[0] = 0x0a; // integer
dest[1] = 0; // length
p = &dest[2];
do {
*p++ = i;
i >>= 8;
} while (i);
dest[1] = p - &dest[2];
return p - dest;
}
int encodeNumberDigits(__u8 *dest, __u8 *nd, __u8 len)
{
__u8 *p;
int i;
dest[0] = 0x12; // numeric string
dest[1] = 0x0; // length
p = &dest[2];
for (i = 0; i < len; i++)
*p++ = *nd++;
dest[1] = p - &dest[2];
return p - dest;
}
int encodePublicPartyNumber(__u8 *dest, __u8 *facilityPartyNumber)
{
__u8 *p;
dest[0] = 0x20; // sequence
dest[1] = 0; // length
p = &dest[2];
p += encodeEnum(p, (facilityPartyNumber[2] & 0x70) >> 4);
p += encodeNumberDigits(p, &facilityPartyNumber[4], facilityPartyNumber[0] - 3);
dest[1] = p - &dest[2];
return p - dest;
}
int encodePartyNumber(__u8 *dest, __u8 *facilityPartyNumber)
{
__u8 *p = dest;
p = dest;
switch (facilityPartyNumber[1]) {
case 0: // unknown
p += encodeNumberDigits(p, &facilityPartyNumber[4], facilityPartyNumber[0] - 3);
dest[0] &= 0x20;
dest[0] |= 0x81;
break;
case 1: // publicPartyNumber
p += encodePublicPartyNumber(p, facilityPartyNumber);
dest[0] &= 0x20;
dest[0] |= 0x81;
break;
default:
int_error();
return -1;
}
return p - dest;
}
int encodeServedUserNumber(__u8 *dest, __u8 *servedUserNumber)
{
if (servedUserNumber[0])
return encodePartyNumber(dest, servedUserNumber);
else
return encodeNull(dest);
}
int encodeAddress(__u8 *dest, __u8 *facilityPartyNumber, __u8 *calledPartySubaddress)
{
__u8 *p = dest;
dest[0] = 0x30; // invoke id tag, integer
dest[1] = 0; // length
p = &dest[2];
p += encodePartyNumber(p, facilityPartyNumber);
#if 0 // FIXME
if (calledPartySubaddress[0])
p += encodePartySubaddress(p, calledPartySubaddress);
#endif
dest[1] = p - &dest[2];
return p - dest;
}
int encodeActivationDiversion(__u8 *dest, struct FacReqCFActivate *CFActivate)
{
__u8 *p;
dest[0] = 0x30; // sequence
dest[1] = 0; // length
p = &dest[2];
p += encodeEnum(p, CFActivate->Procedure);
p += encodeEnum(p, CFActivate->BasicService);
p += encodeAddress(p, CFActivate->ForwardedToNumber, CFActivate->ForwardedToSubaddress);
p += encodeServedUserNumber(p, CFActivate->ServedUserNumber);
dest[1] = p - &dest[2];
return p - dest;
}
int encodeDeactivationDiversion(__u8 *dest, struct FacReqCFDeactivate *CFDeactivate)
{
__u8 *p;
dest[0] = 0x30; // sequence
dest[1] = 0; // length
p = &dest[2];
p += encodeEnum(p, CFDeactivate->Procedure);
p += encodeEnum(p, CFDeactivate->BasicService);
p += encodeServedUserNumber(p, CFDeactivate->ServedUserNumber);
dest[1] = p - &dest[2];
return p - dest;
}
int encodeInterrogationDiversion(__u8 *dest, struct FacReqCFInterrogateParameters *params)
{
__u8 *p;
dest[0] = 0x30; // sequence
dest[1] = 0; // length
p = &dest[2];
p += encodeEnum(p, params->Procedure);
#if 0
if (basicService == 0)
p += encodeNull(p);
else
#endif
p += encodeEnum(p, params->BasicService);
p += encodeServedUserNumber(p, params->ServedUserNumber);
dest[1] = p - &dest[2];
return p - dest;
}
2006-03-06 12:52:08 +00:00
int encodeInvokeDeflection(__u8 *dest, struct FacReqCDeflection *CD)
{
__u8 *p;
dest[0] = 0x30; // sequence
dest[1] = 0; // length
p = &dest[2];
p += encodeAddress(p, CD->DeflectedToNumber, CD->DeflectedToSubaddress);
p += encodeBoolean(p, CD->PresentationAllowed);
dest[1] = p - &dest[2];
return p - dest;
}