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接口,传入变化的百分比数值,在被通知方一侧收到通知消息后进行相关操作