1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/*****************************************************************************
*
* Filename:
* ---------
* ccmni_pfp.h
*
* Project:
* --------
* YuSu
*
* Description:
* ------------
* MT6516 Cross Chip Modem Network Interface - Packet Framing Protocol
*
* Author:
* -------
* Stanley Chou (mtk01411)
*
****************************************************************************/
#ifndef __CCCI_CCMNI_PFP_H__
#define __CCCI_CCMNI_PFP_H__
/* Compile Option to decide if DYNAMIC_MULTIPLE_FRAME encode/decode is supported or not */
#define MAX_PDP_CONT_NUM 3
#define PFP_FRAME_START_FLAG 0xF9
#define PFP_FRAME_MAGIC_NUM 0x66
/* MAX_PFP_LEN_FIELD_VALUE is the maximum size of one IP Packet */
#define MAX_PFP_LEN_FIELD_VALUE 1500
#define FREE_RAW_DATA_BUF_SIZE 2048
#define FREE_COOKED_DATA_BUF_SIZE 2048
#define SUPPORT_FRAME_NUM 1
#define SUPPORT_PKT_NUM 1024
enum frame_flag_t
{
FRAME_START = 0,
FRAME_CONTINUOUS,
FRAME_END
};
enum unframe_state_t
{
PARSE_PFP_FRAME_START_FLAG_STATE = 0,
PARSE_PFP_FRAME_MAGIC_NUM_STATE,
PARSE_PFP_FRAME_LENGTH_FIELD_STATE,
PARSE_PFP_FRAME_GET_DATA_STATE
};
/* Following implementations are designed for PFP(Packet Frame Protocol) */
typedef struct
{
int frame_size;
unsigned char *frame_data;
} frame_format_t;
typedef struct
{
int num_frames;
int pending_data_flag;
int consumed_length;
#ifdef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__
frame_format_t *frame_list;
#else
frame_format_t frame_list[SUPPORT_FRAME_NUM];
#endif
} frame_info_t;
typedef struct _complete_ippkt_t
{
int pkt_size;
unsigned char *pkt_data;
#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__
int entry_used;
#endif
struct _complete_ippkt_t *next;
} complete_ippkt_t;
typedef struct _packet_info_t
{
int num_complete_packets;
int consumed_length;
int try_decode_again;
enum unframe_state_t parse_data_state;
complete_ippkt_t *pkt_list;
} packet_info_t;
typedef struct _ccmni_record_t
{
/* Next expected state to be parsed while entering the pfp_unframe() again */
enum unframe_state_t unframe_state;
/* Record the latest parsed Packet length for getting the data */
int pkt_size;
/* For fast to find the last node of pkt_list to insert a new parsed IP Pkt into this pkt_list */
complete_ippkt_t *last_pkt_node;
} ccmni_record_t;
extern ccmni_record_t ccmni_dev[];
/* The following buffers are used for testing purpose */
/* Store one IP Packet data */
extern unsigned char frame_cooked_data [];
/* Pack the IP Packet into a Frame sent to Modem */
extern unsigned char frame_raw_data [];
extern unsigned char unframe_raw_data [];
extern unsigned char unframe_cooked_data[];
void pfp_reset (int ccmni_inx);
frame_info_t pfp_frame (unsigned char* raw_data, unsigned char* cooked_data,
int cooked_size, int frame_flag, int ccmni_inx);
packet_info_t pfp_unframe(unsigned char* cooked_data, int cooked_data_buf_size,
unsigned char* raw_data, int raw_size, int ccmni_inx);
void traverse_pkt_list(complete_ippkt_t *node);
#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__
complete_ippkt_t* get_one_available_complete_ippkt_entry(void);
void release_one_used_complete_ippkt_entry(complete_ippkt_t* entry);
#endif
#endif // __CCCI_CCMNI_PFP_H__
|