[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haiku-commits
Subject:    [haiku-commits] [L] Change in haiku[master]: network : Maintain state of address families supported 
From:       Gerrit <review () review ! haiku-os ! org>
Date:       2024-04-26 11:26:19
Message-ID: accfaccc4344641da2374459f5e877d1e508d85d-HTML () review ! haiku-os ! org
[Download RAW message or body]

From Sayan Chaudhuri <sayanchaudhuri758@gmail.com>:

Sayan Chaudhuri has uploaded this change for review. ( \
https://review.haiku-os.org/c/haiku/+/7637?usp=email )


Change subject: network : Maintain state of address families supported by interface
......................................................................

network : Maintain state of address families supported by interface

This commit introduces a hash table data structure in the
Interface class inside kernel . The hash table will maintain
the state of each address family supported by an interface.
This hash table will be considered during bootup time to determine
the configuration status of (interface, address family) pair
before proceeding to configure them .
---
M headers/os/net/NetworkInterface.h
M headers/posix/net/if.h
M headers/posix/sys/sockio.h
M src/add-ons/kernel/network/stack/datalink.cpp
M src/add-ons/kernel/network/stack/interfaces.cpp
M src/add-ons/kernel/network/stack/interfaces.h
M src/bin/debug/strace/ioctl.cpp
M src/kits/network/libnetapi/NetworkInterface.cpp
M src/servers/net/AutoconfigLooper.cpp
M src/servers/net/DHCPClient.cpp
M src/servers/net/NetServer.cpp
11 files changed, 235 insertions(+), 33 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/37/7637/1

diff --git a/headers/os/net/NetworkInterface.h b/headers/os/net/NetworkInterface.h
index d966c34..7c1dad4 100644
--- a/headers/os/net/NetworkInterface.h
+++ b/headers/os/net/NetworkInterface.h
@@ -5,7 +5,8 @@
 #ifndef _NETWORK_INTERFACE_H
 #define _NETWORK_INTERFACE_H

-
+#include<unordered_map>
+#include<memory>
 #include <net/if.h>
 #include <net/if_types.h>

@@ -54,6 +55,13 @@
 			uint32				fFlags;
 };

+class BNetworkInterfaceAddressFamilyState{
+public:
+		uint32   GetState(const BNetworkInterface &interface);
+		status_t SetState(int state, const BNetworkInterface &interface);
+
+
+};

 class BNetworkInterface {
 public:
@@ -115,11 +123,16 @@
 									BNetworkAddress& gateway) const;

 			status_t			AutoConfigure(int family);
+			status_t       		GetAddressFamilyState(int family, int &state);
+			status_t			SetAddressFamilyState(int family, int state);
+

 private:
 			char				fName[IF_NAMESIZE];
 			BList				fAddresses;
+
 };


+
 #endif	// _NETWORK_INTERFACE_H
diff --git a/headers/posix/net/if.h b/headers/posix/net/if.h
index 2ad9bd4..a53a5a0 100644
--- a/headers/posix/net/if.h
+++ b/headers/posix/net/if.h
@@ -64,6 +64,10 @@
 	uint32_t		ifra_flags;
 };

+struct ifafreq{
+	char            if_name[IF_NAMESIZE];
+	int             state;
+};

 /* interface flags */
 #define IFF_UP				0x0001
@@ -81,10 +85,9 @@
 #define IFF_MULTICAST		0x8000	/* supports multicast */

 /* interface alias flags */
-#define IFAF_AUTO_CONFIGURED	0x0001	/* has been automatically configured */
+#define IFAF_CONFIGURED			0x0001	/* has been automatically configured */
 #define IFAF_CONFIGURING		0x0002	/* auto configuration in progress */

-
 /* used with SIOCGIFCOUNT, and SIOCGIFCONF */
 struct ifconf {
 	int				ifc_len;	/* size of buffer */
diff --git a/headers/posix/sys/sockio.h b/headers/posix/sys/sockio.h
index e486f50..68b5de5 100644
--- a/headers/posix/sys/sockio.h
+++ b/headers/posix/sys/sockio.h
@@ -74,6 +74,8 @@
 #define B_SOCKET_SET_ALIAS		8947	/* set interface alias, ifaliasreq */
 #define B_SOCKET_GET_ALIAS		8948	/* get interface alias, ifaliasreq */
 #define B_SOCKET_COUNT_ALIASES	8949	/* count interface aliases */
+#define B_SOCKET_SET_AF_STATE   8950
+#define B_SOCKET_GET_AF_STATE   8951

 #define SIOCEND					9000	/* SIOCEND >= highest SIOC* */

diff --git a/src/add-ons/kernel/network/stack/datalink.cpp \
b/src/add-ons/kernel/network/stack/datalink.cpp index ce5ca15..2ab2106 100644
--- a/src/add-ons/kernel/network/stack/datalink.cpp
+++ b/src/add-ons/kernel/network/stack/datalink.cpp
@@ -349,7 +349,7 @@
 				return B_BAD_VALUE;

 			status_t status = interface->Control(domain, option, request,
-				(ifreq*)value, *_length);
+				value, *_length);

 			interface->ReleaseReference();
 			return status;
@@ -823,6 +823,16 @@
 				&request.ifr_count, sizeof(request.ifr_count));
 		}

+		case B_SOCKET_GET_AF_STATE:
+		{
+			TRACE("Inside B_SOCKET_GET_AF_STATE");
+		    struct ifafreq request;
+			if(!interface->IsSupportedAddressFamily(protocol->domain->family))
+				return B_NOT_SUPPORTED;
+			request.state = interface->GetAddressFamilyState(protocol->domain->family);
+			user_memcpy(argument,&request, length);
+			return B_OK;
+		}
 		case B_SOCKET_GET_ALIAS:
 		{
 			ifaliasreq request;
@@ -838,8 +848,7 @@
 						(const sockaddr*)&request.ifra_addr);
 				} else {
 					// Find first address for family
-					address = interface->FirstForFamily(
-						protocol->domain->family);
+					address = interface->FirstForFamily(protocol->domain->family);
 				}

 				request.ifra_index = interface->IndexOfAddress(address);
diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp \
b/src/add-ons/kernel/network/stack/interfaces.cpp index ae004b8..be429c0 100644
--- a/src/add-ons/kernel/network/stack/interfaces.cpp
+++ b/src/add-ons/kernel/network/stack/interfaces.cpp
@@ -456,6 +456,9 @@
 		interfaceName, deviceInterface);

 	int written = strlcpy(name, interfaceName, IF_NAMESIZE);
+
+    AddAddressFamilySupport(AF_INET);
+	AddAddressFamilySupport(AF_INET6);
 	memset(name + written, 0, IF_NAMESIZE - written);
 		// Clear remaining space

@@ -733,6 +736,22 @@
 	}
 }

+void
+Interface::AddAddressFamilySupport(int family)
+{
+	fAddressFamilies.Put(family, 0);
+}
+
+bool
+Interface::IsSupportedAddressFamily(int family)
+{
+	return fAddressFamilies.ContainsKey(family);
+}
+int
+Interface::GetAddressFamilyState(int family)
+{
+	return fAddressFamilies.Get(family);
+}

 /*!	This is called in order to call the correct methods of the datalink
 	protocols, ie. it will translate address changes to
@@ -743,7 +762,7 @@
 */
 status_t
 Interface::Control(net_domain* domain, int32 option, ifreq& request,
-	ifreq* userRequest, size_t length)
+	void* userRequest, size_t length)
 {
 	switch (option) {
 		case SIOCSIFFLAGS:
@@ -779,7 +798,17 @@

 			return status;
 		}
-
+		case B_SOCKET_SET_AF_STATE:
+		{
+			struct ifafreq af ;
+			if(!(fAddressFamilies.ContainsKey(domain->family)))
+				return B_NOT_SUPPORTED;
+			user_memcpy(&af, userRequest, length);
+			TRACE("setting state = %d, family = %d",af.state, domain->family);
+			//TRACE("setting state = %d, family = %d",(struct ifafreq*)userRequest->state, \
domain->family); +			fAddressFamilies.Put(domain->family, af.state);
+			return B_OK;
+		}
 		case B_SOCKET_SET_ALIAS:
 		{
 			if (length != sizeof(ifaliasreq))
@@ -854,7 +883,7 @@
 					address->destination,
 					(sockaddr*)&aliasRequest.ifra_destination);
 			}
-
+
 			address->ReleaseReference();
 			return status;
 		}
@@ -877,7 +906,7 @@
 			if (size > sizeof(sockaddr_storage))
 				size = sizeof(sockaddr_storage);

-			if (user_memcpy(&newAddress, &userRequest->ifr_addr, size) != B_OK)
+			if (user_memcpy(&newAddress, &((ifreq*)userRequest)->ifr_addr, size) != B_OK)
 				return B_BAD_ADDRESS;

 			if (option == SIOCDIFADDR) {
diff --git a/src/add-ons/kernel/network/stack/interfaces.h \
b/src/add-ons/kernel/network/stack/interfaces.h index 536ab34..fada789 100644
--- a/src/add-ons/kernel/network/stack/interfaces.h
+++ b/src/add-ons/kernel/network/stack/interfaces.h
@@ -16,7 +16,7 @@
 #include <net_stack.h>

 #include <Referenceable.h>
-
+#include "HashMap.h"
 #include <util/AutoLock.h>
 #include <util/DoublyLinkedList.h>
 #include <util/OpenHashTable.h>
@@ -112,7 +112,7 @@

 typedef BOpenHashTable<DatalinkHashDefinition, true, true> DatalinkTable;

-
+typedef HashMap<HashKey32<int>,int> AddressFamilyStateMap;
 class Interface : public DoublyLinkedListLinkImpl<Interface>,
 		public net_interface, public BReferenceable {
 public:
@@ -136,7 +136,7 @@
 			void				RemoveAddresses();

 			status_t			Control(net_domain* domain, int32 option,
-									ifreq& request, ifreq* userRequest,
+									ifreq& request, void* userRequest,
 									size_t length);

 			void				SetDown();
@@ -151,6 +151,9 @@
 			domain_datalink*	DomainDatalink(uint8 family);
 			domain_datalink*	DomainDatalink(net_domain* domain)
 									{ return DomainDatalink(domain->family); }
+			void                AddAddressFamilySupport(int family);
+			bool                IsSupportedAddressFamily(int family);
+			int                 GetAddressFamilyState(int family);

 	inline	void				SetBusy(bool busy) { atomic_set(&fBusy, busy ? 1 : 0); }
 	inline	bool				IsBusy() const { return atomic_get((int32*)&fBusy) == 1 ; }
@@ -173,6 +176,8 @@
 			net_device_interface* fDeviceInterface;
 			AddressList			fAddresses;
 			DatalinkTable		fDatalinkTable;
+			AddressFamilyStateMap fAddressFamilies;
+
 };

 typedef DoublyLinkedList<Interface> InterfaceList;
diff --git a/src/bin/debug/strace/ioctl.cpp b/src/bin/debug/strace/ioctl.cpp
index d07ccff..a2c8306 100644
--- a/src/bin/debug/strace/ioctl.cpp
+++ b/src/bin/debug/strace/ioctl.cpp
@@ -110,6 +110,8 @@
 	IOCTL_INFO_ENTRY_TYPE(B_SOCKET_SET_ALIAS, struct ifaliasreq *),
 	IOCTL_INFO_ENTRY_TYPE(B_SOCKET_GET_ALIAS, struct ifaliasreq *),
 	IOCTL_INFO_ENTRY_TYPE(B_SOCKET_COUNT_ALIASES, struct ifreq *),
+	IOCTL_INFO_ENTRY_TYPE(B_SOCKET_GET_AF_STATE, struct ifreq *),
+	IOCTL_INFO_ENTRY_TYPE(B_SOCKET_SET_AF_STATE, struct ifreq *),

 	// termios ioctls
 #define TCWAITEVENT				(TCGETA + 4)
diff --git a/src/kits/network/libnetapi/NetworkInterface.cpp \
b/src/kits/network/libnetapi/NetworkInterface.cpp index 8c61e77..d34a489 100644
--- a/src/kits/network/libnetapi/NetworkInterface.cpp
+++ b/src/kits/network/libnetapi/NetworkInterface.cpp
@@ -188,6 +188,8 @@
 BNetworkInterface::SetTo(const char* name)
 {
 	strlcpy(fName, name, IF_NAMESIZE);
+	// AddAddressFamily(AF_INET);
+	// AddAddressFamily(AF_INET6);
 }


@@ -236,9 +238,10 @@
 BNetworkInterface::Flags() const
 {
 	ifreq request;
+	//do_request(AF_INET,request,Name(),B_SOCKET_GET_AF_STATE);
 	if (do_request(AF_INET, request, Name(), SIOCGIFFLAGS) != B_OK)
 		return 0;
-
+
 	return request.ifr_flags;
 }

@@ -559,6 +562,58 @@
 	return BNetworkRoute::GetDefaultGateway(family, Name(), gateway);
 }

+#if 0
+void
+BNetworkInterface::AddAddressFamily(int family)
+{
+	address_families[family] = std::make_shared<BNetworkInterfaceAddressFamilyState>();
+
+}
+#endif
+status_t
+BNetworkInterface::GetAddressFamilyState(int family, int &state)
+{
+	FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+	if (!socket.IsSet()){
+		syslog(LOG_DEBUG,"socket creation failed");
+		return -1;
+	}
+
+	struct ifafreq request;
+
+	strlcpy(request.if_name, Name(), IF_NAMESIZE);
+	//request.ifr_index = -1;
+	//request.ifra_addr.ss_family = AF_UNSPEC;
+
+	if (ioctl(socket.Get(), B_SOCKET_GET_AF_STATE, &request,
+		sizeof(struct ifafreq)) < 0) {
+		syslog(LOG_DEBUG,"ioctl call failed inside GetAddressFamilyState");
+		return -1;
+	}
+
+	state = request.state;
+	return B_OK;
+}
+
+status_t
+BNetworkInterface::SetAddressFamilyState(int family, int state)
+{
+	FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+	if (!socket.IsSet())
+		return -1;
+
+	struct ifafreq request;
+	request.state = state;
+	strlcpy(request.if_name, Name(), IF_NAMESIZE);
+	//request.ifr_index = -1;
+	//request.ifra_addr.ss_family = AF_UNSPEC;
+
+	if (ioctl(socket.Get(), B_SOCKET_SET_AF_STATE, &request,
+		sizeof(struct ifafreq)) < 0) {
+		return -1;
+	}
+	return B_OK;
+}

 status_t
 BNetworkInterface::AutoConfigure(int family)
diff --git a/src/servers/net/AutoconfigLooper.cpp \
b/src/servers/net/AutoconfigLooper.cpp index bd11a2f..243af95 100644
--- a/src/servers/net/AutoconfigLooper.cpp
+++ b/src/servers/net/AutoconfigLooper.cpp
@@ -68,7 +68,7 @@
 		AddHandler(fCurrentClient);
 	}

-	// set IFF_CONFIGURING flag on interface
+	// set IFF_CONFIGURING flag on interface address family

 	BNetworkInterface interface(fDevice.String());
 	int32 flags = interface.Flags() & ~IFF_AUTO_CONFIGURED;
@@ -85,7 +85,8 @@
 	// TODO: have a look at zeroconf
 	// TODO: this could also be done add-on based
 
-	if ((interface.Flags() & IFF_CONFIGURING) == 0) {
+    status_t state = interface.GetAddressFamilyState(AF_INET,state);
+	if ((state & IFF_CONFIGURING) == 0) {
 		// Someone else configured the interface in the mean time
 		return;
 	}
diff --git a/src/servers/net/DHCPClient.cpp b/src/servers/net/DHCPClient.cpp
index 0f04677..f8a311e 100644
--- a/src/servers/net/DHCPClient.cpp
+++ b/src/servers/net/DHCPClient.cpp
@@ -496,16 +496,15 @@

 	memcpy(fMAC, link.LinkLevelAddress(), sizeof(fMAC));

-	if ((interface.Flags() & IFF_AUTO_CONFIGURED) != 0) {
-		// Check for interface previous auto-configured address, if any.
-		BNetworkInterfaceAddress interfaceAddress;
-		int index = interface.FindFirstAddress(AF_INET);
-		if (index >= 0
-			&& interface.GetAddressAt(index, interfaceAddress) == B_OK) {
+
+	// Check for interface previous auto-configured address, if any.
+	BNetworkInterfaceAddress interfaceAddress;
+	int index = interface.FindFirstAddress(AF_INET);
+	if (index >= 0 	&& interface.GetAddressAt(index, interfaceAddress) == B_OK) {
+		if(	(interfaceAddress.Flags() & IFF_AUTO_CONFIGURED)){
 			BNetworkAddress address = interfaceAddress.Address();
 			const sockaddr_in& addr = (sockaddr_in&)address.SockAddr();
 			fAssignedAddress = addr.sin_addr.s_addr;
-
 			if ((ntohl(fAssignedAddress) & IN_CLASSB_NET) == 0xa9fe0000) {
 				// previous auto-configured address is a link-local one:
 				// there is no point asking a DHCP server to renew such
@@ -513,8 +512,8 @@
 				fAssignedAddress = 0;
 			}
 		}
+
 	}
-
 	openlog_thread("DHCP", 0, LOG_DAEMON);
 }

diff --git a/src/servers/net/NetServer.cpp b/src/servers/net/NetServer.cpp
index 3de3423..cbcc1f5 100644
--- a/src/servers/net/NetServer.cpp
+++ b/src/servers/net/NetServer.cpp
@@ -60,6 +60,34 @@

 typedef std::map<std::string, AutoconfigLooper*> LooperMap;

+enum preferred_output_format {
+	PREFER_OUTPUT_MASK,
+	PREFER_OUTPUT_PREFIX_LENGTH,
+};
+
+struct address_family {
+	int			family;
+	const char*	name;
+	const char*	identifiers[4];
+	int			maxAddressLength;
+	int			preferredPrefixFormat;
+};
+
+static const address_family kFamilies[] = {
+	{
+		AF_INET,
+		"inet",
+		{"AF_INET", "inet", "ipv4", NULL},
+		PREFER_OUTPUT_MASK
+	},
+	{
+		AF_INET6,
+		"inet6",
+		{"AF_INET6", "inet6", "ipv6", NULL},
+		PREFER_OUTPUT_PREFIX_LENGTH
+	},
+	{ -1, NULL, {NULL}, PREFER_OUTPUT_MASK }
+};
 
 class NetServer : public BServer {
 public:
@@ -491,6 +519,14 @@
 					strerror(status));
 				return status;
 			}
+			status = interface.SetAddressFamilyState(addressSettings.Family(),IFAF_CONFIGURED);
 +
+			if(status != B_OK){
+				fprintf(stderr, "%s: Setting address family state failed: %s\n", Name(),
+					strerror(status));
+				return status;
+			}
+
 		}

 		// set gateway
@@ -682,14 +718,49 @@
 NetServer::_ConfigureDevice(const char* device)
 {
 	// bring interface up, but don't configure it just yet
-	BMessage interface;
-	interface.AddString("device", device);
-	BMessage address;
-	address.AddString("family", "inet");
-	address.AddBool("auto_config", true);
-	interface.AddMessage("address", &address);
+	// BMessage interface;
+	// interface.AddString("device", device);
+	// BMessage address;
+	// address.AddString("family", "inet");
+	// address.AddBool("auto_config", true);
+	// interface.AddMessage("address", &address);

-	return _ConfigureInterface(interface);
+	// return _ConfigureInterface(interface);
+
+
+	status_t status = B_OK;
+	BMessage imessage;
+	imessage.AddString("device", device);
+	BNetworkInterface interface(device);
+	if(!interface.Exists())
+	{
+		status = _ConfigureInterface(imessage);
+	}
+	if(status == B_OK){
+		for(int32 i = 0; kFamilies[i].family > 0; i++)
+		{
+			int configureStatus = 0;
+			status_t status = interface.GetAddressFamilyState(kFamilies[i].family, \
configureStatus); +			if(status == B_OK)
+			{
+				if(!(configureStatus & (IFAF_CONFIGURED | IFF_CONFIGURING)))
+				{
+					BMessage address;
+					address.AddString("family", kFamilies[i].name);
+					address.AddBool("auto_config", true);
+					imessage.AddMessage("address", &address);
+
+				}
+			}else
+			{
+				syslog(LOG_DEBUG,"Family not supported, family = %d");
+			}
+		}
+		status = _ConfigureInterface(imessage);
+	}
+
+	return status;
+
 }


@@ -713,8 +784,7 @@
 		BPath path;
 		if (entry.GetName(name) != B_OK
 			|| entry.GetPath(&path) != B_OK
-			|| entry.GetStat(&stat) != B_OK
-			|| devicesAlreadyConfigured.HasString(path.Path()))
+			|| entry.GetStat(&stat) != B_OK)
 			continue;

 		if (S_ISBLK(stat.st_mode) || S_ISCHR(stat.st_mode)) {

--
To view, visit https://review.haiku-os.org/c/haiku/+/7637?usp=email
To unsubscribe, or for help writing mail filters, visit \
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ibc14b290f84c2311c60bd3cc5a06b0f3b5c31b73
Gerrit-Change-Number: 7637
Gerrit-PatchSet: 1
Gerrit-Owner: Sayan Chaudhuri <sayanchaudhuri758@gmail.com>
Gerrit-MessageType: newchange


[Attachment #3 (text/html)]

<p>Sayan Chaudhuri has uploaded this change for <strong>review</strong>.</p><p><a \
href="https://review.haiku-os.org/c/haiku/+/7637?usp=email">View Change</a></p><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;">network : Maintain \
state of address families supported by interface<br><br>This commit introduces a hash \
table data structure in the<br>Interface class inside kernel . The hash table will \
maintain<br>the state of each address family supported by an interface.<br>This hash \
table will be considered during bootup time to determine<br>the configuration status \
of (interface, address family) pair<br>before proceeding to configure them \
.<br>---<br>M headers/os/net/NetworkInterface.h<br>M headers/posix/net/if.h<br>M \
headers/posix/sys/sockio.h<br>M src/add-ons/kernel/network/stack/datalink.cpp<br>M \
src/add-ons/kernel/network/stack/interfaces.cpp<br>M \
src/add-ons/kernel/network/stack/interfaces.h<br>M \
src/bin/debug/strace/ioctl.cpp<br>M \
src/kits/network/libnetapi/NetworkInterface.cpp<br>M \
src/servers/net/AutoconfigLooper.cpp<br>M src/servers/net/DHCPClient.cpp<br>M \
src/servers/net/NetServer.cpp<br>11 files changed, 235 insertions(+), 33 \
deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: \
pre-wrap;">git pull ssh://git.haiku-os.org:22/haiku refs/changes/37/7637/1</pre><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git \
a/headers/os/net/NetworkInterface.h \
b/headers/os/net/NetworkInterface.h</span><br><span>index d966c34..7c1dad4 \
100644</span><br><span>--- a/headers/os/net/NetworkInterface.h</span><br><span>+++ \
b/headers/os/net/NetworkInterface.h</span><br><span>@@ -5,7 +5,8 @@</span><br><span> \
#ifndef _NETWORK_INTERFACE_H</span><br><span> #define \
_NETWORK_INTERFACE_H</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-</span><br><span style="color: hsl(120, 100%, \
40%);">+#include&lt;unordered_map&gt;</span><br><span style="color: hsl(120, 100%, \
40%);">+#include&lt;memory&gt;</span><br><span> #include \
&lt;net/if.h&gt;</span><br><span> #include &lt;net/if_types.h&gt;</span><br><span> \
</span><br><span>@@ -54,6 +55,13 @@</span><br><span> \
uint32				fFlags;</span><br><span> };</span><br><span> </span><br><span style="color: \
hsl(120, 100%, 40%);">+class BNetworkInterfaceAddressFamilyState{</span><br><span \
style="color: hsl(120, 100%, 40%);">+public:</span><br><span style="color: hsl(120, \
100%, 40%);">+		uint32   GetState(const BNetworkInterface \
&amp;interface);</span><br><span style="color: hsl(120, 100%, 40%);">+		status_t \
SetState(int state, const BNetworkInterface &amp;interface);</span><br><span \
style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, \
40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> \
</span><br><span> class BNetworkInterface {</span><br><span> \
public:</span><br><span>@@ -115,11 +123,16 @@</span><br><span> \
BNetworkAddress&amp; gateway) const;</span><br><span> </span><br><span> \
status_t			AutoConfigure(int family);</span><br><span style="color: hsl(120, 100%, \
40%);">+			status_t       		GetAddressFamilyState(int family, int \
&amp;state);</span><br><span style="color: hsl(120, 100%, \
40%);">+			status_t			SetAddressFamilyState(int family, int state);</span><br><span \
style="color: hsl(120, 100%, 40%);">+			</span><br><span> </span><br><span> \
private:</span><br><span> 			char				fName[IF_NAMESIZE];</span><br><span> \
BList				fAddresses;</span><br><span style="color: hsl(120, 100%, \
40%);">+			</span><br><span> };</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif	// \
_NETWORK_INTERFACE_H</span><br><span>diff --git a/headers/posix/net/if.h \
b/headers/posix/net/if.h</span><br><span>index 2ad9bd4..a53a5a0 \
100644</span><br><span>--- a/headers/posix/net/if.h</span><br><span>+++ \
b/headers/posix/net/if.h</span><br><span>@@ -64,6 +64,10 @@</span><br><span> \
uint32_t		ifra_flags;</span><br><span> };</span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+struct ifafreq{</span><br><span style="color: \
hsl(120, 100%, 40%);">+	char            if_name[IF_NAMESIZE];</span><br><span \
style="color: hsl(120, 100%, 40%);">+	int             state;</span><br><span \
style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /* \
interface flags */</span><br><span> #define IFF_UP				0x0001</span><br><span>@@ \
-81,10 +85,9 @@</span><br><span> #define IFF_MULTICAST		0x8000	/* supports multicast \
*/</span><br><span> </span><br><span> /* interface alias flags */</span><br><span \
style="color: hsl(0, 100%, 40%);">-#define IFAF_AUTO_CONFIGURED	0x0001	/* has been \
automatically configured */</span><br><span style="color: hsl(120, 100%, \
40%);">+#define IFAF_CONFIGURED			0x0001	/* has been automatically configured \
*/</span><br><span> #define IFAF_CONFIGURING		0x0002	/* auto configuration in \
progress */</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-</span><br><span> /* used with SIOCGIFCOUNT, and SIOCGIFCONF \
*/</span><br><span> struct ifconf {</span><br><span> 	int				ifc_len;	/* size of \
buffer */</span><br><span>diff --git a/headers/posix/sys/sockio.h \
b/headers/posix/sys/sockio.h</span><br><span>index e486f50..68b5de5 \
100644</span><br><span>--- a/headers/posix/sys/sockio.h</span><br><span>+++ \
b/headers/posix/sys/sockio.h</span><br><span>@@ -74,6 +74,8 @@</span><br><span> \
#define B_SOCKET_SET_ALIAS		8947	/* set interface alias, ifaliasreq \
*/</span><br><span> #define B_SOCKET_GET_ALIAS		8948	/* get interface alias, \
ifaliasreq */</span><br><span> #define B_SOCKET_COUNT_ALIASES	8949	/* count interface \
aliases */</span><br><span style="color: hsl(120, 100%, 40%);">+#define \
B_SOCKET_SET_AF_STATE   8950</span><br><span style="color: hsl(120, 100%, \
40%);">+#define B_SOCKET_GET_AF_STATE   8951</span><br><span> </span><br><span> \
#define SIOCEND					9000	/* SIOCEND &gt;= highest SIOC* */</span><br><span> \
</span><br><span>diff --git a/src/add-ons/kernel/network/stack/datalink.cpp \
b/src/add-ons/kernel/network/stack/datalink.cpp</span><br><span>index \
ce5ca15..2ab2106 100644</span><br><span>--- \
a/src/add-ons/kernel/network/stack/datalink.cpp</span><br><span>+++ \
b/src/add-ons/kernel/network/stack/datalink.cpp</span><br><span>@@ -349,7 +349,7 \
@@</span><br><span> 				return B_BAD_VALUE;</span><br><span> </span><br><span> \
status_t status = interface-&gt;Control(domain, option, request,</span><br><span \
style="color: hsl(0, 100%, 40%);">-				(ifreq*)value, *_length);</span><br><span \
style="color: hsl(120, 100%, 40%);">+				value, *_length);</span><br><span> \
</span><br><span> 			interface-&gt;ReleaseReference();</span><br><span> 			return \
status;</span><br><span>@@ -823,6 +823,16 @@</span><br><span> \
&amp;request.ifr_count, sizeof(request.ifr_count));</span><br><span> \
}</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+		case \
B_SOCKET_GET_AF_STATE:</span><br><span style="color: hsl(120, 100%, \
40%);">+		{	</span><br><span style="color: hsl(120, 100%, \
40%);">+			TRACE(&quot;Inside B_SOCKET_GET_AF_STATE&quot;);</span><br><span \
style="color: hsl(120, 100%, 40%);">+		    struct ifafreq request;</span><br><span \
style="color: hsl(120, 100%, \
40%);">+			if(!interface-&gt;IsSupportedAddressFamily(protocol-&gt;domain-&gt;family))</span><br><span \
style="color: hsl(120, 100%, 40%);">+				return B_NOT_SUPPORTED;</span><br><span \
style="color: hsl(120, 100%, 40%);">+			request.state = \
interface-&gt;GetAddressFamilyState(protocol-&gt;domain-&gt;family);</span><br><span \
style="color: hsl(120, 100%, 40%);">+			user_memcpy(argument,&amp;request, \
length);</span><br><span style="color: hsl(120, 100%, 40%);">+			return B_OK; \
</span><br><span style="color: hsl(120, 100%, 40%);">+		}</span><br><span> 		case \
B_SOCKET_GET_ALIAS:</span><br><span> 		{</span><br><span> 			ifaliasreq \
request;</span><br><span>@@ -838,8 +848,7 @@</span><br><span> 						(const \
sockaddr*)&amp;request.ifra_addr);</span><br><span> 				} else {</span><br><span> \
// Find first address for family</span><br><span style="color: hsl(0, 100%, \
40%);">-					address = interface-&gt;FirstForFamily(</span><br><span style="color: \
hsl(0, 100%, 40%);">-						protocol-&gt;domain-&gt;family);</span><br><span \
style="color: hsl(120, 100%, 40%);">+					address = \
interface-&gt;FirstForFamily(protocol-&gt;domain-&gt;family);</span><br><span> \
}</span><br><span> </span><br><span> 				request.ifra_index = \
interface-&gt;IndexOfAddress(address);</span><br><span>diff --git \
a/src/add-ons/kernel/network/stack/interfaces.cpp \
b/src/add-ons/kernel/network/stack/interfaces.cpp</span><br><span>index \
ae004b8..be429c0 100644</span><br><span>--- \
a/src/add-ons/kernel/network/stack/interfaces.cpp</span><br><span>+++ \
b/src/add-ons/kernel/network/stack/interfaces.cpp</span><br><span>@@ -456,6 +456,9 \
@@</span><br><span> 		interfaceName, deviceInterface);</span><br><span> \
</span><br><span> 	int written = strlcpy(name, interfaceName, \
IF_NAMESIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+    \
AddAddressFamilySupport(AF_INET);</span><br><span style="color: hsl(120, 100%, \
40%);">+	AddAddressFamilySupport(AF_INET6);</span><br><span> 	memset(name + written, \
0, IF_NAMESIZE - written);</span><br><span> 		// Clear remaining \
space</span><br><span> </span><br><span>@@ -733,6 +736,22 @@</span><br><span> \
}</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+void </span><br><span style="color: hsl(120, 100%, \
40%);">+Interface::AddAddressFamilySupport(int family)</span><br><span style="color: \
hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, \
40%);">+	fAddressFamilies.Put(family, 0);</span><br><span style="color: hsl(120, \
100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+bool</span><br><span style="color: hsl(120, \
100%, 40%);">+Interface::IsSupportedAddressFamily(int family)</span><br><span \
style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, \
40%);">+	return fAddressFamilies.ContainsKey(family);</span><br><span style="color: \
hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+int \
</span><br><span style="color: hsl(120, 100%, \
40%);">+Interface::GetAddressFamilyState(int family)</span><br><span style="color: \
hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+	return \
fAddressFamilies.Get(family);</span><br><span style="color: hsl(120, 100%, \
40%);">+}</span><br><span> </span><br><span> /*!	This is called in order to call the \
correct methods of the datalink</span><br><span> 	protocols, ie. it will translate \
address changes to</span><br><span>@@ -743,7 +762,7 @@</span><br><span> \
*/</span><br><span> status_t</span><br><span> Interface::Control(net_domain* domain, \
int32 option, ifreq&amp; request,</span><br><span style="color: hsl(0, 100%, \
40%);">-	ifreq* userRequest, size_t length)</span><br><span style="color: hsl(120, \
100%, 40%);">+	void* userRequest, size_t length)</span><br><span> {</span><br><span> \
switch (option) {</span><br><span> 		case SIOCSIFFLAGS:</span><br><span>@@ -779,7 \
+798,17 @@</span><br><span> </span><br><span> 			return status;</span><br><span> \
}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: \
hsl(120, 100%, 40%);">+		case B_SOCKET_SET_AF_STATE:</span><br><span style="color: \
hsl(120, 100%, 40%);">+		{	</span><br><span style="color: hsl(120, 100%, \
40%);">+			struct ifafreq af ;</span><br><span style="color: hsl(120, 100%, \
40%);">+			if(!(fAddressFamilies.ContainsKey(domain-&gt;family)))</span><br><span \
style="color: hsl(120, 100%, 40%);">+				return B_NOT_SUPPORTED;</span><br><span \
style="color: hsl(120, 100%, 40%);">+			user_memcpy(&amp;af, userRequest, \
length);</span><br><span style="color: hsl(120, 100%, 40%);">+			TRACE(&quot;setting \
state = %d, family = %d&quot;,af.state, domain-&gt;family);</span><br><span \
style="color: hsl(120, 100%, 40%);">+			//TRACE(&quot;setting state = %d, family = \
%d&quot;,(struct ifafreq*)userRequest-&gt;state, domain-&gt;family);</span><br><span \
style="color: hsl(120, 100%, 40%);">+			fAddressFamilies.Put(domain-&gt;family, \
af.state);</span><br><span style="color: hsl(120, 100%, 40%);">+			return \
B_OK;</span><br><span style="color: hsl(120, 100%, 40%);">+		}</span><br><span> \
case B_SOCKET_SET_ALIAS:</span><br><span> 		{</span><br><span> 			if (length != \
sizeof(ifaliasreq))</span><br><span>@@ -854,7 +883,7 @@</span><br><span> \
address-&gt;destination,</span><br><span> \
(sockaddr*)&amp;aliasRequest.ifra_destination);</span><br><span> 			}</span><br><span \
style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, \
40%);">+			</span><br><span> 			address-&gt;ReleaseReference();</span><br><span> \
return status;</span><br><span> 		}</span><br><span>@@ -877,7 +906,7 \
@@</span><br><span> 			if (size &gt; sizeof(sockaddr_storage))</span><br><span> \
size = sizeof(sockaddr_storage);</span><br><span> </span><br><span style="color: \
hsl(0, 100%, 40%);">-			if (user_memcpy(&amp;newAddress, \
&amp;userRequest-&gt;ifr_addr, size) != B_OK)</span><br><span style="color: hsl(120, \
100%, 40%);">+			if (user_memcpy(&amp;newAddress, \
&amp;((ifreq*)userRequest)-&gt;ifr_addr, size) != B_OK)</span><br><span> 				return \
B_BAD_ADDRESS;</span><br><span> </span><br><span> 			if (option == SIOCDIFADDR) \
{</span><br><span>diff --git a/src/add-ons/kernel/network/stack/interfaces.h \
b/src/add-ons/kernel/network/stack/interfaces.h</span><br><span>index \
536ab34..fada789 100644</span><br><span>--- \
a/src/add-ons/kernel/network/stack/interfaces.h</span><br><span>+++ \
b/src/add-ons/kernel/network/stack/interfaces.h</span><br><span>@@ -16,7 +16,7 \
@@</span><br><span> #include &lt;net_stack.h&gt;</span><br><span> </span><br><span> \
#include &lt;Referenceable.h&gt;</span><br><span style="color: hsl(0, 100%, \
40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#include \
&quot;HashMap.h&quot;</span><br><span> #include \
&lt;util/AutoLock.h&gt;</span><br><span> #include \
&lt;util/DoublyLinkedList.h&gt;</span><br><span> #include \
&lt;util/OpenHashTable.h&gt;</span><br><span>@@ -112,7 +112,7 @@</span><br><span> \
</span><br><span> typedef BOpenHashTable&lt;DatalinkHashDefinition, true, true&gt; \
DatalinkTable;</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+typedef \
HashMap&lt;HashKey32&lt;int&gt;,int&gt; AddressFamilyStateMap;</span><br><span> class \
Interface : public DoublyLinkedListLinkImpl&lt;Interface&gt;,</span><br><span> \
public net_interface, public BReferenceable {</span><br><span> \
public:</span><br><span>@@ -136,7 +136,7 @@</span><br><span> \
void				RemoveAddresses();</span><br><span> </span><br><span> \
status_t			Control(net_domain* domain, int32 option,</span><br><span style="color: \
hsl(0, 100%, 40%);">-									ifreq&amp; request, ifreq* userRequest,</span><br><span \

<div style="display:none"> Gerrit-Project: haiku </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: \
Ibc14b290f84c2311c60bd3cc5a06b0f3b5c31b73 </div> <div style="display:none"> \
Gerrit-Change-Number: 7637 </div> <div style="display:none"> Gerrit-PatchSet: 1 \
</div> <div style="display:none"> Gerrit-Owner: Sayan Chaudhuri \
&lt;sayanchaudhuri758@gmail.com&gt; </div> <div style="display:none"> \
Gerrit-MessageType: newchange </div>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic