FAST的核心优点是支持软硬协同的分组处理。在FAST架构中,用户在Linux用户空间编写的进程称为UAUser Application)。在FAST硬件流水线确定后,用户可通过UA编程实现对硬件流水线的控制,从硬件流水线接收分组,或将分组发往硬件流水线进行处理和转发。

一、Fast_packet数据结构

Fast_packetUA编程必须使用的核心数据结构,UA通过FAST编程API收发的分组均使用Fast_packet结构定义。fast_packet主要由用户模块(UM)头标识,对齐标志以及完整的以太网报文三部分组成,如下所示。

struct fast_packet

{

       union

       {

              struct  um_metadata um;  /* UM模块数据格式定义*/

              struct  ctl_metadata cm;          /*<控制报文格式定义*/

           struct  common_metadata md;  /*报文类型(0:数据,1:控制)*/

       };

       u16  flag;                     /* 2字节对齐标志*/

       u8 data[1514];           /*完整以太网报文数据,不含CRC数据*/

};

 

Fast报文分为数据报文和控制报文两种类型。数据报文的data中存储完整以太网报文,用于UAFAST流水线之间,以及UA之间分组的交换;Fast控制报文用于UA Fast流水线之间的控制通信,如UA对流水线中相应模块中寄存器、计数器和控制表的读写等操作。控制报文的data值为空。

Flag字段为2字节,主要有两个作用。一是将14字节的以太网头补齐为16字节,将IP分组的头对齐到16字节边界,便于软硬件的处理。二是FAST内核软件使用该标志来标记FAST报文。用户可以不初始化和使用该字段。

二、um_metadata结构定义

FAST数据报文中的um_metadata结构负责在软硬件模块之间传递分组的元数据信息,主要包含报文时间戳,序号,源目的MID,报文长度,端口号等,详细定义如下:

/* LITTLE_ENDIAN */

struct um_metadata{

       u64  ts:32,     /*报文接收时间戳*/

              reserve:17,          /* 保留*/

              pktsrc:1,                 /*分组的来源,0为网络接口输入,1CPU输入*/

              flowID:14;            /*ID*/

       u64 seq:8,                   /*报文接收时的序列号*/

              pst:8,                   /*标准协议类型(参考硬件定义)*/

              dstmid:8,             /*报文下次处理的目的模块编号*/

              srcmid:8,             /*报文上次处理时的模块编号*/

              len:12,                 /*报文长度*/

              discard:1,            /*丢弃位,默认为0表示不丢弃,置1时表示丢弃*/

              priority:3,            /*分组优先级*/

              outport:6,            /*单播表示分组输出端口ID;组播/泛洪表示组播/泛洪表地址索引*/

              outtype:2,            /*输出类型,00单播,01组播,10泛洪,11从输入接口输出*/

              inport:6,               /*输入端口号*/

              pktdst:1,              /*报文目的,0表示到网络端口,1示到CPU*/

            pkttype:1;            /*报文类型,0:数据报文,1:控制报文。*/           

       u64  user[2];         /*用户自定义metadata数据格式与内容*/

};

UA编程时,需要对um_metadata结构体中的discardpktdstpktsrcoutportdstmidsrcmidinportflowIDlen等字段进行初始化。

discard表示报文是否丢弃,默认为0,表示不丢弃,置1时表示丢弃,如执行ddos防御策略时,异常报文流要丢弃,此时discard必须设置为1

pktdstpktsrc标识报文的输入输出方向,0表示输出到网络端口,1表示输出到CPU。如UA处理后的报文需要发送到网络中,则应该设置pktsrc1pktdst0

inportoutport标识报文从设备的物理端口输入输出,一般是结合流表规则一起使用;

dstmidsrcmid标识报文下次处理的目的模块编号和上次处理时的模块编号。如UA处理后的报文需要发送到网络中,则dstmid设置为5

flowID字段由FAST UM填充,标识着报文命中了哪一条流表;

len表示整个FAST报文长度(包含UM头,对齐标志和完整以太网报文)。FAST平台报文缓存区最大为2048,完整以太网报文的MTU不超过1518

Pkttype字段表示报文类型,0为数据报文,1为控制报文。

三、ctl_metadata结构定义

FAST平台控制报文对应的控制信息为ctl_metadata,包含值、掩码、地址、源目的MID、类型、报文类型等,详细定义如下。

 

struct ctl_metadata

{

       u64  data:32,

              mask:32;

       u64  addr:32,

              dstmid:8,

              srcmid:8,

              seq:12,

              type:3,

              pkttype:1;

       u64  reserve;

       u64  sessionID;

};

 

需要注意的是,用户在UA编程时不需要自己构造Fast控制报文,而是通过调用FAST编程API提供的fast_ua_hw_rd()函数来实现对硬件流水线的管理。FAST 编程API的使用说明将在后续文章中介绍。

分类: FAST Spec

发表评论

电子邮件地址不会被公开。 必填项已用*标注