五月天视频苹果下载 -五月天app官网无限观看
0731-84728105
15116127200
二层交流机原型设计与完成 (七)
宣布时间 :2021-06-09
     上一篇讲述了bitmap的端口表现 要领,也讲了单播只用通例要领表现 的缘故原由 ,故五月天app官网无限观看只需求 对多播的转揭晓 举行 照应 的定制和处置赏罚 即可。单播和多播的地址区分也已在上篇文章中交待明晰 ,本篇重点讲述如那里 置赏罚 多播数据。
     凭证 前篇剖析 ,多播表的界说只是将其端口号字段的表述举行 了重界说。故多播表的界说只需求 将单播表复制一份即可,只是在处置赏罚 多播数据时,对端口字段的运用 有些纷歧样。

struct table_port_mac *obx_mc_mac_tbl = NULL;/*界说多播MAC转揭晓 工具为空指针,将在main函数中初始地址*/
/*为多手播MAC转揭晓 分配内存,并初始数据为0*/
obx_mc_mac_tbl = (struct table_port_mac *)malloc(sizeof(struct table_port_mac));
memset(obx_mc_mac_tbl,0,sizeof(struct table_port_mac));

     本交流机原型中,五月天app官网无限观看仅支持IGMP v3版本,故只对该版本协议举行 剖析 处置赏罚 ,对组播的入组与退组处置赏罚 只需求 处置赏罚 IGMPv3 的Report分组协议即可。
     剖析 IGMP协议五月天app官网无限观看需求 体恤 的分组字段如下:
     1)IGMP的组播IP地址为224.0.0.22,多播MAC为:01:00:5E:00:00:16
     2)以太网帧类型为IPv4(0x0800)
     3)IP协议号为IGMP(0x2)
     4)IGMP协议的type字段为0x22(V3 report)
     相关的协议数据结构 界说在以下几个系统 头文件中,将其添加到代码头部。

#include /*ethhdr*/
#include /*iphdr*/
#include /*igmvp_report*/

     1)多播剖析
     多播首先判别 MAC地址的第1字节的最低位,疏散出多播分组,然后再准确 挑选 出组播入组与退组的通告旧事 。

if(pkt->data[0]&0x1)//MC MAC
{
u64 igmpv3_dmac = 0x1600005E0001;
if(!ether_addr_equal(pkt->data,(u8 *)&igmpv3_dmac)) //IGMP
{
struct ethhdr *eth = (struct ethhdr *)pkt->data;
struct iphdr *ip = (struct iphdr *)(eth+1);
int oft = 0;
if(eth->h_proto = htons(0x0800) && ip->protocol == IPPROTO_IGMP)
{
oft = sizeof(*eth) + ip->ihl * sizeof(int);
igmpv3_report(pkt->um.inport,pkt->data+oft);
}
}
}

     2)多播学习
     准确 挑选 出IGMP的Report分组后,即可 凭证 协议字段区分是入组旧事 或是退组旧事 。该步最焦点的一步是要将IGMP中的组播IP地址转换为多播MAC,并将该MAC旧事 学习到多播MAC转揭晓 中。多播MAC的转换规则有明白 的界说要求,简言之就是MAC地址由三局限 组成:高24位牢靠 为01:00:5E,第23位为0,低23位为组播IP的低23位。

void igmpv3_report(u8 inport,u8 *igmp)
{
struct igmpv3_report *g3r = (struct igmpv3_report *)igmp;
if(g3r->type == IGMPV3_HOST_MEMBERSHIP_REPORT)/*IGMPv3_REPORT*/
{
u8 mc_mac[MAC_LEN] = {0x01,00,0x5E};
u8 *mcip = NULL;
int k = 0;
for(;kngrec);k++)
{
mcip = (u8 *)&g3r->grec[k].grec_mca;
memcpy(&mc_mac[3],&mcip[1],3);/*仅复制后3字节数据*/
mc_mac[3] &= 0x7F;/*将第23bit置0*/
join_leave_mc_mac(inport,mc_mac,g3r->grec[k].grec_type);
}
}
}

     多播MAC的学习历程封装在join_leave_mc_mac函数中,其焦点职掌 要领与单播MAC的学习历程相似 ,只是在对端口号的处置赏罚 分别 。

if(type == IGMPV3_CHANGE_TO_EXCLUDE)/*入组*/
{
obx_mc_mac_tbl->row[i].port |= 1<}
else/*退组*/
{
obx_mc_mac_tbl->row[i].port &= ~ (1<}

     3)多播查表
     多播的查表与单播完全分歧 ,只是查表的工具换成多播表,这两个查表历程可以代码优化成一个成效 函数。
     4)多播输入
     多播的输入 端口信息存储在前往 值的每个bit位上,故需求 凭证 输入 端口的bit位能否 为1来作为分组输入 判别 依据 。单播和多播的一致 输入 函数如下:

void output(u8 outtype,int outport,struct fast_packet *pkt)
{
if(outtype == UC)
{
pkt->um.outport = outport;
pkt_send_normal(pkt,pkt->um.len);
}
else
{
int i = 0;
for(;i {
if(pkt->um.inport != i && (outport & (1< 0)
{
pkt->um.outport = i;
pkt_send_normal(pkt,pkt->um.len);
}
}
}
}

     一定要记得,底层API的输入 端口号是通例表现 要领,在多播输入 时的端口号应当 是变量i的值。
     1)确定协议支持
     硬件适宜 做简朴 、确定的事情,软件适宜 做无邪 多变的事情。故若在硬件中支持组播的参与 和参与 ,简质朴 现就是支持确定性的IGMPv3协议的Report成效 ,硬件可以不像软件一下逐层剖析 协议,可以直接将对应几个位置 的数据都取出来之后一次判别 ,切合要求的旧事 即可继续 完成后续成效 。硬件不如软件无邪 ,对每一种确定协议的支持都需求 确定的逻辑支持 ,以是 关于 竞赛 严重 的协议交互,一样往常 在要装备 中参与 轻量级的CPU举行 处置赏罚 。一样往常 像确定的组播协议可以放到FPGA完成 ,而天生 树协议不适宜 FPGA完成 。
     2)MAC表的老化
     老化简朴 来说就是删除长时间 不运用 的表项,把空间留出来给新的MAC地址运用 。老化是为相识 决MAC地址数目 大于转揭晓 空间容量的效果 。若有些MAC地址运用 一段时间 之后,就不时 不再运用 或关机,则交流机无需再保管 其在MAC转揭晓 中。若不删除,则会招致 新的MAC表找不到存储空间,招致 少量 的数据转化为泛洪发送,对整个网络来说是灾难性的,不成 容忍的。虽然,不计本钱 的扩展 存储容量更是不成 取的。故MAC表的老化是十分 需要 的,下篇主要 内容讲述MAC表老化。
      接待您和先生 们参与 FAST开源项目群相反 与讨论 ,一同 体验纷歧样的系统 设计历程。请先加微信号15116127200后约请 入群。

关注FAST开源社区
FAST逐一 开源、开放、高速、高效、可编程、可界说!软硬件协同并行处置赏罚 。