[ovs-dev] [PATCH 1/5] Add defines, enums and headers for MSVC

Alin Serdean aserdean at cloudbasesolutions.com
Thu Jul 17 19:33:03 UTC 2014


Add defines needed to compile netlink-socket.c and netlink.c.

Add wrappers for the functions sendmsg and recvmsg. They can also be added to
another file instead of defining them inlined.

Add a wrapper and the functionality behind it for syconf.

Add the newly created files to the noinst_HEADERS in windows/automake.mk

Signed-off-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
---
 include/windows/automake.mk        |   2 +
 include/windows/linux/rtnetlink.h  | 260 +++++++++++++++++++++++++++++++++++++
 include/windows/net/if.h           |  50 +++++++
 include/windows/netpacket/packet.h |  76 +++++++++++
 include/windows/sys/socket.h       |   4 +
 include/windows/sys/uio.h          |  22 ++++
 include/windows/unistd.h           |  50 +++++++
 7 files changed, 464 insertions(+)
 create mode 100644 include/windows/linux/rtnetlink.h
 create mode 100644 include/windows/netpacket/packet.h

diff --git a/include/windows/automake.mk b/include/windows/automake.mk
index 4d5a42c..db87ff3 100644
--- a/include/windows/automake.mk
+++ b/include/windows/automake.mk
@@ -7,8 +7,10 @@
 
 noinst_HEADERS += \
     include/windows/arpa/inet.h \
+    include/windows/netpacket/packet.h \
     include/windows/dirent.h \
     include/windows/getopt.h \
+    include/windows/linux/rtnetlink.h \
     include/windows/net/if.h \
     include/windows/netdb.h \
     include/windows/netinet/icmp6.h \
diff --git a/include/windows/linux/rtnetlink.h b/include/windows/linux/rtnetlink.h
new file mode 100644
index 0000000..8eeb69a
--- /dev/null
+++ b/include/windows/linux/rtnetlink.h
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2014 Cloudbase Solutions Srl
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LINUX_RTNETLINK_H
+#define __LINUX_RTNETLINK_H 1
+
+enum {
+    RTM_BASE        = 16,
+#define RTM_BASE        RTM_BASE
+
+    RTM_NEWLINK     = 16,
+#define RTM_NEWLINK     RTM_NEWLINK
+    RTM_DELLINK,
+#define RTM_DELLINK     RTM_DELLINK
+    RTM_GETLINK,
+#define RTM_GETLINK     RTM_GETLINK
+    RTM_SETLINK,
+#define RTM_SETLINK     RTM_SETLINK
+
+    RTM_NEWADDR     = 20,
+#define RTM_NEWADDR     RTM_NEWADDR
+    RTM_DELADDR,
+#define RTM_DELADDR     RTM_DELADDR
+    RTM_GETADDR,
+#define RTM_GETADDR     RTM_GETADDR
+
+    RTM_NEWROUTE    = 24,
+#define RTM_NEWROUTE    RTM_NEWROUTE
+    RTM_DELROUTE,
+#define RTM_DELROUTE    RTM_DELROUTE
+    RTM_GETROUTE,
+#define RTM_GETROUTE    RTM_GETROUTE
+
+    RTM_NEWNEIGH    = 28,
+#define RTM_NEWNEIGH    RTM_NEWNEIGH
+    RTM_DELNEIGH,
+#define RTM_DELNEIGH    RTM_DELNEIGH
+    RTM_GETNEIGH,
+#define RTM_GETNEIGH    RTM_GETNEIGH
+
+    RTM_NEWRULE     = 32,
+#define RTM_NEWRULE     RTM_NEWRULE
+    RTM_DELRULE,
+#define RTM_DELRULE     RTM_DELRULE
+    RTM_GETRULE,
+#define RTM_GETRULE     RTM_GETRULE
+
+    RTM_NEWQDISC    = 36,
+#define RTM_NEWQDISC    RTM_NEWQDISC
+    RTM_DELQDISC,
+#define RTM_DELQDISC    RTM_DELQDISC
+    RTM_GETQDISC,
+#define RTM_GETQDISC    RTM_GETQDISC
+
+    RTM_NEWTCLASS   = 40,
+#define RTM_NEWTCLASS   RTM_NEWTCLASS
+    RTM_DELTCLASS,
+#define RTM_DELTCLASS   RTM_DELTCLASS
+    RTM_GETTCLASS,
+#define RTM_GETTCLASS   RTM_GETTCLASS
+
+    RTM_NEWTFILTER  = 44,
+#define RTM_NEWTFILTER  RTM_NEWTFILTER
+    RTM_DELTFILTER,
+#define RTM_DELTFILTER  RTM_DELTFILTER
+    RTM_GETTFILTER,
+#define RTM_GETTFILTER  RTM_GETTFILTER
+
+    RTM_NEWACTION   = 48,
+#define RTM_NEWACTION   RTM_NEWACTION
+    RTM_DELACTION,
+#define RTM_DELACTION   RTM_DELACTION
+    RTM_GETACTION,
+#define RTM_GETACTION   RTM_GETACTION
+
+    RTM_NEWPREFIX   = 52,
+#define RTM_NEWPREFIX   RTM_NEWPREFIX
+
+    RTM_GETMULTICAST = 58,
+#define RTM_GETMULTICAST RTM_GETMULTICAST
+
+    RTM_GETANYCAST  = 62,
+#define RTM_GETANYCAST  RTM_GETANYCAST
+
+    RTM_NEWNEIGHTBL = 64,
+#define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL
+    RTM_GETNEIGHTBL = 66,
+#define RTM_GETNEIGHTBL RTM_GETNEIGHTBL
+    RTM_SETNEIGHTBL,
+#define RTM_SETNEIGHTBL RTM_SETNEIGHTBL
+
+    RTM_NEWNDUSEROPT = 68,
+#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
+    RTM_NEWADDRLABEL = 72,
+#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
+    RTM_DELADDRLABEL,
+#define RTM_DELADDRLABEL RTM_DELADDRLABEL
+    RTM_GETADDRLABEL,
+#define RTM_GETADDRLABEL RTM_GETADDRLABEL
+
+    RTM_GETDCB = 78,
+#define RTM_GETDCB RTM_GETDCB
+    RTM_SETDCB,
+#define RTM_SETDCB RTM_SETDCB
+
+    RTM_NEWNETCONF = 80,
+#define RTM_NEWNETCONF RTM_NEWNETCONF
+    RTM_GETNETCONF = 82,
+#define RTM_GETNETCONF RTM_GETNETCONF
+
+    RTM_NEWMDB = 84,
+#define RTM_NEWMDB RTM_NEWMDB
+    RTM_DELMDB = 85,
+#define RTM_DELMDB RTM_DELMDB
+    RTM_GETMDB = 86,
+#define RTM_GETMDB RTM_GETMDB
+
+    __RTM_MAX,
+#define RTM_MAX         (((__RTM_MAX + 3) & ~3) - 1)
+};
+
+enum rtnetlink_groups {
+    RTNLGRP_NONE,
+#define RTNLGRP_NONE            RTNLGRP_NONE
+    RTNLGRP_LINK,
+#define RTNLGRP_LINK            RTNLGRP_LINK
+    RTNLGRP_NOTIFY,
+#define RTNLGRP_NOTIFY          RTNLGRP_NOTIFY
+    RTNLGRP_NEIGH,
+#define RTNLGRP_NEIGH           RTNLGRP_NEIGH
+    RTNLGRP_TC,
+#define RTNLGRP_TC              RTNLGRP_TC
+    RTNLGRP_IPV4_IFADDR,
+#define RTNLGRP_IPV4_IFADDR     RTNLGRP_IPV4_IFADDR
+    RTNLGRP_IPV4_MROUTE,
+#define RTNLGRP_IPV4_MROUTE     RTNLGRP_IPV4_MROUTE
+    RTNLGRP_IPV4_ROUTE,
+#define RTNLGRP_IPV4_ROUTE      RTNLGRP_IPV4_ROUTE
+    RTNLGRP_IPV4_RULE,
+#define RTNLGRP_IPV4_RULE       RTNLGRP_IPV4_RULE
+    RTNLGRP_IPV6_IFADDR,
+#define RTNLGRP_IPV6_IFADDR     RTNLGRP_IPV6_IFADDR
+    RTNLGRP_IPV6_MROUTE,
+#define RTNLGRP_IPV6_MROUTE     RTNLGRP_IPV6_MROUTE
+    RTNLGRP_IPV6_ROUTE,
+#define RTNLGRP_IPV6_ROUTE      RTNLGRP_IPV6_ROUTE
+    RTNLGRP_IPV6_IFINFO,
+#define RTNLGRP_IPV6_IFINFO     RTNLGRP_IPV6_IFINFO
+    RTNLGRP_DECnet_IFADDR,
+#define RTNLGRP_DECnet_IFADDR   RTNLGRP_DECnet_IFADDR
+    RTNLGRP_NOP2,
+    RTNLGRP_DECnet_ROUTE,
+#define RTNLGRP_DECnet_ROUTE    RTNLGRP_DECnet_ROUTE
+    RTNLGRP_DECnet_RULE,
+#define RTNLGRP_DECnet_RULE     RTNLGRP_DECnet_RULE
+    RTNLGRP_NOP4,
+    RTNLGRP_IPV6_PREFIX,
+#define RTNLGRP_IPV6_PREFIX     RTNLGRP_IPV6_PREFIX
+    RTNLGRP_IPV6_RULE,
+#define RTNLGRP_IPV6_RULE       RTNLGRP_IPV6_RULE
+    RTNLGRP_ND_USEROPT,
+#define RTNLGRP_ND_USEROPT      RTNLGRP_ND_USEROPT
+    RTNLGRP_PHONET_IFADDR,
+#define RTNLGRP_PHONET_IFADDR   RTNLGRP_PHONET_IFADDR
+    RTNLGRP_PHONET_ROUTE,
+#define RTNLGRP_PHONET_ROUTE    RTNLGRP_PHONET_ROUTE
+    RTNLGRP_DCB,
+#define RTNLGRP_DCB             RTNLGRP_DCB
+    __RTNLGRP_MAX
+};
+
+enum rtattr_type_t {
+    RTA_UNSPEC,
+    RTA_DST,
+    RTA_SRC,
+    RTA_IIF,
+    RTA_OIF,
+    RTA_GATEWAY,
+    RTA_PRIORITY,
+    RTA_PREFSRC,
+    RTA_METRICS,
+    RTA_MULTIPATH,
+    RTA_PROTOINFO,
+    RTA_FLOW,
+    RTA_CACHEINFO,
+    RTA_SESSION,
+    RTA_MP_ALGO,
+    RTA_TABLE,
+    RTA_MARK,
+    RTA_MFC_STATS,
+    __RTA_MAX
+};
+
+enum {
+    RTN_UNSPEC,
+    RTN_UNICAST,
+    RTN_LOCAL,
+    RTN_BROADCAST,
+    RTN_ANYCAST,
+    RTN_MULTICAST,
+    RTN_BLACKHOLE,
+    RTN_UNREACHABLE,
+    RTN_PROHIBIT,
+    RTN_THROW,
+    RTN_NAT,
+    RTN_XRESOLVE,
+    __RTN_MAX
+};
+#define RTN_MAX (__RTN_MAX - 1)
+
+enum rt_scope_t {
+    RT_SCOPE_UNIVERSE=0,
+    RT_SCOPE_SITE=200,
+    RT_SCOPE_LINK=253,
+    RT_SCOPE_HOST=254,
+    RT_SCOPE_NOWHERE=255
+};
+
+struct rtmsg {
+    unsigned char           rtm_family;
+    unsigned char           rtm_dst_len;
+    unsigned char           rtm_src_len;
+    unsigned char           rtm_tos;
+
+    unsigned char           rtm_table;
+    unsigned char           rtm_protocol;
+    unsigned char           rtm_scope;
+    unsigned char           rtm_type;
+
+    unsigned                rtm_flags;
+};
+#define RTA_MAX (__RTA_MAX - 1)
+
+struct ifinfomsg {
+    unsigned char   ifi_family;
+    unsigned char   __ifi_pad;
+    unsigned short  ifi_type;
+    int             ifi_index;
+    unsigned        ifi_flags;
+    unsigned        ifi_change;
+};
+
+struct rtgenmsg {
+    unsigned char   rtgen_family;
+};
+
+#endif /* linux/rtnetlink.h */
diff --git a/include/windows/net/if.h b/include/windows/net/if.h
index 893ffe4..3a064ae 100644
--- a/include/windows/net/if.h
+++ b/include/windows/net/if.h
@@ -21,4 +21,54 @@
 
 #define IFNAMSIZ IF_NAMESIZE
 
+enum {
+    IFLA_UNSPEC,
+    IFLA_ADDRESS,
+    IFLA_BROADCAST,
+    IFLA_IFNAME,
+    IFLA_MTU,
+    IFLA_LINK,
+    IFLA_QDISC,
+    IFLA_STATS,
+    IFLA_COST,
+#define IFLA_COST IFLA_COST
+    IFLA_PRIORITY,
+#define IFLA_PRIORITY IFLA_PRIORITY
+    IFLA_MASTER,
+#define IFLA_MASTER IFLA_MASTER
+    IFLA_WIRELESS,
+#define IFLA_WIRELESS IFLA_WIRELESS
+    IFLA_PROTINFO,
+#define IFLA_PROTINFO IFLA_PROTINFO
+    IFLA_TXQLEN,
+#define IFLA_TXQLEN IFLA_TXQLEN
+    IFLA_MAP,
+#define IFLA_MAP IFLA_MAP
+    IFLA_WEIGHT,
+#define IFLA_WEIGHT IFLA_WEIGHT
+    IFLA_OPERSTATE,
+    IFLA_LINKMODE,
+    IFLA_LINKINFO,
+#define IFLA_LINKINFO IFLA_LINKINFO
+    IFLA_NET_NS_PID,
+    IFLA_IFALIAS,
+    IFLA_NUM_VF,
+    IFLA_VFINFO_LIST,
+    IFLA_STATS64,
+    IFLA_VF_PORTS,
+    IFLA_PORT_SELF,
+    IFLA_AF_SPEC,
+    IFLA_GROUP,
+    IFLA_NET_NS_FD,
+    IFLA_EXT_MASK,
+    IFLA_PROMISCUITY,
+#define IFLA_PROMISCUITY IFLA_PROMISCUITY
+    IFLA_NUM_TX_QUEUES,
+    IFLA_NUM_RX_QUEUES,
+    IFLA_CARRIER,
+    IFLA_PHYS_PORT_ID,
+    __IFLA_MAX
+};
+#define IFLA_MAX (__IFLA_MAX - 1)
+
 #endif /* net/if.h */
diff --git a/include/windows/netpacket/packet.h b/include/windows/netpacket/packet.h
new file mode 100644
index 0000000..40cb86b
--- /dev/null
+++ b/include/windows/netpacket/packet.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2014 Cloudbase Solutions Srl
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NETPACKET_PACKET_H
+#define __NETPACKET_PACKET_H 1
+
+struct iovec
+{
+    void *iov_base;
+    unsigned int iov_len;
+};
+
+struct msghdr
+  {
+    void *msg_name;
+    socklen_t msg_namelen;
+
+    struct iovec *msg_iov;
+    size_t msg_iovlen;
+
+    void *msg_control;
+    size_t msg_controllen;
+
+    int msg_flags;
+  };
+
+__inline unsigned int recvmsg(HANDLE handle, struct msghdr *msg, int flags)
+{
+    INT error = 0, retval = 0;
+    error = ReadFile(handle, msg->msg_iov[0].iov_base,
+                     msg->msg_iov[0].iov_len, &retval, NULL);
+    DWORD last_error = GetLastError();
+
+    if (last_error != ERROR_IO_PENDING && !retval) {
+        retval = -1;
+        _set_errno(EAGAIN);
+    }
+    else {
+    _set_errno(EAGAIN);
+    }
+    return retval;
+}
+
+__inline unsigned int sendmsg(HANDLE handle, const struct msghdr *msg, int flags)
+{
+    int error = 0, retval = 0;
+    DWORD last_error = 0;
+    for (int i = 0; i < msg->msg_iovlen; i++) {
+        do {
+            error = WriteFile(handle, msg->msg_iov[i].iov_base,
+                              msg->msg_iov[i].iov_len, NULL, NULL);
+            last_error = GetLastError();
+        } while ((error == 0) && (last_error == ERROR_IO_PENDING));
+    if(!error) {
+        _set_errno(EAGAIN);
+        return -1;
+    }
+    
+    }
+    return 0;
+}
+
+#endif /* netpacket/packet.h */
diff --git a/include/windows/sys/socket.h b/include/windows/sys/socket.h
index ab6e822..1685ae2 100644
--- a/include/windows/sys/socket.h
+++ b/include/windows/sys/socket.h
@@ -19,4 +19,8 @@
 
 typedef unsigned short int sa_family_t;
 
+#define AF_NETLINK              16
+#define SO_RCVBUFFORCE          33
+#define MSG_DONTWAIT            MSG_DONTROUTE
+
 #endif /* sys/socket.h */
diff --git a/include/windows/sys/uio.h b/include/windows/sys/uio.h
index e69de29..e92a772 100644
--- a/include/windows/sys/uio.h
+++ b/include/windows/sys/uio.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2014 Cloudbase Solutions Srl
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SYS_UIO_H
+#define __SYS_UIO_H 1
+
+#include <netpacket/packet.h>
+
+#endif /* sys/uio.h */
diff --git a/include/windows/unistd.h b/include/windows/unistd.h
index d9ded5a..f802e00 100644
--- a/include/windows/unistd.h
+++ b/include/windows/unistd.h
@@ -16,6 +16,9 @@
 #ifndef _UNISTD_H
 #define _UNISTD_H   1
 
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
 #define fsync _commit
 
 /* Standard file descriptors.  */
@@ -23,4 +26,51 @@
 #define STDOUT_FILENO   1   /* Standard output.  */
 #define STDERR_FILENO   2   /* Standard error output.  */
 
+#define _SC_UIO_MAXIOV                  2
+#define _XOPEN_IOV_MAX                 16
+
+#define _SC_PAGESIZE                    0x1
+#define _SC_NPROCESSORS_ONLN            0x2
+#define _SC_PHYS_PAGES                  0x4
+
+__inline int GetNumLogicalProcessors(void)
+{
+    SYSTEM_INFO info_temp;
+    GetSystemInfo(&info_temp);
+    long int n_cores = info_temp.dwNumberOfProcessors;
+    return n_cores;
+}
+
+__inline long sysconf(int name)
+{
+    long value = -1;
+    long page_size = -1;
+    SYSTEM_INFO sysInfo;
+    MEMORYSTATUSEX status;
+
+    switch (name)
+    {
+    case _SC_NPROCESSORS_ONLN:
+        value = GetNumLogicalProcessors();
+        break;
+
+    case _SC_PAGESIZE:
+        GetSystemInfo(&sysInfo);
+        value = sysInfo.dwPageSize;
+        break;
+
+    case _SC_PHYS_PAGES:
+        status.dwLength = sizeof(status);
+        page_size = sysconf(_SC_PAGESIZE);
+        if (GlobalMemoryStatusEx(&status) && page_size != -1) {
+            value = status.ullTotalPhys / page_size;
+        }
+        break;
+    default:
+        break;
+    }
+
+    return value;
+}
+
 #endif /* unistd.h  */
-- 
1.9.0.msysgit.0
 


More information about the dev mailing list