# EthAgent Version: rdkb-2022q3-dunfell Mxl Version ## EthAgent Start up Entry Point: plugin_main.c: `CosaEthernetCreate()` ### CosaEthernetInitialize - Assign callback function for lowlayer link event(Link Up/Down). ```c 379 obj.pGWP_act_EthWanLinkDown = EthWanLinkDown_callback; 380 obj.pGWP_act_EthWanLinkUP = EthWanLinkUp_callback; ``` - CosaDmlEthInit - CosaDmlEthPortInit - Initialize `gpstEthGIno[index]` from `/nvram/bbhm_cur_cfg.xml` #MxlModified - rdkb/meta-rdk-soc-mxl-urx/meta-urx-rdkbos-compat/recipes-ccsp/ccsp-eth-agent/files/eth_apis_dynamic_eth_names.patch - xml node --> `dmsb.ethagent.if.%d.Name` - TR181 node --> `Device.Ethernet.X_RDK_Interface.{i}.Name` - GetWan_InterfaceName(ifname) - Read `wanoe_ifname` from `ethWANPort` from `/nvram/syscfg.db`, port number mapping info is saved at `/etc/interface_map.cfg` #MxlModified - Locate at sdk/urx_rdkb_hal/hal-ethsw-urx/src/ccsp_hal_ethsw.c - You can check this value by `syscfg get ethWANPort` - CosaDmlEthSetPhyPathForWanManager(ifname) - Notify WanManager wanoe_ifname - CosaDmlEthPortGetCopyOfGlobalInfoForGivenIfName(ifname) - Get copy from gpstEthGInfo - `Device.Ethernet.X_RDK_Interface.{i}.` - CosaDmlEthGetLowerLayersInstanceInOtherAgent() - WanManager `Device.X_RDK_WanManager.CPEInterface.%d.Name` - Looking for the wanoe_ifname in `CPEInterface.{i}.Name` - `CPEIntreface.{i}.Name` is read from `dmsb.wanmanager.if.{i}.Name` in `/nvram/bbhm_cur_cfg.xml` - CosaDmlEthPortGetIndexFromIfName() - Get the index of wanoe_name in `Device.Ethernet.X_RDK_Interface.` - Set `Device.X_RDK_WanManager.CPEInterface.{i}.Phy.Path` by the index get from CosaDmlEthPortGetIndexFromIfName() - CosaDmlEthTriggerEventHandlerThread() - Monitor for the link status event and notify the other agents - Once received link event, envoke corresponding callback function, `EthWanLinkUp_callback()` - CcspHalEthSwInit() - Initialise ethsw-hal to get event notification from lower layer. - Used to monitor wanoe ifname Link status(dmesg) - If wanoe_ifname link up, queue event. - `sdk/urx_rdkb_hal/hal-ethsw-urx/src/ccsp_hal_ethsw.c` - When wanon_ifname link up, notify WanManager `Phy.Status` up and set `X_RDK_Interface.1.Status` up - `CosaDmlEthSetPhyStatusForWanManager(WanOEInterface, WANOE_IFACE_UP);` - `gpstEthGInfo[ifIndex].LinkStatus = ETH_LINK_STATUS_UP;` ### Recap | Name | Purpose | Initial Value <br/>comes From | | --------------------------------------------------- | ------------------------------------------------------- | ----------------------------- | | ethWanPort | Decide Wan Port | /nvram/syscfg.db | | Device.Ethernet.X_RDK_Itnerface. | TR181 nodes for EthAgent | CosaDmlEthPortInit() | | Device.Ethernet.X_RDK_Itnerface.{i}.Name | Lower Layer Ethernet Name, should map to driver | /nvram/bbhm_cru_cfg.xml | | Device.Ethernet.X_RDK_Itnerface.{i}.Status | Link Status used for EthAgent SM | CosaDmlEthPortInit() | | Device.X_RDK_WanManager.CPEInterface.{i}. | TR181 nodes for WanManager | /nvram/bbhm_cru_cfg.xml | | Device.X_RDK_WanManager.CPEInterface.{i}.Phy.Path | Ethernet.X_RDK_Interface.{i}. Later used by VlanManager | WanMgr_WanConfigInit() | | Device.X_RDK_WanManager.CPEInterface.{i}.Phy.Status | Link Status used for WanManager SM | WanMgr_WanConfigInit() | | | | | --- ## Upstream Event Device.Ethernet.X_RDK_Interface.{i}.Upstream Up Once EthAgent Receives event of Upstream UP, EthgAgent starts StateMachine to deal with Eth Link Status. ```ad-info Upstream Event will be send by WanManager when Wan interface is choosen. Refer to WanManager Policy. ``` cosa_ethernet_apis.c: `CosaDmlEthPortSetUpstream(&stSMPrivateInfo)` ### CosaDmlEthPortSetUpstream() Pass the Interface of which the Upstream flag is set to StateMachine. ```c //CosaDmlEthPortSetUpstream() 3013 gpstEthGInfo[IfIndex].Upstream = Upstream; 3014 snprintf(stSMPrivateInfo.Name, sizeof(stSMPrivateInfo.Name), "%s", gpstEthGInfo[IfIndex].Name); ... 3021 CosaEthManager_Start_StateMachine(&stSMPrivateInfo); //CosaEthManager_Start_StateMachine 102 memcpy(pstInfo, pstMPrivateInfo, sizeof(ETH_SM_PRIVATE_INFO)); ``` stGlobalInfo is from `memcpy(pGlobalInfo, &gpstEthGInfo[LineIndex], sizeof(COSA_DML_ETH_PORT_GLOBAL_CONFIG));` - CosaEthManager_Start_StateMachine - STATE_EXIT - If (TRUE == stGlobalInfo.Upstream), goto STATE_ETH_DISCONNECTED - STATE_ETH_DISCONNECTED - if ((ETH_LINK_STATUS_UP == stGlobalInfo.LinkStatus) && (ETH_WAN_DOWN == stGlobalInfo.WanStatus)) - WanStatus is set by VlanManager when Vlan Interface created. - Transition_EthPhyInterfaceUp - Goto `STATE_ETH_VALIDATING_LINK` - STATE_ETH_VALIDATING_LINK - Transition_EthWanLinkFound() - CosaDmlEthCreateEthLink() - Set `X_RDK_Ethernet.Link.{i}.Enable` Enable - Trigger VlanBridgingManager: `DmlCreateEthInterface` - VlanBridgingManager: `DmlCreateEthInterface` will set `WanStatus` Up - Set other settings regarding `X_RDK_Ethernet.Link.{i}.` - Name, Alias, BaseInterface, Lowerlayers - Goto `STATE_ETH_VLAN_CONFIGURING` - STATE_ETH_VLAN_CONFIGURING - if (ETH_WAN_UP == stGlobalInfo.WanStatus) - Transition_EthWanLinkUp() - Notify WanManager LinkStatus Up - CosaDmlEthSetWanLinkStatusForWanManager - Goto `STATE_ETH_WAN_LINK_UP` - STATE_ETH_WAN_LINK_UP - Monitor if there is any state changes: - if ((FALSE == stGlobalInfo.Upstream) \|| (ETH_WAN_DOWN == stGlobalInfo.WanStatus) \|| (ETH_LINK_STATUS_DOWN == stGlobalInfo.LinkStatus)) ### Recap #### EthAgent SM | Node | Purpose | Triggered by | Initial Value From | Maintainer | | ------------------------------------------------ | ---------------------------------------------------------------------------------------- | ------------ | ------------------ | ----------- | | Device.Ethernet.X_RDK_Itnerface.{i}.Upstream | Once the interface is choosen, upstream event will be send by WanManager | WanManager | | EthAgent | | Device.Ethernet.X_RDK_Itnerface.{i}.WanValidated | Always Ture when EthAgent init interfaces | | | EthAgent | | Device.Ethernet.X_RDK_Itnerface.{i}.Status | To present Interface LinkStatus | EthAgent | | EthAgent | | Device.Ethernet.X_RDK_Itnerface.{i}.WanStatus | When True, EthAgent SM will goto ETH_WAN_LINK_UP. Set by VlanManager | VlanManager | | EthAgent | | Device.X_RDK_Ethernet.Link.1. | Nodes For VlanManager | | | VlanManager | | Device.X_RDK_Ethernet.Link.1.Enable | When receving True Event, VlanManager start to create interface | EthAgent | | VlanManager | | Device.X_RDK_Ethernet.Link.1.LowerLayer | Once interface created, VLM will send WanStatus Up to EthAgent with LowerLayer interface | EthAgent | | VlanManager | | Device.X_RDK_Ethernet.Link.1.X_RDK_BaseInterface | | EthAgent | | VlanManager |