t_std_error nas_mac_publish_entry(nas_mac_entry_t *entry,bool is_static,bool flush_all, cps_api_operation_types_t op){ if(entry == nullptr){ NAS_MAC_LOG(ERR,0,"Null MAC entry pointer passed to convert it to cps object"); return STD_ERR(MAC,PARAM,0); } cps_api_object_t obj = cps_api_object_create(); if(obj == nullptr){ NAS_MAC_LOG(ERR,0,"Failed to allocate memory to cps object"); return STD_ERR(MAC,NOMEM,0); } cps_api_key_t key; cps_api_key_from_attr_with_qual(&key, BASE_MAC_TABLE_OBJ, cps_api_qualifier_OBSERVED); cps_api_object_set_type_operation(&key,op); cps_api_object_set_key(obj,&key); if(!flush_all){ cps_api_object_attr_add_u32(obj,BASE_MAC_TABLE_IFINDEX,entry->ifindex); cps_api_object_attr_add_u32(obj,BASE_MAC_TABLE_ACTIONS,entry->pkt_action); cps_api_object_attr_add_u16(obj,BASE_MAC_TABLE_VLAN,entry->entry_key.vlan_id); cps_api_object_attr_add(obj,BASE_MAC_TABLE_MAC_ADDRESS,(void*)entry->entry_key.mac_addr, sizeof(entry->entry_key.mac_addr)); cps_api_object_attr_add_u32(obj,BASE_MAC_TABLE_STATIC,is_static); } NAS_MAC_LOG(INFO,3,"Publishing an event with operation %d",op); return nas_mac_event_publish(obj); }
static void _ndi_port_event_update_ (ndi_port_t *ndi_port, ndi_port_event_t event, uint32_t hwport) { cps_api_object_guard og(cps_api_object_create()); init_phy_port_obj(ndi_port->npu_id,ndi_port->npu_port,og.get()); cps_api_object_attr_add_u32(og.get(),BASE_IF_PHY_PHYSICAL_HARDWARE_PORT_ID,hwport); if (!(event == ndi_port_ADD || event==ndi_port_DELETE)) return ; cps_api_object_set_type_operation(cps_api_object_key(og.get()),event == ndi_port_ADD ? cps_api_oper_CREATE : cps_api_oper_DELETE ); hal_interface_send_event(og.get()); }
extern "C" bool nl_get_ip_info (int rt_msg_type, struct nlmsghdr *hdr, cps_api_object_t obj) { struct ifaddrmsg *ifmsg = (struct ifaddrmsg *)NLMSG_DATA(hdr); if(hdr->nlmsg_len < NLMSG_LENGTH(sizeof(*ifmsg))) return false; typedef enum { IP_KEY, IFINDEX, PREFIX, ADDRESS, IFNAME } attr_t ; static const std::map<uint32_t, std::map<int,cps_api_attr_id_t>> _ipmap = { {AF_INET, { {IP_KEY, BASE_IP_IPV4_OBJ}, {IFINDEX, BASE_IP_IPV4_IFINDEX}, {PREFIX, BASE_IP_IPV4_ADDRESS_PREFIX_LENGTH}, {ADDRESS, BASE_IP_IPV4_ADDRESS_IP}, {IFNAME, BASE_IP_IPV4_NAME} }}, {AF_INET6, { {IP_KEY, BASE_IP_IPV6_OBJ}, {IFINDEX, BASE_IP_IPV6_IFINDEX}, {PREFIX, BASE_IP_IPV6_ADDRESS_PREFIX_LENGTH}, {ADDRESS, BASE_IP_IPV6_ADDRESS_IP}, {IFNAME, BASE_IP_IPV6_NAME} }} }; cps_api_key_from_attr_with_qual(cps_api_object_key(obj),_ipmap.at(ifmsg->ifa_family).at(IP_KEY), cps_api_qualifier_TARGET); cps_api_set_key_data(obj,_ipmap.at(ifmsg->ifa_family).at(IFINDEX), cps_api_object_ATTR_T_U32, &ifmsg->ifa_index,sizeof(ifmsg->ifa_index)); cps_api_object_attr_add_u32(obj, _ipmap.at(ifmsg->ifa_family).at(IFINDEX), ifmsg->ifa_index); cps_api_object_attr_add_u32(obj, _ipmap.at(ifmsg->ifa_family).at(PREFIX), ifmsg->ifa_prefixlen); int nla_len = nlmsg_attrlen(hdr,sizeof(*ifmsg)); struct nlattr *head = nlmsg_attrdata(hdr, sizeof(struct ifaddrmsg)); struct nlattr *attrs[__IFLA_MAX]; memset(attrs,0,sizeof(attrs)); if (nla_parse(attrs,__IFLA_MAX,head,nla_len)!=0) { EV_LOG_TRACE(ev_log_t_NAS_OS,ev_log_s_WARNING,"IP-NL-PARSE","Failed to parse attributes"); cps_api_object_delete(obj); return false; } if(attrs[IFA_ADDRESS]!=NULL) { rta_add_ip((struct nlattr*)ifmsg, ifmsg->ifa_family, obj, _ipmap.at(ifmsg->ifa_family).at(ADDRESS)); } if(attrs[IFA_LABEL]!=NULL) { rta_add_name(attrs[IFA_LABEL], obj, _ipmap.at(ifmsg->ifa_family).at(IFNAME)); } if (rt_msg_type == RTM_NEWADDR) { cps_api_object_set_type_operation(cps_api_object_key(obj),cps_api_oper_CREATE); } else if (rt_msg_type == RTM_DELADDR) { cps_api_object_set_type_operation(cps_api_object_key(obj),cps_api_oper_DELETE); } else { cps_api_object_set_type_operation(cps_api_object_key(obj),cps_api_oper_SET); } return true; }