[haiku-commits] r37806 - in haiku/trunk: headers/posix/net headers/posix/sys src/add-ons/kernel/network/stack src/libs/compat/freebsd_network/compat/net

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 29 Jul 2010 11:43:08 +0200 (CEST)

Author: axeld
Date: 2010-07-29 11:43:08 +0200 (Thu, 29 Jul 2010)
New Revision: 37806
Changeset: http://dev.haiku-os.org/changeset/37806

Modified:
   haiku/trunk/headers/posix/net/if.h
   haiku/trunk/headers/posix/sys/sockio.h
   haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp
   haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp
   haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h
   haiku/trunk/src/libs/compat/freebsd_network/compat/net/if.h
Log:
* Added Haiku specific socket ioctls to configure the interface aliases:
  SIOC_IF_ALIAS_ADD, SIOC_IF_ALIAS_REMOVE, SIOC_IF_ALIAS_GET, SIOC_ALIAS_SET,
  and SIOC_IF_ALIAS_COUNT.
* Implemented all of those new ioctls, though they are yet untested.
* Added ifreq::ifr_data, and removed the hack in the FreeBSD compat if.h
  header.
* Minor cleanup.


Modified: haiku/trunk/headers/posix/net/if.h
===================================================================
--- haiku/trunk/headers/posix/net/if.h  2010-07-29 09:38:07 UTC (rev 37805)
+++ haiku/trunk/headers/posix/net/if.h  2010-07-29 09:43:08 UTC (rev 37806)
@@ -31,7 +31,7 @@
 };
 
 struct ifreq {
-       char            ifr_name[IF_NAMESIZE];
+       char                    ifr_name[IF_NAMESIZE];
        union {
                struct sockaddr ifr_addr;
                struct sockaddr ifr_dstaddr;
@@ -39,21 +39,27 @@
                struct sockaddr ifr_mask;
                struct ifreq_stats ifr_stats;
                struct route_entry ifr_route;
-               int             ifr_flags;
-               int             ifr_index;
-               int             ifr_metric;
-               int             ifr_mtu;
-               int             ifr_media;
-               int             ifr_type;
-               int             ifr_reqcap;
+               int                     ifr_flags;
+               int                     ifr_index;
+               int                     ifr_metric;
+               int                     ifr_mtu;
+               int                     ifr_media;
+               int                     ifr_type;
+               int                     ifr_reqcap;
+               int                     ifr_count;
+               uint8_t*        ifr_data;
        };
 };
 
-/* used with SIOCAIFADDR */
+/* used with SIOC_IF_ALIAS_ADD, SIOC_IF_ALIAS_GET, SIOC_ALIAS_SET */
 struct ifaliasreq {
-       char            ifra_name[IF_NAMESIZE];
+       char                    ifra_name[IF_NAMESIZE];
+       int                             ifra_index;
        struct sockaddr_storage ifra_addr;
-       struct sockaddr_storage ifra_broadaddr;
+       union {
+               struct sockaddr_storage ifra_broadaddr;
+               struct sockaddr_storage ifra_destination;
+       };
        struct sockaddr_storage ifra_mask;
 };
 
@@ -72,12 +78,13 @@
 #define IFF_CONFIGURING                0x4000  /* auto configuration in 
progress */
 #define IFF_MULTICAST          0x8000  /* supports multicast */
 
+/* used with SIOCGIFCOUNT, and SIOCGIFCONF */
 struct ifconf {
-       int                     ifc_len;        /* size of buffer */
+       int                             ifc_len;        /* size of buffer */
        union {
-               void    *ifc_buf;
-               struct ifreq *ifc_req;
-               int             ifc_value;
+               void*           ifc_buf;
+               struct ifreq* ifc_req;
+               int                     ifc_value;
        };
 };
 
@@ -88,8 +95,8 @@
 /* POSIX definitions follow */
 
 struct if_nameindex {
-       unsigned        if_index;       /* positive interface index */
-       char            *if_name;       /* interface name, ie. "loopback" */
+       unsigned                if_index;       /* positive interface index */
+       char*                   if_name;        /* interface name, ie. 
"loopback" */
 };
 
 
@@ -97,13 +104,14 @@
 extern "C" {
 #endif
 
-unsigned if_nametoindex(const char *name);
-char *if_indextoname(unsigned index, char *nameBuffer);
-struct if_nameindex *if_nameindex(void);
-void if_freenameindex(struct if_nameindex *interfaceArray);
+unsigned if_nametoindex(const char* name);
+char* if_indextoname(unsigned index, char* nameBuffer);
+struct if_nameindex* if_nameindex(void);
+void if_freenameindex(struct if_nameindex* interfaceArray);
 
 #ifdef __cplusplus
 }
 #endif
 
+
 #endif /* _NET_IF_H */

Modified: haiku/trunk/headers/posix/sys/sockio.h
===================================================================
--- haiku/trunk/headers/posix/sys/sockio.h      2010-07-29 09:38:07 UTC (rev 
37805)
+++ haiku/trunk/headers/posix/sys/sockio.h      2010-07-29 09:43:08 UTC (rev 
37806)
@@ -6,59 +6,73 @@
 #define _SYS_SOCKIO_H
 
 
-#define SIOCADDRT                      8900    /* add route */
-#define SIOCDELRT                      8901    /* delete route */
-#define SIOCSIFADDR                    8902    /* set interface address */
-#define SIOCGIFADDR                    8903    /* get interface address */
-#define SIOCSIFDSTADDR         8904    /* set point-to-point address */
-#define SIOCGIFDSTADDR         8905    /* get point-to-point address */
-#define SIOCSIFFLAGS           8906    /* set interface flags */
-#define SIOCGIFFLAGS           8907    /* get interface flags */
-#define SIOCGIFBRDADDR         8908    /* get broadcast address */
-#define SIOCSIFBRDADDR         8909    /* set broadcast address */
-#define SIOCGIFCOUNT           8910    /* count interfaces */
-#define SIOCGIFCONF                    8911    /* get interface list */
-#define SIOCGIFINDEX           8912    /* interface name -> index */
-#define SIOCGIFNAME                    8913    /* interface index -> name */
-#define SIOCGIFNETMASK         8914    /* get net address mask */
-#define SIOCSIFNETMASK         8915    /* set net address mask */
-#define SIOCGIFMETRIC          8916    /* get interface metric */
-#define SIOCSIFMETRIC          8917    /* set interface metric */
-#define SIOCDIFADDR                    8918    /* delete interface address */
-#define SIOCAIFADDR                    8919    /* configure interface alias */
-#define SIOCADDMULTI           8920    /* add multicast address */
-#define SIOCDELMULTI           8921    /* delete multicast address */
-#define SIOCGIFMTU                     8922    /* get interface MTU */
-#define SIOCSIFMTU                     8923    /* set interface MTU */
-#define SIOCSIFMEDIA           8924    /* set net media */
-#define SIOCGIFMEDIA           8925    /* get net media */
+/*! Socket I/O control codes, usually via struct ifreq */
 
-#define SIOCGRTSIZE                    8926    /* get route table size */
-#define SIOCGRTTABLE           8927    /* get route table */
-#define SIOCGETRT                      8928    /* get route information for 
destination */
 
-#define SIOCGIFSTATS           8929    /* get interface stats */
-#define SIOCGIFTYPE                    8931    /* get interface type */
+#define SIOCADDRT                              8900    /* add route */
+#define SIOCDELRT                              8901    /* delete route */
+#define SIOCSIFADDR                            8902    /* set interface 
address */
+#define SIOCGIFADDR                            8903    /* get interface 
address */
+#define SIOCSIFDSTADDR                 8904    /* set point-to-point address */
+#define SIOCGIFDSTADDR                 8905    /* get point-to-point address */
+#define SIOCSIFFLAGS                   8906    /* set interface flags */
+#define SIOCGIFFLAGS                   8907    /* get interface flags */
+#define SIOCGIFBRDADDR                 8908    /* get broadcast address */
+#define SIOCSIFBRDADDR                 8909    /* set broadcast address */
+#define SIOCGIFCOUNT                   8910    /* count interfaces */
+#define SIOCGIFCONF                            8911    /* get interface list */
+#define SIOCGIFINDEX                   8912    /* interface name -> index */
+#define SIOCGIFNAME                            8913    /* interface index -> 
name */
+#define SIOCGIFNETMASK                 8914    /* get net address mask */
+#define SIOCSIFNETMASK                 8915    /* set net address mask */
+#define SIOCGIFMETRIC                  8916    /* get interface metric */
+#define SIOCSIFMETRIC                  8917    /* set interface metric */
+#define SIOCDIFADDR                            8918    /* delete interface 
address */
+#define SIOCAIFADDR                            8919
+       /* configure interface alias, ifaliasreq */
+#define SIOCADDMULTI                   8920    /* add multicast address */
+#define SIOCDELMULTI                   8921    /* delete multicast address */
+#define SIOCGIFMTU                             8922    /* get interface MTU */
+#define SIOCSIFMTU                             8923    /* set interface MTU */
+#define SIOCSIFMEDIA                   8924    /* set net media */
+#define SIOCGIFMEDIA                   8925    /* get net media */
 
-#define SIOCSPACKETCAP         8932    /* Start capturing packets on an 
interface */
-#define SIOCCPACKETCAP         8933    /* Stop capturing packets on an 
interface */
+#define SIOCGRTSIZE                            8926    /* get route table size 
*/
+#define SIOCGRTTABLE                   8927    /* get route table */
+#define SIOCGETRT                              8928
+       /* get route information for destination */
 
-#define SIOCSHIWAT                     8934    /* set high watermark */
-#define SIOCGHIWAT                     8935    /* get high watermark */
-#define SIOCSLOWAT                     8936    /* set low watermark */
-#define SIOCGLOWAT                     8937    /* get low watermark */
-#define SIOCATMARK                     8938    /* at out-of-band mark? */
-#define SIOCSPGRP                      8939    /* set process group */
-#define SIOCGPGRP                      8940    /* get process group */
+#define SIOCGIFSTATS                   8929    /* get interface stats */
+#define SIOCGIFTYPE                            8931    /* get interface type */
 
-#define SIOCGPRIVATE_0         8941    /* device private 0 */
-#define SIOCGPRIVATE_1         8942    /* device private 1 */
-#define SIOCSDRVSPEC           8943    /* set driver-specific parameters */
-#define SIOCGDRVSPEC           8944    /* get driver-specific parameters */
+#define SIOCSPACKETCAP                 8932    
+       /* Start capturing packets on an interface */
+#define SIOCCPACKETCAP                 8933    
+       /* Stop capturing packets on an interface */
 
-#define SIOCSIFGENERIC         8945    /* generic IF set op */
-#define SIOCGIFGENERIC         8946    /* generic IF get op */
+#define SIOCSHIWAT                             8934    /* set high watermark */
+#define SIOCGHIWAT                             8935    /* get high watermark */
+#define SIOCSLOWAT                             8936    /* set low watermark */
+#define SIOCGLOWAT                             8937    /* get low watermark */
+#define SIOCATMARK                             8938    /* at out-of-band mark? 
*/
+#define SIOCSPGRP                              8939    /* set process group */
+#define SIOCGPGRP                              8940    /* get process group */
 
-#define SIOCEND                                9000    /* SIOCEND >= highest 
SIOC* */
+#define SIOCGPRIVATE_0                 8941    /* device private 0 */
+#define SIOCGPRIVATE_1                 8942    /* device private 1 */
+#define SIOCSDRVSPEC                   8943    /* set driver-specific 
parameters */
+#define SIOCGDRVSPEC                   8944    /* get driver-specific 
parameters */
 
+#define SIOCSIFGENERIC                 8945    /* generic IF set op */
+#define SIOCGIFGENERIC                 8946    /* generic IF get op */
+
+#define SIOC_IF_ALIAS_REMOVE   8918    /* synonym for SIOCDIFADDR */
+#define SIOC_IF_ALIAS_ADD              8919    /* synonym for SIOCAIFADDR */
+#define SIOC_IF_ALIAS_SET              8947    /* set interface alias, 
ifaliasreq */
+#define SIOC_IF_ALIAS_GET              8948    /* get interface alias, 
ifaliasreq */
+#define SIOC_IF_ALIAS_COUNT            8959    /* count interface aliases */
+
+#define SIOCEND                                        9000    /* SIOCEND >= 
highest SIOC* */
+
+
 #endif /* _SYS_SOCKIO_H */

Modified: haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp   2010-07-29 
09:38:07 UTC (rev 37805)
+++ haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp   2010-07-29 
09:43:08 UTC (rev 37806)
@@ -159,6 +159,23 @@
 }
 
 
+status_t
+fill_address(const sockaddr* from, sockaddr* to, size_t maxLength)
+{
+       if (from != NULL) {
+               // Copy address over
+               return user_memcpy(to, from, min_c(from->sa_len, maxLength));
+       }
+
+       // Fill in empty address
+       sockaddr empty;
+       empty.sa_len = 2;
+       empty.sa_family = AF_UNSPEC;
+
+       return user_memcpy(to, &empty, min_c(2, maxLength));
+}
+
+
 //     #pragma mark - datalink module
 
 
@@ -180,7 +197,7 @@
                case SIOCGIFNAME:
                        return get_interface_name_or_index(domain, option, 
value, _length);
 
-               case SIOCAIFADDR:
+               case SIOCAIFADDR:       /* same as SIOC_IF_ALIAS_ADD */
                {
                        // add new interface address
                        if (*_length < sizeof(struct ifaliasreq))
@@ -203,7 +220,7 @@
                        net_device_interface* deviceInterface
                                = get_device_interface(request.ifra_name);
                        if (deviceInterface == NULL)
-                               return ENODEV;
+                               return B_DEVICE_NOT_FOUND;
 
                        status_t status = add_interface(request.ifra_name, 
domain, request,
                                deviceInterface);
@@ -212,7 +229,7 @@
                        return status;
                }
 
-               case SIOCDIFADDR:
+               case SIOCDIFADDR:       /* same as SIOC_IF_ALIAS_REMOVE */
                {
                        // remove interface (address)
                        struct ifreq request;
@@ -727,18 +744,48 @@
 
                        size_t maxLength = length - offsetof(ifreq, ifr_addr);
 
-                       sockaddr* address = 
*interfaceAddress->AddressFor(option);
-                       if (address != NULL) {
-                               // Copy address over
-                               return user_memcpy(&((struct 
ifreq*)argument)->ifr_addr,
-                                       address, min_c(address->sa_len, 
maxLength));
+                       return 
fill_address(*interfaceAddress->AddressFor(option),
+                               &((struct ifreq*)argument)->ifr_addr, 
maxLength);
+               }
+
+               case SIOC_IF_ALIAS_COUNT:
+               {
+                       ifreq request;
+                       request.ifr_count = interface->CountAddresses();
+
+                       return user_memcpy(&((struct 
ifreq*)argument)->ifr_count,
+                               &request.ifr_count, sizeof(request.ifr_count));
+               }
+
+               case SIOC_IF_ALIAS_GET:
+               {
+                       ifaliasreq request;
+                       if (user_memcpy(&request, argument, sizeof(ifaliasreq)) 
!= B_OK)
+                               return B_BAD_ADDRESS;
+
+                       InterfaceAddress* address
+                               = interface->AddressAt(request.ifra_index);
+                       if (address == NULL)
+                               return B_BAD_VALUE;
+
+                       status_t status = fill_address(address->local,
+                               (sockaddr*)&((struct 
ifaliasreq*)argument)->ifra_addr,
+                               sizeof(sockaddr_storage));
+                       if (status == B_OK) {
+                               status = fill_address(address->mask,
+                                       (sockaddr*)&((struct 
ifaliasreq*)argument)->ifra_mask,
+                                       sizeof(sockaddr_storage));
                        }
+                       if (status == B_OK) {
+                               status = fill_address(address->destination,
+                                       (sockaddr*)&((struct 
ifaliasreq*)argument)
+                                               ->ifra_destination,
+                                       sizeof(sockaddr_storage));
+                       }
 
-                       // Fill in empty address
-                       request.ifr_addr.sa_len = 2;
-                       request.ifr_addr.sa_family = AF_UNSPEC;
-                       return user_memcpy(&((struct ifreq*)argument)->ifr_addr,
-                               &request.ifr_addr, min_c(2, maxLength));
+                       address->ReleaseReference();
+
+                       return status;
                }
 
                case SIOCGIFFLAGS:

Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-07-29 
09:38:07 UTC (rev 37805)
+++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-07-29 
09:43:08 UTC (rev 37806)
@@ -18,9 +18,7 @@
 
 #include <KernelExport.h>
 
-#include <lock.h>
 #include <net_device.h>
-#include <util/AutoLock.h>
 
 #include "device_interfaces.h"
 #include "domains.h"
@@ -516,6 +514,40 @@
 }
 
 
+InterfaceAddress*
+Interface::AddressAt(size_t index)
+{
+       RecursiveLocker locker(fLock);
+       
+       AddressList::Iterator iterator = fAddresses.GetIterator();
+       size_t i = 0;
+       
+       while (InterfaceAddress* address = iterator.Next()) {
+               if (i++ == index) {
+                       address->AcquireReference();
+                       return address;
+               }
+       }
+
+       return NULL;
+}
+
+
+size_t
+Interface::CountAddresses()
+{
+       RecursiveLocker locker(fLock);
+       return fAddresses.Count();
+}
+
+
+/*!    This is called in order to call the correct methods of the datalink
+       protocols, ie. it will translate address changes to
+       net_datalink_protocol::change_address(), and IFF_UP changes to
+       net_datalink_protocol::interface_up(), and interface_down().
+
+       Everything else is passed unchanged to net_datalink_protocol::control().
+*/
 status_t
 Interface::Control(net_domain* domain, int32 option, ifreq& request,
        ifreq* userRequest, size_t length)
@@ -549,6 +581,51 @@
                        return status;
                }
                
+               case SIOC_IF_ALIAS_SET:
+               {
+                       RecursiveLocker locker(fLock);
+
+                       ifaliasreq aliasRequest;
+                       if (user_memcpy(&aliasRequest, userRequest, 
sizeof(ifaliasreq))
+                                       != B_OK)
+                               return B_BAD_ADDRESS;
+
+                       InterfaceAddress* address = 
AddressAt(aliasRequest.ifra_index);
+                       if (address == NULL)
+                               return B_BAD_VALUE;
+
+                       status_t status = B_OK;
+                       address->AcquireReference();
+                               // _ChangeAddress() currently unlocks, so we 
need another
+                               // reference to make sure "address" is not 
going away.
+
+                       if (!domain->address_module->equal_addresses(
+                                       (sockaddr*)&aliasRequest.ifra_addr, 
address->local)) {
+                               status = _ChangeAddress(locker, address, 
SIOCSIFADDR,
+                                       address->local, 
(sockaddr*)&aliasRequest.ifra_addr);
+                       }
+
+                       if (status == B_OK && 
!domain->address_module->equal_addresses(
+                                       (sockaddr*)&aliasRequest.ifra_mask, 
address->mask)) {
+                               status = _ChangeAddress(locker, address, 
SIOCSIFNETMASK,
+                                       address->mask, 
(sockaddr*)&aliasRequest.ifra_mask);
+                       }
+
+                       if (status == B_OK && 
!domain->address_module->equal_addresses(
+                                       
(sockaddr*)&aliasRequest.ifra_destination,
+                                       address->destination)) {
+                               status = _ChangeAddress(locker, address,
+                                       (domain->address_module->flags
+                                               & 
NET_ADDRESS_MODULE_FLAG_BROADCAST_ADDRESS) != 0
+                                                       ? SIOCSIFBRDADDR : 
SIOCSIFDSTADDR,
+                                       address->destination,
+                                       
(sockaddr*)&aliasRequest.ifra_destination);
+                       }
+
+                       address->ReleaseReference();
+                       return status;
+               }
+
                case SIOCSIFADDR:
                case SIOCSIFNETMASK:
                case SIOCSIFBRDADDR:
@@ -558,7 +635,6 @@
                        RecursiveLocker locker(fLock);
                        
                        InterfaceAddress* address = NULL;
-                       sockaddr_storage oldAddress;
                        sockaddr_storage newAddress;
 
                        size_t size = max_c(request.ifr_addr.sa_len, 
sizeof(sockaddr));
@@ -586,24 +662,9 @@
                        if (address == NULL)
                                return B_BAD_VALUE;
 
-                       if (*address->AddressFor(option) != NULL)
-                               memcpy(&oldAddress, 
*address->AddressFor(option), size);
-                       else
-                               oldAddress.ss_family = AF_UNSPEC;
-
-                       // TODO: mark this address busy or call while holding 
the lock!
-                       address->AcquireReference();
-                       locker.Unlock();
-
-                       domain_datalink* datalink = 
DomainDatalink(domain->family);
-                       status_t status = 
datalink->first_protocol->module->change_address(
-                               datalink->first_protocol, address, option,
-                               oldAddress.ss_family != AF_UNSPEC
-                                       ? (sockaddr*)&oldAddress : NULL,
+                       return _ChangeAddress(locker, address, option,
+                               *address->AddressFor(option),
                                option != SIOCDIFADDR ? (sockaddr*)&newAddress 
: NULL);
-
-                       address->ReleaseReference();
-                       return status;
                }
 
                default:
@@ -787,6 +848,33 @@
 }
 
 
+status_t
+Interface::_ChangeAddress(RecursiveLocker& locker, InterfaceAddress* address,
+       int32 option, const sockaddr* originalAddress, const sockaddr* 
newAddress)
+{
+       // Copy old address over
+       sockaddr_storage oldAddress;
+       if (address->domain->address_module->set_to((sockaddr*)&oldAddress,
+                       originalAddress) != B_OK)
+               oldAddress.ss_family = AF_UNSPEC;
+
+       // TODO: mark this address busy or call while holding the lock!
+       address->AcquireReference();
+       locker.Unlock();
+
+       domain_datalink* datalink = DomainDatalink(address->domain);
+       status_t status = datalink->first_protocol->module->change_address(
+               datalink->first_protocol, address, option,
+               oldAddress.ss_family != AF_UNSPEC ? (sockaddr*)&oldAddress : 
NULL,
+               newAddress != NULL && newAddress->sa_family != AF_UNSPEC
+                       ? newAddress : NULL);
+
+       locker.Lock();
+       address->ReleaseReference();
+       return status;
+}
+
+
 // #pragma mark -
 
 

Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h   2010-07-29 
09:38:07 UTC (rev 37805)
+++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h   2010-07-29 
09:43:08 UTC (rev 37806)
@@ -17,6 +17,7 @@
 
 #include <Referenceable.h>
 
+#include <util/AutoLock.h>
 #include <util/DoublyLinkedList.h>
 #include <util/OpenHashTable.h>
 
@@ -118,6 +119,8 @@
                        status_t                        
AddAddress(InterfaceAddress* address);
                        void                            
RemoveAddress(InterfaceAddress* address);
                        bool                            
GetNextAddress(InterfaceAddress** _address);
+                       InterfaceAddress*       AddressAt(size_t index);
+                       size_t                          CountAddresses();
 
                        status_t                        Control(net_domain* 
domain, int32 option,
                                                                        ifreq& 
request, ifreq* userRequest,
@@ -141,7 +144,10 @@
                        status_t                        _SetUp();
                        void                            _SetDown();
                        InterfaceAddress*       _FirstForFamily(int family);
-                       status_t                        
_AddDomainDatalink(net_domain* domain);
+                       status_t                        
_ChangeAddress(RecursiveLocker& locker,
+                                                                       
InterfaceAddress* address, int32 option,
+                                                                       const 
sockaddr* oldAddress,
+                                                                       const 
sockaddr* newAddress);
 
 private:
                        recursive_lock          fLock;

Modified: haiku/trunk/src/libs/compat/freebsd_network/compat/net/if.h
===================================================================
--- haiku/trunk/src/libs/compat/freebsd_network/compat/net/if.h 2010-07-29 
09:38:07 UTC (rev 37805)
+++ haiku/trunk/src/libs/compat/freebsd_network/compat/net/if.h 2010-07-29 
09:43:08 UTC (rev 37806)
@@ -6,43 +6,39 @@
 #define _FBSD_COMPAT_NET_IF_H_
 
 
-// Rename the ifreq structure provided by posix/net/if.h
-// so that we can add FreeBSD based ifreq parts.
-#define ifreq ifreq_haiku_unused
 #include <posix/net/if.h>
-#undef ifreq
 
 #include <sys/cdefs.h>
 #include <sys/queue.h>
 #include <sys/time.h>
 
 
-#define IF_Kbps(x)             ((x) * 1000)
-#define IF_Mbps(x)             (IF_Kbps((x) * 1000))
-#define IF_Gbps(x)             (IF_Mbps((x) * 1000))
+#define IF_Kbps(x)                             ((x) * 1000)
+#define IF_Mbps(x)                             (IF_Kbps((x) * 1000))
+#define IF_Gbps(x)                             (IF_Mbps((x) * 1000))
 
 /* Capabilities that interfaces can advertise. */
-#define IFCAP_RXCSUM           0x00001  /* can offload checksum on RX */
-#define IFCAP_TXCSUM           0x00002  /* can offload checksum on TX */
-#define IFCAP_NETCONS          0x00004  /* can be a network console */
-#define        IFCAP_VLAN_MTU          0x00008 /* VLAN-compatible MTU */
+#define IFCAP_RXCSUM                   0x00001 /* can offload checksum on RX */
+#define IFCAP_TXCSUM                   0x00002 /* can offload checksum on TX */
+#define IFCAP_NETCONS                  0x00004 /* can be a network console */
+#define        IFCAP_VLAN_MTU                  0x00008 /* VLAN-compatible MTU 
*/
 #define        IFCAP_VLAN_HWTAGGING    0x00010 /* hardware VLAN tag support */
-#define        IFCAP_JUMBO_MTU         0x00020 /* 9000 byte MTU supported */
-#define        IFCAP_POLLING           0x00040 /* driver supports polling */
-#define        IFCAP_VLAN_HWCSUM       0x00080
-#define        IFCAP_TSO4                      0x00100 /* supports TCP 
segmentation offload */
-#define        IFCAP_TSO6                      0x00200 /* can do TCP6 
Segmentation Offload */
-#define        IFCAP_WOL_UCAST         0x00800 /* wake on any unicast frame */
-#define        IFCAP_WOL_MCAST         0x01000 /* wake on any multicast frame 
*/
-#define        IFCAP_WOL_MAGIC         0x02000 /* wake on any Magic Packet */
-#define        IFCAP_VLAN_HWFILTER     0x10000 /* interface hw can filter vlan 
tag */
-#define        IFCAP_POLLING_NOCOUNT 0x20000
-#define        IFCAP_VLAN_HWTSO        0x40000
-#define        IFCAP_LINKSTATE         0x80000
+#define        IFCAP_JUMBO_MTU                 0x00020 /* 9000 byte MTU 
supported */
+#define        IFCAP_POLLING                   0x00040 /* driver supports 
polling */
+#define        IFCAP_VLAN_HWCSUM               0x00080
+#define        IFCAP_TSO4                              0x00100 /* supports TCP 
segmentation offload */
+#define        IFCAP_TSO6                              0x00200 /* can do TCP6 
Segmentation Offload */
+#define        IFCAP_WOL_UCAST                 0x00800 /* wake on any unicast 
frame */
+#define        IFCAP_WOL_MCAST                 0x01000 /* wake on any 
multicast frame */
+#define        IFCAP_WOL_MAGIC                 0x02000 /* wake on any Magic 
Packet */
+#define        IFCAP_VLAN_HWFILTER             0x10000 /* interface hw can 
filter vlan tag */
+#define        IFCAP_POLLING_NOCOUNT   0x20000
+#define        IFCAP_VLAN_HWTSO                0x40000
+#define        IFCAP_LINKSTATE                 0x80000
 
-#define IFCAP_HWCSUM           (IFCAP_RXCSUM | IFCAP_TXCSUM)
-#define IFCAP_TSO      (IFCAP_TSO4 | IFCAP_TSO6)
-#define        IFCAP_WOL       (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | 
IFCAP_WOL_MAGIC)
+#define IFCAP_HWCSUM   (IFCAP_RXCSUM | IFCAP_TXCSUM)
+#define IFCAP_TSO              (IFCAP_TSO4 | IFCAP_TSO6)
+#define        IFCAP_WOL               (IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | 
IFCAP_WOL_MAGIC)
 
 
 #define IFF_DRV_RUNNING                0x00010000
@@ -60,36 +56,14 @@
 #define IFQ_MAXLEN                     50
 
 
-struct ifreq {
-       char    ifr_name[IFNAMSIZ];             /* if name, e.g. "en0" */
-       union {
-               struct sockaddr ifr_addr;
-               struct sockaddr ifr_dstaddr;
-               struct sockaddr ifr_broadaddr;
-               struct sockaddr ifr_mask;
-               struct ifreq_stats ifr_stats;
-               struct route_entry ifr_route;
-               int             ifr_flags;
-               int             ifr_index;
-               int             ifr_metric;
-               int             ifr_mtu;
-               int             ifr_media;
-               int             ifr_type;
-               int             ifr_reqcap;
-
-               // FreeBSD specific Part
-               caddr_t ifr_data;
-       };
-};
-
 struct ifmediareq {
        char    ifm_name[IFNAMSIZ];     /* if name, e.g. "en0" */
-       int     ifm_current;            /* current media options */
-       int     ifm_mask;               /* don't care mask */
-       int     ifm_status;             /* media status */
-       int     ifm_active;             /* active options */
-       int     ifm_count;              /* # entries in ifm_ulist array */
-       int     *ifm_ulist;             /* media words */
+       int             ifm_current;            /* current media options */
+       int             ifm_mask;                       /* don't care mask */
+       int             ifm_status;                     /* media status */
+       int             ifm_active;                     /* active options */
+       int             ifm_count;                      /* # entries in 
ifm_ulist array */
+       int*    ifm_ulist;                      /* media words */
 };
 
 /*
@@ -98,16 +72,16 @@
  */
 struct if_data {
        /* generic interface information */
-       u_char  ifi_type;               /* ethernet, tokenring, etc */
+       u_char  ifi_type;                       /* ethernet, tokenring, etc */
        u_char  ifi_physical;           /* e.g., AUI, Thinnet, 10base-T, etc */
        u_char  ifi_addrlen;            /* media address length */
-       u_char  ifi_hdrlen;             /* media header length */
+       u_char  ifi_hdrlen;                     /* media header length */
        u_char  ifi_link_state;         /* current link state */
        u_char  ifi_recvquota;          /* polling quota for receive intrs */
        u_char  ifi_xmitquota;          /* polling quota for xmit intrs */
        u_char  ifi_datalen;            /* length of this data struct */
-       u_long  ifi_mtu;                /* maximum transmission unit */
-       u_long  ifi_metric;             /* routing metric (external only) */
+       u_long  ifi_mtu;                        /* maximum transmission unit */
+       u_long  ifi_metric;                     /* routing metric (external 
only) */
        u_long  ifi_baudrate;           /* linespeed */
        /* volatile statistics */
        u_long  ifi_ipackets;           /* packets received on interface */
@@ -115,14 +89,14 @@
        u_long  ifi_opackets;           /* packets sent on interface */
        u_long  ifi_oerrors;            /* output errors on interface */
        u_long  ifi_collisions;         /* collisions on csma interfaces */
-       u_long  ifi_ibytes;             /* total number of octets received */
-       u_long  ifi_obytes;             /* total number of octets sent */
+       u_long  ifi_ibytes;                     /* total number of octets 
received */
+       u_long  ifi_obytes;                     /* total number of octets sent 
*/
        u_long  ifi_imcasts;            /* packets received via multicast */
        u_long  ifi_omcasts;            /* packets sent via multicast */
        u_long  ifi_iqdrops;            /* dropped on input, this interface */
        u_long  ifi_noproto;            /* destined for unsupported protocol */
        u_long  ifi_hwassist;           /* HW offload capabilities */
-       time_t  ifi_epoch;              /* uptime at attach or stat reset */
+       time_t  ifi_epoch;                      /* uptime at attach or stat 
reset */
 #ifdef __alpha__
        u_int   ifi_timepad;            /* time_t is int, not long on alpha */
 #endif
@@ -130,15 +104,16 @@
 };
 
 struct  ifdrv {
-       char            ifd_name[IFNAMSIZ];     /* if name, e.g. "en0" */
-       unsigned long   ifd_cmd;
-       size_t          ifd_len;
-       void            *ifd_data;
+       char                    ifd_name[IFNAMSIZ];     /* if name, e.g. "en0" 
*/
+       unsigned long   ifd_cmd;
+       size_t                  ifd_len;
+       void*                   ifd_data;
 };
 
 #ifdef _KERNEL
-/* XXX - this should go away soon. */
-#include <net/if_var.h>
+/* TODO: this should go away soon. */
+#      include <net/if_var.h>
 #endif
 
-#endif
+
+#endif /* _FBSD_COMPAT_NET_IF_H_ */


Other related posts:

  • » [haiku-commits] r37806 - in haiku/trunk: headers/posix/net headers/posix/sys src/add-ons/kernel/network/stack src/libs/compat/freebsd_network/compat/net - axeld