IXP2400 Dispatch Loop 介绍
作者:梁剑
Email:ixp2xxx@yahoo.com
2005-12-29
【摘要】
本文主要介绍在Intel IXP2400 下的Dispatch Loop 函数和变量。目的尽量利用已经存在的函数来设计Microblock,使代码更加健壮、易懂、维护。
【关键字】
Dispatch Loop、Buffer handle、Meta data
【正文】
Mes中的Microblocks使用Dispatch Loop实现数据流之间的交换。同时Dispatch Loop也可以Cache 寄存器和Local Memory中的变量,这些变量可以通过一些列的宏(macros)来访问。Dispatch Loop提供source 和 sink blocks来接收和发送包给Xscale core 或不同的Microblocks组。
Dispatch Loop通过使用寄存器或Local Memory维护一些全局变量,以下是可以Cache的变量。
|
变量 |
长度 |
描述 |
|
Block_id |
8bits |
Mcroblocks必须设置这个变量来和XScale core通讯以便表示一个exception。充当通信ID的作用。 |
|
Exception_code |
8bits |
当一个buffer发送给XScale core的时候Microblock需要设置这个变量。 |
|
Dl_next_block |
8bits |
当前的block处理完成之后设置这个变量表示谁将成为下一个逻辑处理块。 |
|
Dl_buf_handle |
32bits |
这个buffer handle包括了起始包等各种信息 |
|
Dl_eop_buf_handle |
32bits |
这个buffer handle 包括了结束包等信息 |
|
Buffer_next |
32bits |
下一个buffer handle |
|
Buffer_size |
16bits |
当前起始包的buffer 长度 |
|
Packet_size |
16bits |
包的总长度 |
|
Buffer_offset |
16bits |
Buffer中数据偏移量 |
|
Input_port |
16bits |
包接收的逻辑端口(0-255) |
|
Next_hop_id |
32bits |
下一跳IP ID |
以上变量中一般情况下dl_buf_handle、dl_eop_buf_handle、dl_next_block作为全局变量。
IXA SDK 提供一些列buffer分配、释放、修改IP头部信息的宏。例如:Meta data、Extended meta data、signalling、Excepiton Handling、IP Header Caching等API。下面我们介绍Meta data、Excepiton Handling、IP Header Caching的API。
1. Dl_buf_init[]
初始化buffer。
2. Dl_buf_alloc[]
分配一个packet buffer。如果失败buffer_handle为0。
#macro dl_buf_alloc[buf_handle, free_list, req_sig, sig_action]
Buffer_handle必须是一个传输寄存器。
3. Dl_buffer_free[]
释放用dl_buffer_alloc分配的buffer。
4. Dl_buf_get_desc[]
输入buffer handle将返回meta_data在SRAM中的地址(也叫做buffer descriptor),其实buffer handle的低24bits就是meta data的SRAM地址。
#macro dl_buf_get_desc[sram_offset, buf_handle]
Sram_offset:buffer的meta data的SRAM byte地址。
5. Dl_buf_get_data[]
从给出的buffer handle得到包数据部分在SDRAM中的地址。Buffer handle低24bits是meta data在SRAM offset,通过在offset可以计算出DRAM offset。
meta=buf_handle & 0xffffff;
index=(meta - sram_base) / sizeof (meta_data)
data =sdram_base + index * size_of_packet_buffer_in_dram
#macro dl_buf_get_data[sdram_offset, buf_handle]
Sdram_offset:packet buffer的SDRAM offset地址
6. Dl_meta_init_cache[]
用指定的值初始化dl_meta寄存器。
7. Dl_meta_load_cache[]
从SRAM装载(cache)meta data到寄存器中。
8. Dl_meta_flush_cache[]
GPR中的meta data 写回SRAM中。
9. Dl_buf_drop[]
Drop一个buffer(single)
10. Dl_meta_get_input_port[]
Packet was received port
11. Dl_meta_set_input_port[]
设置接收的input port。
#macro dl_meta_set_input_port[input_port]
Input_port 16bits
12. Dl_meta_get_packet_size[]
13. Dl_meta_set_packet_size[]
14. Dl_meta_get_nexthop_id[]
15. Dl_meta_set_nexthop