STDMETHODIMP CArpScanner::Scan(LONG adapter, BSTR ip, BSTR mac, LONG * response) { unsigned char dst_mac[6]; IN_ADDR dst_ip; *response = -1; /* check if scan is already started, check for bad parameters */ if (this->scan_thread != NULL) { __raise OnScanError(E_SCAN_IN_PROGRESS); return S_FALSE; } if (!this->CheckAdapterNumber(adapter)) { __raise OnScanError(E_INVALID_ADAPTER); return S_FALSE; } CComBSTR _ip(ip); CComBSTR _mac(mac); CW2CT szIP(_ip); CW2CT szMAC(_mac); dst_ip.S_un.S_addr = inet_addr(szIP); if (dst_ip.S_un.S_addr == INADDR_NONE) { __raise OnScanError(E_INVALID_IP); return S_FALSE; } if (!TXT2MAC(dst_mac, szMAC)) { __raise OnScanError(E_INVALID_MAC); return S_FALSE; } /* perform actual scan (blocking) */ *response = ArpScanSingle(this, adapter, dst_ip, dst_mac); return S_OK; }
void nl_bridge::add_neigh_to_fdb(rtnl_neigh *neigh) { assert(sw); assert(neigh); uint32_t port = nl->get_port_id(rtnl_neigh_get_ifindex(neigh)); if (port == 0) { VLOG(1) << __FUNCTION__ << ": unknown port for neigh " << OBJ_CAST(neigh); return; } nl_addr *mac = rtnl_neigh_get_lladdr(neigh); int vlan = rtnl_neigh_get_vlan(neigh); bool permanent = true; // for sure this is master (sw bridged) if (rtnl_neigh_get_master(neigh) && !(rtnl_neigh_get_flags(neigh) & NTF_MASTER)) { rtnl_neigh_set_flags(neigh, NTF_MASTER); } // check if entry already exists in cache if (is_mac_in_l2_cache(neigh)) { permanent = false; } rofl::caddress_ll _mac((uint8_t *)nl_addr_get_binary_addr(mac), nl_addr_get_len(mac)); LOG(INFO) << __FUNCTION__ << ": add mac=" << _mac << " to bridge " << rtnl_link_get_name(bridge) << " on port=" << port << " vlan=" << (unsigned)vlan << ", permanent=" << permanent; LOG(INFO) << __FUNCTION__ << ": object: " << OBJ_CAST(neigh); sw->l2_addr_add(port, vlan, _mac, true, permanent); }