# 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 |