Sflow_agent.C
1) sfl_agent_init//对 agent 进行初始化
2) sfl_agent_release//将 agent 中的成员全部置为空
3) sfl_agent_tick
要调用 s_receiver_tick;sfl_sampler_tick; sfl_poller_tick;
由于一个 agent 包含多个 receiver,sampler 和 poller,因此 Sflow_agent.C 中还包括对他们的添
加、删除、查找、获取等一系列操作
Sflow_sampler.C
1) Init and reset 函数
2) 对各项属性值的设定和获取
3) s_sampler_tick//判断采样速率是否过快,将 samplesThisTick 赋给 samplesLastTick
4) sfl_sampler_writeFlowSample//对 flow sample 的 source_id 和 sequence_number 进行赋
值,生成完整的数据包,之后调用 sfl_receiver_writeFlowSample 函数
Sflow_poller.C
1) 与 Sflow_sampler.C 的结构差不多,但是是用来处理 counter sample 的。
2) s_poller_tick//用来判断何时采样
3) sfl_poller_writeFlowSample 需要调用 sfl_receiver_writeCountersSample 函数
Sflow_receiver.C
1) Init and reset
2) 各类写入函数,包括 put32, putNet32, putNet64,putString 等,用于将一个 32/64/128 位
数从主机字节顺序转换成网络字节顺序,并保存在 receiver->sampleCollector.datap 当前指
向的节点中,同时 datap 指针后移 1~4 位
3) computeFlowSampleSize//计算 flow sample 的大小
4) sfl_receiver_writeFlowSample//将一个 flow sample 的信息转存到链表 receiver->
sampleCollector.data 里面,data 中的信息结构如下(以 expanded flow sample,Iptype=I
pv4 为例)
对 IPtype 为 IPv4 的情况而言,每次对 receiver 的 sampleCollector 进行 reset 的时候,
将 datap 指针指向 data 链表的第 8 个节点,然后读入一个 ow sample,依次记录它的
packedSize,sequence_number 等属性,每在一个节点中记录一个信息之后,将
datap 后移一位,同时 sampleCollector 的 pktlen 增加一位。将这个 sample 的所有信
息记录完毕之后,再读入下一个 sample,重复记录过程。直到再读入 Sample 则超出了
sampleCollector 的数据最大容量时,将此链表的 5~8 位的数据进行更新,分别是 packet
SeqNo(每发送一次则加 1)、uptime 和 numSamples(即这个 packet 中的 sample 数量),
然后将这个数据包发送给指定的 Socket 地址,再对 sampleCollector 进行 reset,重复
上面的步骤。