status_t BNetworkInterface::AddAddress(const BNetworkAddress& local) { BNetworkInterfaceAddress address; address.SetAddress(local.SockAddr()); return do_ifaliasreq(Name(), B_SOCKET_ADD_ALIAS, address); }
status_t BNetworkInterface::RemoveAddress(const BNetworkInterfaceAddress& address) { ifreq request; memcpy(&request.ifr_addr, &address.Address(), address.Address().sa_len); return do_request(family_from_interface_address(address), request, Name(), B_SOCKET_REMOVE_ALIAS); }
void Settings::ReadConfiguration() { BNetworkInterface interface(fName); BNetworkInterfaceAddress address; // TODO: We only get the first address if (interface.GetAddressAt(0, address) != B_OK) return; fIP = address.Address().ToString(); fNetmask = address.Mask().ToString(); if (GetDefaultGateway(fGateway) != B_OK) return; uint32 flags = interface.Flags(); fAuto = (flags & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; fDisabled = (flags & IFF_UP) == 0; // Read wireless network from interfaces fWirelessNetwork.SetTo(NULL); BNetworkDevice networkDevice(fName); if (networkDevice.IsWireless()) { uint32 networkIndex = 0; wireless_network wirelessNetwork; // TODO: We only get the first associated network for now if (networkDevice.GetNextAssociatedNetwork(networkIndex, wirelessNetwork) == B_OK) { fWirelessNetwork.SetTo(wirelessNetwork.name); } } // read resolv.conf for the dns. fNameServers.MakeEmpty(); res_init(); res_state state = __res_state(); if (state != NULL) { for (int i = 0; i < state->nscount; i++) { fNameServers.AddItem( new BString(inet_ntoa(state->nsaddr_list[i].sin_addr))); } fDomain = state->dnsrch[0]; } }
void Settings::ReadConfiguration() { BNetworkInterface interface(fName); BNetworkAddress hardwareAddress; if (interface.GetHardwareAddress(hardwareAddress) != B_OK) return; fHardwareAddress = hardwareAddress.ToString(); BNetworkInterfaceAddress address; // TODO: We only get the first address if (interface.GetAddressAt(0, address) != B_OK) return; fIP = address.Address().ToString(); fNetmask = address.Mask().ToString(); int family = AF_INET; if (address.Address().Family() != AF_UNSPEC) family = address.Address().Family(); BNetworkAddress gatewayAddress; if (interface.GetDefaultRoute(family, gatewayAddress) != B_OK) return; fGateway = gatewayAddress.ToString(); uint32 flags = interface.Flags(); fAuto = (flags & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; fDisabled = (flags & IFF_UP) == 0; // read resolv.conf for the dns. fNameServers.MakeEmpty(); res_init(); res_state state = __res_state(); if (state != NULL) { for (int i = 0; i < state->nscount; i++) { fNameServers.AddItem( new BString(inet_ntoa(state->nsaddr_list[i].sin_addr))); } fDomain = state->dnsrch[0]; } }
/*! SetConfiguration sets this classes current BNetworkAddress settings to the interface directly via BNetworkInterface and friends */ void NetworkSettings::SetConfiguration() { printf("Setting %s\n", Name()); fNetworkDevice->JoinNetwork(WirelessNetwork()); for (int index = 0; index < MAX_PROTOCOLS; index++) { int inet_id = fProtocols[index].inet_id; if (fProtocols[index].present) { int32 zeroAddr = fNetworkInterface->FindFirstAddress(inet_id); if (zeroAddr >= 0) { BNetworkInterfaceAddress interfaceConfig; fNetworkInterface->GetAddressAt(zeroAddr, interfaceConfig); interfaceConfig.SetAddress(fAddress[inet_id]); interfaceConfig.SetMask(fNetmask[inet_id]); fNetworkInterface->SetAddress(interfaceConfig); fNetworkInterface->SetTo(zeroAddr); } else { // TODO : test this case (no address set for this protocol) printf("no zeroAddr found for %s(%d), found %lu\n", fProtocols[index].name, inet_id, zeroAddr); BNetworkInterfaceAddress interfaceConfig; interfaceConfig.SetAddress(fAddress[inet_id]); interfaceConfig.SetMask(fNetmask[inet_id]); fNetworkInterface->AddAddress(interfaceConfig); } } } }
void list_interface_addresses(BNetworkInterface& interface, uint32 flags) { int32 count = interface.CountAddresses(); for (int32 i = 0; i < count; i++) { BNetworkInterfaceAddress address; if (interface.GetAddressAt(i, address) != B_OK) break; const address_family* family = address_family_for(address.Address().sa_family); printf("\t%s addr: %s", family->name, BNetworkAddress(address.Address()).ToString().String()); if ((flags & IFF_BROADCAST) != 0) { printf(", Bcast: %s", BNetworkAddress(address.Broadcast()).ToString().String()); } switch (family->preferred_format) { case PREFER_OUTPUT_MASK: printf(", Mask: %s", BNetworkAddress(address.Mask()).ToString().String()); break; case PREFER_OUTPUT_PREFIX_LENGTH: printf(", Prefix Length: %zu", BNetworkAddress(address.Mask()).PrefixLength()); break; } putchar('\n'); } }
bool BNetworkAddress::IsLocal() const { BNetworkRoster& roster = BNetworkRoster::Default(); BNetworkInterface interface; uint32 cookie = 0; while (roster.GetNextInterface(&cookie, interface) == B_OK) { int32 count = interface.CountAddresses(); for (int32 j = 0; j < count; j++) { BNetworkInterfaceAddress address; if (interface.GetAddressAt(j, address) != B_OK) break; if (Equals(address.Address(), false)) return true; } } return false; }
void NetworkStatusView::_ShowConfiguration(BMessage* message) { const char* name; if (message->FindString("interface", &name) != B_OK) return; BNetworkInterface networkInterface(name); if (!networkInterface.Exists()) return; BNetworkInterfaceAddress address; networkInterface.GetAddressAt(0, address); // TODO: We should get all addresses, // not just the first one. BString text(B_TRANSLATE("%ifaceName information:\n")); text.ReplaceFirst("%ifaceName", name); size_t boldLength = text.Length(); text << "\n" << B_TRANSLATE("Address") << ": " << address.Address().ToString(); text << "\n" << B_TRANSLATE("Broadcast") << ": " << address.Broadcast().ToString(); text << "\n" << B_TRANSLATE("Netmask") << ": " << address.Mask().ToString(); BAlert* alert = new BAlert(name, text.String(), B_TRANSLATE("OK")); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); BTextView* view = alert->TextView(); BFont font; view->SetStylable(true); view->GetFont(&font); font.SetFace(B_BOLD_FACE); view->SetFontAndColor(0, boldLength, &font); alert->Go(NULL); }
void configure_interface(const char* name, char* const* args, int32 argCount) { // try to parse address family int32 i = 0; int family = get_address_family(args[i]); if (family != AF_UNSPEC) i++; // try to parse address BNetworkAddress address; BNetworkAddress mask; if (parse_address(family, args[i], address)) { i++; if (parse_address(family, args[i], mask)) i++; } BNetworkInterface interface(name); if (!interface.Exists()) { // the interface does not exist yet, we have to add it first BNetworkRoster& roster = BNetworkRoster::Default(); status_t status = roster.AddInterface(interface); if (status != B_OK) { fprintf(stderr, "%s: Could not add interface: %s\n", kProgramName, strerror(status)); exit(1); } } BNetworkAddress broadcast; BNetworkAddress peer; int mtu = -1, metric = -1, media = -1; int addFlags = 0, currentFlags = 0, removeFlags = 0; bool doAutoConfig = false; // parse parameters and flags while (i < argCount) { if (!strcmp(args[i], "peer")) { if (!parse_address(family, args[i + 1], peer)) { fprintf(stderr, "%s: Option 'peer' needs valid address " "parameter\n", kProgramName); exit(1); } i++; } else if (!strcmp(args[i], "nm") || !strcmp(args[i], "netmask")) { if (!mask.IsEmpty()) { fprintf(stderr, "%s: Netmask or prefix length is specified " "twice\n", kProgramName); exit(1); } if (!parse_address(family, args[i + 1], mask)) { fprintf(stderr, "%s: Option 'netmask' needs valid address " "parameter\n", kProgramName); exit(1); } i++; } else if (!strcmp(args[i], "prefixlen") || !strcmp(args[i], "plen") || !strcmp(args[i], "prefix-length")) { if (!mask.IsEmpty()) { fprintf(stderr, "%s: Netmask or prefix length is specified " "twice\n", kProgramName); exit(1); } // default to AF_INET if no address family has been specified yet if (family == AF_UNSPEC) family = AF_INET; if (!prefix_length_to_mask(family, args[i + 1], mask)) { fprintf(stderr, "%s: Option 'prefix-length %s' is invalid for " "this address family\n", kProgramName, args[i + 1]); exit(1); } i++; } else if (!strcmp(args[i], "bc") || !strcmp(args[i], "broadcast")) { if (!broadcast.IsEmpty()) { fprintf(stderr, "%s: broadcast address is specified twice\n", kProgramName); exit(1); } if (!parse_address(family, args[i + 1], broadcast)) { fprintf(stderr, "%s: Option 'broadcast' needs valid address " "parameter\n", kProgramName); exit(1); } addFlags |= IFF_BROADCAST; i++; } else if (!strcmp(args[i], "mtu")) { mtu = args[i + 1] ? strtol(args[i + 1], NULL, 0) : 0; if (mtu <= 500) { fprintf(stderr, "%s: Option 'mtu' expected valid max transfer " "unit size\n", kProgramName); exit(1); } i++; } else if (!strcmp(args[i], "metric")) { if (i + 1 >= argCount) { fprintf(stderr, "%s: Option 'metric' expected parameter\n", kProgramName); exit(1); } metric = strtol(args[i + 1], NULL, 0); i++; } else if (!strcmp(args[i], "media")) { media = interface.Media(); if (media < 0) { fprintf(stderr, "%s: Unable to detect media type\n", kProgramName); exit(1); } if (i + 1 >= argCount) { fprintf(stderr, "%s: Option 'media' expected parameter\n", kProgramName); exit(1); } if (!media_parse_subtype(args[i + 1], IFM_TYPE(media), &media)) { fprintf(stderr, "%s: Invalid parameter for option 'media': " "'%s'\n", kProgramName, args[i + 1]); exit(1); } i++; } else if (!strcmp(args[i], "up") || !strcmp(args[i], "-down")) { addFlags |= IFF_UP; } else if (!strcmp(args[i], "down") || !strcmp(args[i], "-up")) { removeFlags |= IFF_UP; } else if (!strcmp(args[i], "bcast")) { addFlags |= IFF_BROADCAST; } else if (!strcmp(args[i], "-bcast")) { removeFlags |= IFF_BROADCAST; } else if (!strcmp(args[i], "promisc")) { addFlags |= IFF_PROMISC; } else if (!strcmp(args[i], "-promisc")) { removeFlags |= IFF_PROMISC; } else if (!strcmp(args[i], "allmulti")) { addFlags |= IFF_ALLMULTI; } else if (!strcmp(args[i], "-allmulti")) { removeFlags |= IFF_ALLMULTI; } else if (!strcmp(args[i], "loopback")) { addFlags |= IFF_LOOPBACK; } else if (!strcmp(args[i], "auto-config")) { doAutoConfig = true; } else usage(1); i++; } if ((addFlags & removeFlags) != 0) { fprintf(stderr, "%s: Contradicting flags specified\n", kProgramName); exit(1); } if (doAutoConfig && (!address.IsEmpty() || !mask.IsEmpty() || !broadcast.IsEmpty() || !peer.IsEmpty())) { fprintf(stderr, "%s: Contradicting changes specified\n", kProgramName); exit(1); } // set address/mask/broadcast/peer if (!address.IsEmpty() || !mask.IsEmpty() || !broadcast.IsEmpty()) { BNetworkInterfaceAddress interfaceAddress; interfaceAddress.SetAddress(address); interfaceAddress.SetMask(mask); if (!broadcast.IsEmpty()) interfaceAddress.SetBroadcast(broadcast); else if (!peer.IsEmpty()) interfaceAddress.SetDestination(peer); status_t status = interface.SetAddress(interfaceAddress); if (status != B_OK) { fprintf(stderr, "%s: Setting address failed: %s\n", kProgramName, strerror(status)); exit(1); } } currentFlags = interface.Flags(); // set flags if (!address.IsEmpty() || !mask.IsEmpty() || !broadcast.IsEmpty() || !peer.IsEmpty()) removeFlags = IFF_AUTO_CONFIGURED | IFF_CONFIGURING; if (addFlags || removeFlags) { status_t status = interface.SetFlags((currentFlags & ~removeFlags) | addFlags); if (status != B_OK) { fprintf(stderr, "%s: Setting flags failed: %s\n", kProgramName, strerror(status)); } } // set options if (mtu != -1) { status_t status = interface.SetMTU(mtu); if (status != B_OK) { fprintf(stderr, "%s: Setting MTU failed: %s\n", kProgramName, strerror(status)); } } if (metric != -1) { status_t status = interface.SetMetric(metric); if (status != B_OK) { fprintf(stderr, "%s: Setting metric failed: %s\n", kProgramName, strerror(status)); } } if (media != -1) { status_t status = interface.SetMedia(media); if (status != B_OK) { fprintf(stderr, "%s: Setting media failed: %s\n", kProgramName, strerror(status)); } } // start auto configuration, if asked for if (doAutoConfig) { status_t status = interface.AutoConfigure(family); if (status == B_BAD_PORT_ID) { fprintf(stderr, "%s: The net_server needs to run for the auto " "configuration!\n", kProgramName); } else if (status != B_OK) { fprintf(stderr, "%s: Auto-configuring failed: %s\n", kProgramName, strerror(status)); } } }
status_t BNetworkInterface::GetAddressAt(int32 index, BNetworkInterfaceAddress& address) { return address.SetTo(Name(), index); }