⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iannexe.h

📁 基于h323协议的软phone
💻 H
📖 第 1 页 / 共 3 页
字号:
/***********************************************************************
        Copyright (c) 2002 RADVISION Ltd.
************************************************************************
NOTICE:
This document contains information that is confidential and proprietary
to RADVISION Ltd.. No part of this document may be reproduced in any
form whatsoever without written prior approval by RADVISION Ltd..

RADVISION Ltd. reserve the right to revise this publication and make
changes without obligation to notify any person of such revisions or
changes.
***********************************************************************/

/* AnnexE internal structures. */

#ifndef _IAnnexE_H_
#define _IAnnexE_H_

#include "rvh323connection.h"
#include "rvlog.h"
#include "llist.h"
#include "hash.h"
#include "rvh323timer.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus*/


#if defined(RV_DEBUG)
#define RV_ANNEXE_DEBUG
#endif


/* Annex E Header structure
*******************************************************************************
*******************************************************************************

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    | VER |RES|H|L|A|                    SEQNUM                     |
    |---------------|---------------|---------------|---------------|
    |...

VER:    Version
        0 - current version
        7 - reserved for experimental use

RES:    Reserved
        0 - shall be zero

H:      Reply-Hint bit

L:      Length indicator. If set, a additional 4 octets are present

A:      Ack bit
        1 - indicates tha Ack is requested for this PDU

SEQNUM: unsigned integer between 0 and 16,777,215: the sequence number of this PDU
*/

#define AEH_SHFT_VER    5
#define AEH_SHFT_RES    3
#define AEH_SHFT_H      2
#define AEH_SHFT_L      1
#define AEH_SHFT_A      0

#define AEH_MASK_VER    0xe0 /* 1110 0000 */
#define AEH_MASK_RES    0x18 /* 0001 1000 */
#define AEH_MASK_H      0x04 /* 0000 0100 */
#define AEH_MASK_L      0x02 /* 0000 0010 */
#define AEH_MASK_A      0x01 /* 0000 0001 */

/*
typedef struct {
    RvUint8             FLAGS;

    RvUint8             SEQN[3];
} IAnnexEHeader;
*/

#define sizeof_IAnnexEHeader 4

#define IAnnexEHeader_FLAGS 0
#define IAnnexEHeader_SEQN  1

#define AEHGet_VER( IAnnexEHeader )     (((IAnnexEHeader)[IAnnexEHeader_FLAGS] & AEH_MASK_VER) >> AEH_SHFT_VER)
#define AEHGet_RES( IAnnexEHeader )     (((IAnnexEHeader)[IAnnexEHeader_FLAGS] & AEH_MASK_RES) >> AEH_SHFT_RES)
#define AEHGet_H( IAnnexEHeader )       (((IAnnexEHeader)[IAnnexEHeader_FLAGS] & AEH_MASK_H) >> AEH_SHFT_H)
#define AEHGet_L( IAnnexEHeader )       (((IAnnexEHeader)[IAnnexEHeader_FLAGS] & AEH_MASK_L) >> AEH_SHFT_L)
#define AEHGet_A( IAnnexEHeader )       (((IAnnexEHeader)[IAnnexEHeader_FLAGS] & AEH_MASK_A) >> AEH_SHFT_A)

#define AEHOr_VER( IAnnexEHeader, VER ) ((IAnnexEHeader)[IAnnexEHeader_FLAGS] |= ((VER) << AEH_SHFT_VER) & AEH_MASK_VER)
#define AEHOr_RES( IAnnexEHeader, RES ) ((IAnnexEHeader)[IAnnexEHeader_FLAGS] |= ((RES) << AEH_SHFT_RES) & AEH_MASK_RES)
#define AEHOr_H( IAnnexEHeader, H )     ((IAnnexEHeader)[IAnnexEHeader_FLAGS] |= ((((H) != 0)?1:0) << AEH_SHFT_H) & AEH_MASK_H)
#define AEHOr_L( IAnnexEHeader, L )     ((IAnnexEHeader)[IAnnexEHeader_FLAGS] |= ((((L) != 0)?1:0) << AEH_SHFT_L) & AEH_MASK_L)
#define AEHOr_A( IAnnexEHeader, A )     ((IAnnexEHeader)[IAnnexEHeader_FLAGS] |= ((((A) != 0)?1:0) << AEH_SHFT_A) & AEH_MASK_A)

#define AEHClr_VER( IAnnexEHeader )     ((IAnnexEHeader)[IAnnexEHeader_FLAGS] &= ~AEH_MASK_VER)
#define AEHClr_RES( IAnnexEHeader )     ((IAnnexEHeader)[IAnnexEHeader_FLAGS] &= ~AEH_MASK_RES)
#define AEHClr_H( IAnnexEHeader )       ((IAnnexEHeader)[IAnnexEHeader_FLAGS] &= ~AEH_MASK_H)
#define AEHClr_L( IAnnexEHeader )       ((IAnnexEHeader)[IAnnexEHeader_FLAGS] &= ~AEH_MASK_L)
#define AEHClr_A( IAnnexEHeader )       ((IAnnexEHeader)[IAnnexEHeader_FLAGS] &= ~AEH_MASK_A)

/*
payload count struct (after AE_Header): when the L bit is SET!

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    |.....|...|.|1|.|                    ......                     |
    |---------------|---------------|---------------|---------------|
    | PAYLOAD_COUNT |                    LENGTH                     |
    |---------------|---------------|---------------|---------------|
    |... payload(s) 0..PAYLOAD_COUNT

PAYLOAD_COUNT:  Total number of payloads in PDU-1

LENGTH:         Total length in OCTETs of all payloads (excluding header)
*/

/* FFU
typedef struct {
    RvUint8             PAYLOAD_COUNT;
    RvUint8             LENGTH[3];
} IAnnexEPayloadsCount;

#define sizeof_IAnnexEPayloadsCount 4
*/

/* Annex E payloads
*******************************************************************************
******************************************************************************/

/* Payload flags (first octet of payload)

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    | T |S|A|  RES  |...
    |---------------|

T:      Payload Type
        00 - Annex E Transport Messages
        01 - OBJECT IDENTIFIER typed messages
        10 - Static-Payload typed messages
        11 - Reserved for future use

S:      Signifies the presents of a Session field

A:      Signifies the presents of a Source/Destination Address field

RES:    Reserved for future use. Shall be zero!
*/

#define AEP_SHFT_T      6
#define AEP_SHFT_S      5
#define AEP_SHFT_A      4
#define AEP_SHFT_RES    0

#define AEP_MASK_T      0xc0 /* 1100 0000 */
#define AEP_MASK_S      0x20 /* 0010 0000 */
#define AEP_MASK_A      0x10 /* 0001 0000 */
#define AEP_MASK_RES    0x0f /* 0000 1111 */

/*
typedef struct {
    RvUint8             PFLAGS;

} IAnnexEPayloadHeader;
*/

#define sizeof_IAnnexEPayloadHeader 1
#define IAnnexEPayloadHeader RvUint8

#define AEPGet_T( IAnnexEPHeader )      (((IAnnexEPHeader) & AEP_MASK_T) >> AEP_SHFT_T)
#define AEPGet_S( IAnnexEPHeader )      (((IAnnexEPHeader) & AEP_MASK_S) >> AEP_SHFT_S)
#define AEPGet_A( IAnnexEPHeader )      (((IAnnexEPHeader) & AEP_MASK_A) >> AEP_SHFT_A)
#define AEPGet_RES( IAnnexEPHeader )    (((IAnnexEPHeader) & AEP_MASK_RES) >> AEP_SHFT_RES)

#define AEPOr_T( IAnnexEPHeader, T )    ((IAnnexEPHeader) |= ((T) << AEP_SHFT_T) & AEP_MASK_T)
#define AEPOr_S( IAnnexEPHeader, S )    ((IAnnexEPHeader) |= ((S) << AEP_SHFT_S) & AEP_MASK_S)
#define AEPOr_A( IAnnexEPHeader, A )    ((IAnnexEPHeader) |= ((A) << AEP_SHFT_A) & AEP_MASK_A)
#define AEPOr_RES( IAnnexEPHeader, RES) ((IAnnexEPHeader) |= ((RES) << AEP_SHFT_RES) & AEP_MASK_RES)

#define AEPClr_T( IAnnexEPHeader )      ((IAnnexEPHeader) &= ~AEP_MASK_T)
#define AEPClr_S( IAnnexEPHeader )      ((IAnnexEPHeader) &= ~AEP_MASK_S)
#define AEPClr_A( IAnnexEPHeader )      ((IAnnexEPHeader) &= ~AEP_MASK_A)
#define AEPClr_RES( IAnnexEPHeader )    ((IAnnexEPHeader) &= ~AEP_MASK_RES)

#define AEPT_TransportMessage       0
#define AEPT_OIDTypedMessage        1
#define AEPT_StaticMessage          2
#define AEPT_ReservedForFutureUse   3

/* Annex E payloads: IAnnexEPayloadHeader.T=00 - Annex E Transport Messages
*******************************************************************************

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    |0 0|0|0|  RES  |TRANSPORT_TYPE |...
    |---------------|---------------|

TRANSPORT_TYPE:     Annex E Transport Message Types
                    0   - I-Am-Alive message
                    1   - Ack message
                    2   - NAck message
                    3   - Restart message
                    -ff - reserved for future use
*/

/*
typedef struct {
    RvUint8             PFLAGS;

    RvUint8             TRANSPORT_TYPE;
} IAnnexET00Header;
*/

#define sizeof_IAnnexET00Header 2
typedef RvUint8 IAnnexET00Header;

#define IAnnexET00Header_PFLAGS 0
#define IAnnexET00Header_TRANSPORT_TYPE 1

#define AEPT00_IAmAlive             0
#define AEPT00_Ack                  1
#define AEPT00_NAck                 2
#define AEPT00_Restart              3

/*
    I-Am-Alive message

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    |0 0|0|0|  RES  |     0x00      |           VALIDITY            |
    |---------------|---------------|---------------|---------------|
    |          COOKIE_LENGTH      |P|   COOKIE[0].......COOKIE[n]
*/
/*
typedef struct {
    IAnnexET00Header    Header[sizeof_IAnnexET00Header];
    RvUint8             VALIDITY[2];
    RvUint8             COOKIE_LENGTH[2];
    RvUint8             COOKIE[1];
} IAnnexET00IAmAlive;
*/

#define sizeof_IAnnexET00IAmAlive_ND 6
typedef RvUint8 IAnnexET00IAmAlive;

#define IAnnexET00IAmAlive_Header 0
#define IAnnexET00IAmAlive_VALIDITY sizeof_IAnnexET00Header
#define IAnnexET00IAmAlive_COOKIE_LENGTH    (sizeof_IAnnexET00Header + 2)
#define IAnnexET00IAmAlive_COOKIE   (sizeof_IAnnexET00Header + 4)

#define IMAGet_P( IAnnexET00IAmAlive ) ((IAnnexET00IAmAlive)[IAnnexET00IAmAlive_COOKIE_LENGTH+1] & 0x01)
#define IMASet_P( IAnnexET00IAmAlive ) ((IAnnexET00IAmAlive)[IAnnexET00IAmAlive_COOKIE_LENGTH+1] |= 0x01)
#define IMAClr_P( IAnnexET00IAmAlive ) ((IAnnexET00IAmAlive)[IAnnexET00IAmAlive_COOKIE_LENGTH+1] &= 0xfe)

#define IMASet_CookieLen( IAnnexET00IAmAlive, size ) { \
    (IAnnexET00IAmAlive)[IAnnexET00IAmAlive_COOKIE_LENGTH] = (RvUint8)((size) >> 7); \
    (IAnnexET00IAmAlive)[IAnnexET00IAmAlive_COOKIE_LENGTH+1] = (RvUint8)((((size) << 1) & 0xfe) | IMAGet_P( IAnnexET00IAmAlive )); \
}

#define AsIAmAlive( payload ) \
    ((IAnnexET00IAmAlive*)(payload))

#define sizeof_IAmAliveHeader( payload ) \
    (sizeof_IAnnexET00IAmAlive_ND)

#define sizeof_IAmAliveCookie( payload ) \
    ((AsIAmAlive( payload )[IAnnexET00IAmAlive_COOKIE_LENGTH+1] >> 1) + \
     (AsIAmAlive( payload )[IAnnexET00IAmAlive_COOKIE_LENGTH] << 7))

#define sizeof_IAmAlive( payload ) \
    (sizeof_IAnnexET00IAmAlive_ND + sizeof_IAmAliveCookie( payload ))

/*
    Ack message

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    |0 0|0|0|  RES  |     0x01      |           ACK_COUNT           |
    |---------------|---------------|---------------|---------------|
    |                   SEQNUM[0]                   |    RESERVED   |
    |-----------------------------------------------|---------------|
    |                   .........                   |    RESERVED   |
    |-----------------------------------------------|---------------|
    |                   SEQNUM[n]                   |    RESERVED   |
    |-----------------------------------------------|---------------|
*/

/*
typedef struct {
    RvUint8             SEQNUM[3];
    RvUint8             RESERVED;
} IAnnexEAckData;
*/
#define sizeof_IAnnexEAckData 4
typedef RvUint8 IAnnexEAckData[sizeof_IAnnexEAckData];

#define IAnnexEAckData_SEQNUM 0
#define IAnnexEAckData_RESERVED 3

/*
typedef struct {
    IAnnexET00Header    Header[sizeof_IAnnexET00Header];
    RvUint8             ACK_COUNT[2];
    IAnnexEAckData      ACK[1];
} IAnnexET00Ack;
*/

#define sizeof_IAnnexET00Ack_ND 4
typedef RvUint8 IAnnexET00Ack;

#define IAnnexET00Ack_Header 0
#define IAnnexET00Ack_ACK_COUNT sizeof_IAnnexET00Header
#define IAnnexET00Ack_ACK (sizeof_IAnnexET00Header + 2)

#define AsAck( payload ) \
    ((IAnnexET00Ack*)(payload))

#define countof_AckData( payload ) \
    ((AsAck( payload )[IAnnexET00Ack_ACK_COUNT] << 8) + \
      AsAck( payload )[IAnnexET00Ack_ACK_COUNT+1])

#define sizeof_AckHeader( payload ) \
    (sizeof_IAnnexET00Ack_ND)

#define sizeof_AckData( payload ) \
    (countof_AckData( payload ) * sizeof_IAnnexEAckData)

#define sizeof_Ack( payload ) \
    (sizeof_IAnnexET00Ack_ND + sizeof_AckData( payload ))

/*
    NAck message

    |       0       |       1       |       2       |       3       |
    |0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|0-1-2-3-4-5-6-7|
    |---------------|---------------|---------------|---------------|
    |0 0|0|0|  RES  |     0x02      |           NACK_COUNT          |
    |---------------|---------------|---------------|---------------|
    |                   SEQNUM[0]                   |  DATA_LENGTH  |
    |-------------------------------|---------------|---------------|
    |            REASON0            |     DATA00.........DATA0m     |
    |-------------------------------|---------------|---------------|
    |                 ...........................                   |
    |-------------------------------|---------------|---------------|
    |                   SEQNUM[n]                   |  DATA_LENGTH  |
    |-------------------------------|---------------|---------------|
    |            REASONn            |     DATAn0.........DATAnm     |
    |-------------------------------|---------------|---------------|
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -