static void _set_mac(cps_api_object_t obj, struct nlmsghdr *nlh, struct ifinfomsg * inf,size_t len) { cps_api_object_attr_t attr = cps_api_object_attr_get(obj, DELL_IF_IF_INTERFACES_INTERFACE_PHYS_ADDRESS); if (attr==NULL) return; void *addr = cps_api_object_attr_data_bin(attr); hal_mac_addr_t mac_addr; int addr_len = strlen(static_cast<char *>(addr)); if (std_string_to_mac(&mac_addr, static_cast<const char *>(addr), addr_len)) { char mac_str[40] = {0}; EV_LOG(INFO, NAS_OS, ev_log_s_MAJOR, "NAS-OS", "Setting mac address %s, actual string %s, len %d", std_mac_to_string(&mac_addr,mac_str,sizeof(mac_str)), static_cast<char *>(addr), addr_len); nlmsg_add_attr(nlh,len,IFLA_ADDRESS, mac_addr , cps_api_object_attr_len(attr)); } }
t_std_error nas_os_util_int_get_if_details(const char *name, cps_api_object_t obj) { struct ifreq ifr; strncpy(ifr.ifr_ifrn.ifrn_name,name,sizeof(ifr.ifr_ifrn.ifrn_name)-1); const int NAS_LINK_MTU_HDR_SIZE = 32; int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock==-1) return STD_ERR(INTERFACE,FAIL,errno); t_std_error err = STD_ERR(INTERFACE,FAIL,errno); cps_api_object_attr_add(obj, IF_INTERFACES_INTERFACE_NAME, name, (strlen(name)+1)); do { if (ioctl(sock, SIOCGIFFLAGS, &ifr) >= 0) { cps_api_object_attr_add_u32(obj,BASE_IF_LINUX_IF_INTERFACES_INTERFACE_IF_FLAGS, ifr.ifr_flags); cps_api_object_attr_add_u32(obj,IF_INTERFACES_INTERFACE_ENABLED, (ifr.ifr_flags & IFF_UP) ? true :false); } else break; ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; if (ioctl(sock, SIOCGIFHWADDR, &ifr) >= 0) { char buff[40]; const char *_p = std_mac_to_string((const hal_mac_addr_t *)(ifr.ifr_hwaddr.sa_data), buff, sizeof(buff)); cps_api_object_attr_add(obj,DELL_IF_IF_INTERFACES_INTERFACE_PHYS_ADDRESS,_p,strlen(_p)+1); } else break; if (ioctl(sock, SIOCGIFMTU, &ifr) >= 0) { cps_api_object_attr_add_u32(obj, DELL_IF_IF_INTERFACES_INTERFACE_MTU, (ifr.ifr_mtu + NAS_LINK_MTU_HDR_SIZE)); } else break; err = STD_ERR_OK; } while(0); close(sock); return err; }