Exemple #1
0
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;
}
Exemple #2
0
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);
}