本篇文章将对ROHC压缩的数据结构和参数设置做一些说明,对于使用ROHC协议库进行研究测试提供一定的参考价值。
压缩器中定义了一个通用的上下文接口和一个统一的压缩类接口。
解压器的框架设计和压缩器的完全相同,也包括上下文接口和解压类接口。
字段名 | 含义 |
---|---|
id | 压缩类的唯一标识,系统中存在4个压缩类 |
protocol | 承载数据包的协议,如RTP、UDP、IP等 |
version | 压缩类的版本号 |
description | 有关压缩类的描述 |
create | 创建压缩时所需要的上下文 |
destroy | 销毁上下文 |
check_context | 检查一个待定的数据包是否属于该上下文 |
encode | 压缩方法 |
feedback | 对解压器发送过来的反馈信息的处理 |
//压缩类接口 sc_profile
struct sc_profile
{
unsigned short id; //Profile的ID
unsigned short protocol; //数据包协议
char *version; //版本字符串
char *description; //描述字符串
/* 基于给定包,新的context需要初始化时调用 */
int (*create)(struct sc_context *context, const struct iphdr *packet);
/* 销毁context中profile特定数据 */
void (*destroy)(struct sc_context *context);
/* 检验包是否属于给定的context(使用STATIC-DEF字段等) */
int (*check_context)(struct sc_context *context, const struct iphdr *packet);
/* 使用特定context压缩数据包,payload_offset指示payload起始位置 */
/* 成功返回压缩包大小,错误返回<=0 */
int (*encode struct sc_context *,const struct iphdr *packet,int packet_size, unsigned char *dest, int dest_size, int *payload_offset);
/* 当上下文反馈到达时调用 */
void (*feedback)(struct sc_context *, struct sc_feedback *);
};
字段名 | 含义 |
---|---|
cid | 该上下文的唯一标识 |
used,last_used,first_used | 上下文是否可用,最近使用时间,创建时间 |
profile_id | 上下文所对应的压缩类id |
profile | 上下文所对应的压缩类 |
compressor | 该上下文所属于的压缩器 |
c_mode | 该上下文所处的模式,包括U,O,R三种模式 |
c_state | 该上下文所处状态,包括NC,SC,FC三种状态 |
nbo,rnd | nbo代表网络字节序,rnd代表IP-ID的值是否随机 |
data | 各上下文中的私有部分,不同上下文它指向的结构不同 |
//上下文接口 sc_context
struct sc_context
{
int used; //1-used,0-unused
int last_used; //该上下文被创建的时间
int first_used; //该上下文最近使用的时间
int cid;
int profile_id;
struct sc_profile *profile;
struct sc_rohc *compressor;
C_MODE c_mode;
C_STATE c_state;
int nbo,rnd;
/* profile的特定数据 */
void *data;
/* 统计信息 */
int total_uncompressed_size,total_compressed_size;
int header_uncompressed_size,header_compressed_size;
int send_packets,num_send_ir,num_send_ir_dyn,num_recv_feedbacks;
struct sc_wlsb *total_16_uncompressed,*total_16_compressed;
struct sc_wlsb *header_16_uncompressed,*header_16_compressed;
};
字段名 | 含义 |
---|---|
enabled | 压缩器是否可以使用 |
max_cid | 支持的最大上下文id值,如果为small_cid,值为16 |
large_cid | 是否使用large_cid,large_cid可以支持65535个上下文 |
num_used | 正在使用中的上下文数量 |
num_allocated | 压缩器已经分配好空间的上下文数量 |
contexts | 指向使用中的上下文的首地址 |
profiles | 标识压缩器所激活的压缩类,1代表激活,一共4类 |
mrru,connection_type | 链路的最大传输单元以及链路的类型 |
//压缩器接口 sc_rohc
struct sc_rohc
{
int enabled;
int max_cid; //smallCID = [0,15],largeCID = [0,65535]
int large_cid;
int num_used;
int num_allocated;
struct sc_context *contexts; //已分配的contexts
int profiles[C_NUM_PROFILES];
int mrru; //Maximum reconstructed reception unit (==0)
int connnection_type;
int num_packets; //已发包的总数
int total_compressed_size,total_uncompressed_size;
};
字段名 | 含义 |
---|---|
id | 解压类的唯一标识,系统中存在4个解压类 |
decode | 解压除IR包以外的所有压缩包 |
decode_ir | 解压IR包 |
allocate_decode_data | 为解压器中一个上下文的特有部分数据分配空间 |
free_decode_data | 释放相应的空间 |
detect_ir_size | 得到IR包报头部分长度 |
detect_ir_dyn_size | 得到IR-DYN包报头部分长度 |
get_sn | 取得该上下文中上个成功解压的包的序号 |
//解压类接口 sd_profile
struct sd_profile
{
int id; //0x0000用于未压缩
char *version;
char *description;
int (*decode)(struct sd_rohc *state, struct sd_context *context, unsigned char *src, int size, int second_byte, unsigned char *dest);
int (*decode_ir)(struct sd_rohc *state, struct sd_context *context, unsigned char *src, int size, int last_bit, unsigned char *dest);
void *(*allocate_decode_data)(void);
void (*free_decode_data)(void *);
int (*detect_ir_size)(unsigned char *first_byte, int second_byte_add);
int (*detect_ir_dyn_size)(unsign char *first_byte,struct sd_context *context);
int (*get_sn)(struct sd_context *context);
};
//上下文接口 sd_context
struct sd_context
{
struct sd_profile *profile; //已使用的profile
void *data; //profile相关context的数据
int mode; //U_MODE,O_MODE,R_MODE
int state; //NO_CONTEXT,STATIC_CONTEXT,FULL_CONTEXT
int latest_used,first_used; //时间戳
int ack_num; //解码成功ack_num++,当ack_num == ACK_NUM解压器生成一个ACK信息
/* 以下是静态变量 */
int total_uncompressed_size,total_compressed_size;
int header_uncompressed_size,header_compressed_size;
int num_recv_packets,num_recv_ir,num_recv_ir_dyn,num_sent_feedbacks;
int num_decomp_failures,num_decomp_repairs;
struct sc_wlsb *total_16_uncompressed,*total_16_compressed;
struct sc_wlsb *header_16_uncompressed,*header_16_compressed;
};
字段名 | 含义 |
---|---|
context | 解压器中的上下文 |
context_array_size | 解压器中上下文的数量 |
cid_type | cid的类型 |
max_cid | 解压器所支持的最大的cid值 |
compresseor | 解压方的压缩器,只存在于双向模式下 |
statistics | 解压器中的统计信息 |
//解压器 sd_rohc
struct sd_rohc
{
struct sd_context **context;
int context_array_size;
int cid_type; //large or small cid
int max_cid; //最大cid值
struct sc_rohc *compressor;
struct sd_statistics statistics;
};
在整个ROHC的设计流程中,一些参数:滑动窗口宽度,n1和k1、n2和k2、TIMEOUT_1、TIMEOUT_2、TIMEOUT_3、NO PACKET_1、NO PACKET_2以及NO PACKET_3,会直接影响ROHC的工作性能。
2017.05.02