/* Interface adding function */ int ifan_read (struct if_announcemsghdr *ifan) { struct interface *ifp; ifp = if_lookup_by_index (ifan->ifan_index); if (ifp == NULL && ifan->ifan_what == IFAN_ARRIVAL) { /* Create Interface */ ifp = if_get_by_name (ifan->ifan_name); ifp->ifindex = ifan->ifan_index; if_add_update (ifp); } else if (ifp != NULL && ifan->ifan_what == IFAN_DEPARTURE) { if_delete_update (ifp); if_delete (ifp); } if_get_flags (ifp); if_get_mtu (ifp); if_get_metric (ifp); if (IS_ZEBRA_DEBUG_KERNEL) zlog_info ("interface %s index %d", ifp->name, ifp->ifindex); return 0; }
void if_refresh (struct interface *ifp) { if (if_is_up (ifp)) { if_get_flags (ifp); if (! if_is_up (ifp)) if_down (ifp); } else { if_get_flags (ifp); if (if_is_up (ifp)) if_up (ifp); } }
void if_refresh (struct interface_FOO *ifp) { if (if_is_operative (ifp)) { if_get_flags (ifp); if (! if_is_operative (ifp)) if_down (ifp); } else { if_get_flags (ifp); if (if_is_operative (ifp)) if_up (ifp); } }
/* Interface information */ void if_getinf(const char *ifname, struct if_info *info) { struct ifreq ifr; int skfd = socket(AF_INET, SOCK_DGRAM, 0); if (skfd < 0) err_sys("%s: can not open socket", __func__); memset(&ifr, 0, sizeof(struct ifreq)); memset(info, 0, sizeof(struct if_info)); info->flags = if_get_flags(skfd, ifname); strncpy(ifr.ifr_name, ifname, IFNAMSIZ); if (ioctl(skfd, SIOCGIFMTU, &ifr) == 0) info->mtu = ifr.ifr_mtu; if (ioctl(skfd, SIOCGIFTXQLEN, &ifr) >= 0) info->txqlen = ifr.ifr_qlen; /* Copy the 6 byte Ethernet address and the 4 byte struct in_addrs */ if (ioctl(skfd, SIOCGIFHWADDR, &ifr) >= 0) memcpy(&info->hwaddr, &ifr.ifr_hwaddr.sa_data, 6); if (ioctl(skfd, SIOCGIFADDR, &ifr) >= 0) memcpy(&info->addr, &ifr.ifr_addr.sa_data[2], 4); if (ioctl(skfd, SIOCGIFNETMASK, &ifr) >= 0) memcpy(&info->netmask, &ifr.ifr_netmask.sa_data[2], 4); if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) >= 0) memcpy(&info->bcast, &ifr.ifr_broadaddr.sa_data[2], 4); close(skfd); }
/* Fetch interface information via ioctl(). */ static void interface_info_ioctl (struct interface *ifp) { if_get_index (ifp); if_get_flags (ifp); if_get_mtu (ifp); if_get_metric (ifp); }
// Return true if network interface is 'up'. static int __lua_if_isup(lua_State *L) { short flags; const char *ifn = luaL_checkstring(L, 1); if(if_get_flags(IFC, ifn, &flags) == -1) return eprintf(IFC->last_error); lua_pushboolean(L, (flags & IFF_UP)); return 1; }
/* Fetch interface information via ioctl(). */ static void interface_info_ioctl() { struct listnode *node, *nnode; struct interface *ifp; for (ALL_LIST_ELEMENTS(iflist, node, nnode, ifp)) { if_get_index(ifp); #ifdef SIOCGIFHWADDR if_get_hwaddr(ifp); #endif /* SIOCGIFHWADDR */ if_get_flags(ifp); #ifndef HAVE_GETIFADDRS if_get_addr(ifp); #endif /* ! HAVE_GETIFADDRS */ if_get_mtu(ifp); if_get_metric(ifp); } }
int wlan_fetch_ipconfig(WLanConfig* conf) { if_t iface = nullptr; CHECK(if_get_by_index(NETWORK_INTERFACE_WIFI_STA, &iface)); CHECK_TRUE(iface, SYSTEM_ERROR_INVALID_STATE); unsigned flags = 0; CHECK(if_get_flags(iface, &flags)); // MAC address sockaddr_ll hwAddr = {}; CHECK(if_get_lladdr(iface, &hwAddr)); CHECK_TRUE((size_t)hwAddr.sll_halen == MAC_ADDRESS_SIZE, SYSTEM_ERROR_UNKNOWN); memcpy(conf->nw.uaMacAddr, hwAddr.sll_addr, MAC_ADDRESS_SIZE); CHECK_TRUE((flags & IFF_UP) && (flags & IFF_LOWER_UP), SYSTEM_ERROR_INVALID_STATE); // IP address if_addrs* ifAddrList = nullptr; CHECK(if_get_addrs(iface, &ifAddrList)); SCOPE_GUARD({ if_free_if_addrs(ifAddrList); });
/** Bring @ifname up if not already up. Return 0 if ok, < 0 on error. */ int if_set_up(const char *ifname) { struct ifreq ifr; int ret, skfd = socket(AF_INET, SOCK_DGRAM, 0); if (skfd < 0) err_sys("%s: can not open socket", __func__); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); ifr.ifr_flags = if_get_flags(skfd, ifname); if (ifr.ifr_flags & IFF_UP) return 0; ifr.ifr_flags |= IFF_UP; ret = ioctl(skfd, SIOCSIFFLAGS, &ifr); close(skfd); return ret; }
/* Fetch interface information via ioctl(). */ static void interface_info_ioctl () { struct listnode *node; struct interface_FOO *ifp; LIST_LOOP (iflist, ifp, node) { ifp = getdata (node); if_get_index (ifp); #ifdef SIOCGIFHWADDR if_get_hwaddr (ifp); #endif /* SIOCGIFHWADDR */ if_get_flags (ifp); #ifndef HAVE_GETIFADDRS if_get_addr (ifp); #endif /* ! HAVE_GETIFADDRS */ if_get_mtu (ifp); if_get_metric (ifp); }
/* Interface adding function */ static int ifan_read (struct if_announcemsghdr *ifan) { struct interface *ifp; ifp = if_lookup_by_index (ifan->ifan_index); if (ifp) assert ( (ifp->ifindex == ifan->ifan_index) || (ifp->ifindex == IFINDEX_INTERNAL) ); if ( (ifp == NULL) || ((ifp->ifindex == IFINDEX_INTERNAL) && (ifan->ifan_what == IFAN_ARRIVAL)) ) { if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug ("%s: creating interface for ifindex %d, name %s", __func__, ifan->ifan_index, ifan->ifan_name); /* Create Interface */ ifp = if_get_by_name_len(ifan->ifan_name, strnlen(ifan->ifan_name, sizeof(ifan->ifan_name))); ifp->ifindex = ifan->ifan_index; if_add_update (ifp); } else if (ifp != NULL && ifan->ifan_what == IFAN_DEPARTURE) if_delete_update (ifp); if_get_flags (ifp); if_get_mtu (ifp); if_get_metric (ifp); if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug ("%s: interface %s index %d", __func__, ifan->ifan_name, ifan->ifan_index); return 0; }
/* Fetch interface information via ioctl(). */ static void interface_info_ioctl () { listnode node; struct interface *ifp; for (node = listhead (iflist); node; node = nextnode (node)) { ifp = getdata (node); if_get_index (ifp); #ifdef SIOCGIFHWADDR if_get_hwaddr (ifp); #endif /* SIOCGIFHWADDR */ if_get_flags (ifp); #ifndef HAVE_GETIFADDRS if_get_addr (ifp); #endif /* ! HAVE_GETIFADDRS */ if_get_mtu (ifp); if_get_metric (ifp); } }
void if_refresh (struct interface *ifp) { if_get_flags (ifp); }
/* Return true if @ifname is known to be up. */ bool if_is_up(int skfd, const char *ifname) { return if_get_flags(skfd, ifname) & IFF_UP; }