sonic端口限速模块

sonic端口限速

实现流程

程序设计图
DB Schema:

PORT: PORT TABLE in config DB.
program:
%STRING: ingress_policer_name
%STRING: egress_policer_name
%STRING: storm_flood
%STRING: storm_broadcast
%STRING: storm_multicast

POLICER: POLICER TABLE in config DB.
program:
%STRING : cir
%STRING : cbs
%STRING : meter_type
%STRING : mode
%STRING : action

1:创建policer,配置cir/cbs/以及meter_type;修改config_db中的表项POLICER
2:Orchdaemon.cpp中init时,创建policer对象,订阅POLICER 表
PolicerOrch *policer_orch = new policerOrch(m_config, “POLICER”)
3:policerorch中收到发生变化的字段packet_action/
policer_mod/meter_type/CIR/CBS;下发到sai,sai_policer_api->create_policer;生成对应policer_oid并存储起来
4:PORT_TABLE中有关policer的字段发生变化, ingress_policer_name
egress_policer_name
storm_flood
storm_broadcast
storm_multicast
以上均以policer_name作为标识,portsorch通过policer对象访问policer类中数据,根据policer_name获取存储的policer_oid;
5:portsorch,下发标识policer的policer_oid,标识端口的port_id以及标识类型的attriid
SAI_PORT_ATTR_INGRESS_RATE_LIMIT_POLICER
SAI_PORT_ATTR_EGRESS_RATE_LIMIT_POLICER
SAI_PORT_ATTR_FLOOD_STORM_CONTROL_POLICER_ID
SAI_PORT_ATTR_BROADCAST_STORM_CONTROL_POLICER_ID
SAI_PORT_ATTR_MULTICAST_STORM_CONTROL_POLICER_ID

限速百分比功能的实现

在使用过程中,有按照端口百分比做配置实现限速的需求;当前芯片本身没有能力支持该配置,所以尝试在逻辑上实现百分比功能实现流程
百分比配置的policer,对于policerorch来讲和普通policer区别在于percent配置的policer不会在policerorch中调用sai接口,生成实际的policer,单纯记录该Policer的百分比数值,在port发生绑定时,从policerorch中获取百分比数值;
通知机制的实现
class Observer
{
public:
virtual void update(SubjectType, void *) = 0;
virtual ~Observer() {}
};

class Subject
{
public:
virtual void attach(Observer *observer)
{
m_observers.push_back(observer);
}

virtual void detach(Observer *observer)
{
    m_observers.remove(observer);
}

virtual ~Subject() {}

protected:
list<Observer *> m_observers;

virtual void notify(SubjectType type, void *cntx)
{
    for (auto iter: m_observers)
    {
        iter->update(type, cntx);
    }
}

};
通知方继承(policerOrch)Observer,被通知方继承(portsOrch)Subject
被通知方(1):
gPortsOrch = new PortsOrch(m_applDb, ports_table, policer_orch):
m_policerOrch->attach(this)
传入通知方对象,将被通知方作为通知成员加入通知单;
通知方(2):
notify(SUBJECT_TYPE_POLICER_PERCENT_CHANE,static_cast<void *>(&PolicerPercent_info_t))
按照通知类型,通知通知单中的对象更新
被通知方(3):
通知方通过调用通知方对象调用对象中update接口,传入变化的百分比数值,在被通知方一侧收到通知消息后进行相关操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值