[PC周辺] vmware-any-any-update116 + Linux 2.6.25 git 20080419版 (20080419)

[myn:2008041800] の続き.Linux 2.6.25 の git の最新版にあげると,

/tmp/vmware-config0/vmnet-only/bridge.c: In function 'VNetBridgeDevCompatible':
/tmp/vmware-config0/vmnet-only/bridge.c:278: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c:278: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c: In function 'VNetBridgeUp':
/tmp/vmware-config0/vmnet-only/bridge.c:913: error: 'struct net_device' has no member named 'nd_net'
/tmp/vmware-config0/vmnet-only/bridge.c:951: error: 'struct net_device' has no member named 'nd_net'

とか怒られる.これは,

[include/linux/netdevice.h]
#ifdef CONFIG_NET_NS
        /* Network namespace this network device is inside */
        struct net              *nd_net;
#endif

とかになっていて CONFIG_NET_NS が設定されていないから. とはいえ CONFIG_NET_NS は !CONFIG_SYSFS でなければ設定不能 (ということで普通は設定されない).ということで,

[include/linux/netdevice.h]
/*
 * Net namespace inlines
 */
static inline
struct net *dev_net(const struct net_device *dev)
{
#ifdef CONFIG_NET_NS
        return dev->nd_net;
#else
        return &init_net;
#endif
}

という method を使うことにする.

diff -ruw vmnet-only.orig/bridge.c vmnet-only/bridge.c
--- vmnet-only.orig/bridge.c 2007-11-28 19:25:06.000000000 +0900
+++ vmnet-only/bridge.c 2008-04-19 19:08:45.000000000 +0900
@@ -275,7 +275,7 @@
                         struct net_device *net)  // IN: Network device
 {
 #ifdef VMW_NETDEV_HAS_NET
-   if (net->nd_net != bridge->internalDev->nd_net) {
+   if (dev_net(net) != dev_net(bridge->internalDev)) {
       return 0;
    }
 #endif

と,

diff -ruw vmnet-only.orig/vmnet-only/vmnetInt.h vmnet-only/vmnetInt.h
--- vmnet-only.orig/vmnet-only/vmnetInt.h       2007-11-28 19:25:06.000000000 +0900
+++ vmnet-only/vmnetInt.h       2008-04-20 23:09:00.000000000 +0900
@@ -63,7 +63,7 @@
 #   define dev_lock_list()    read_lock(&dev_base_lock)
 #   define dev_unlock_list()  read_unlock(&dev_base_lock)
 #   ifdef VMW_NETDEV_HAS_NET
-#      define DEV_GET(x)      __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
+#      define DEV_GET(x)      __dev_get_by_name((dev_net((x)->internalDev)), (x)->name)
 #   else
 #      define DEV_GET(x)      __dev_get_by_name((x)->name)
 #   endif
@@ -85,7 +85,7 @@

 #ifdef VMW_NETDEV_HAS_NET
 extern struct proto vmnet_proto;
-#   define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
+#   define compat_sk_alloc(_bri, _pri) sk_alloc((dev_net((_bri)->internalDev)), \
                                                 PF_NETLINK, _pri, &vmnet_proto)
 #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
 extern struct proto vmnet_proto;

みたいな感じで(なんか無駄に括弧が多くしてしまったような気もする).

該当する Linux 側の変更は, [NET] NETNS: Omit net_device->nd_net without CONFIG_NET_NS.

関連リンク
参照リンク


Last-modified: Sun May 11 18:13:47 +0900 2008

全インデックス