Hi all,
Sadly I have to use the Apani/Nortel VPN linux client to connect to my office. The latest version (3.5) stopped being compatible with the latest stable 2.6.22 kernel (how suprising :().
Since
1) I'm stuck using that closed source/proprietary software
2) there will most probably not be a new release from apani until year 2013
3) support from apani is near zero
we got used with previous version (aka 3.3) to hack the linux_wrapper.c file to try to keep the module compatible (http://www.fedoraforum.org/forum/showpost.php?p=742619&postcount=26)
Based on the horrors that showed up while compiling against a 2.6.22 kernel (see below), I was wondering if somebody would be kind enough to review our not-yet-working patch that converts dev_base/skb calls to the new API. A collegue of mine made all the required changes but when the netlock service gets fired-up the machine hang.
Are there any ways to debug this black box?
Help very much appreciated.
----------------------
Here is the not-yet-working patch against the linux_wrapper.c file:
--- cvc_linux-rh-gcc3-3.5.orig/src/linux_wrapper.c 2007-02-07 19:10:41.000000000 +0000
+++ cvc_linux-rh-gcc3-3.5/src/linux_wrapper.c 2007-08-21 17:42:30.000000000 +0000
@@ -136,6 +136,8 @@ int nl_open(struct inode *inode, struct
/* some necessary globals... */
#if ((LINUX_VERSION_CODE >= 0x020200) && (LINUX_VERSION_CODE < 0x020300))
typedef struct device net_device_t;
+#elif (LINUX_VERSION_CODE >= 0x020616)
+typedef struct list_head net_device_t;
#else
typedef struct net_device net_device_t;
#endif
@@ -306,8 +308,11 @@ nl_copy_to_user(void *to, const void *fr
void init_misc(void)
{
-
+#if (LINUX_VERSION_CODE >= 0x020616)
+ nl_dev_base = &dev_base_head;
+#else
nl_dev_base = dev_base;
+#endif
}
#if ((LINUX_VERSION_CODE >= 0x020200) && (LINUX_VERSION_CODE < 0x020300))
@@ -430,8 +435,13 @@ void nl_skb_put(struct sk_buff *skb, int
int nl_ip_rcv(struct sk_buff *skb, struct packet_type *pt)
{
#if (LINUX_VERSION_CODE > 0x02060c)
+#if (LINUX_VERSION_CODE >= 0x020616)
+ struct net_device *dev = skb->dev;
+ struct iphdr *iph = (struct iphdr*) skb->network_header;
+#else
struct net_device *dev = skb->dev;
struct iphdr *iph = skb->nh.iph;
+#endif
if (skb->dst == NULL)
{
@@ -469,28 +479,52 @@ int nl_unregister_netdevice_notifier(str
char *dev_name (net_device_t *dev)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (net_device_entry(dev)->name);
+#else
return (dev->name);
+#endif
}
int dev_name_len (net_device_t *dev)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (strlen(net_device_entry(dev)->name));
+#else
return (strlen(dev->name));
+#endif
}
unsigned *dev_mtu_ptr (net_device_t *dev)
{
- return (&dev->mtu);
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return &(net_device_entry(dev)->mtu);
+#else
+ return &(dev->mtu);
+#endif
}
unsigned dev_mtu (net_device_t *dev)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (net_device_entry(dev)->mtu);
+#else
return (dev->mtu);
+#endif
}
int dev_ifindex (net_device_t *dev)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (net_device_entry(dev)->ifindex);
+#else
return (dev->ifindex);
+#endif
}
void *dev_ip_ptr (net_device_t *dev)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (net_device_entry(dev)->ip_ptr);
+#else
return (dev->ip_ptr);
+#endif
}
net_device_t *dev_next (net_device_t *dev)
{
@@ -546,9 +580,15 @@ void nl_skb_dup (struct sk_buff *new_skb
head_offset = new_skb->head - skb->head;
new_skb->dev = skb->dev;
new_skb->dst = dst_clone(skb->dst);
+#if (LINUX_VERSION_CODE >= 0x020616)
+ new_skb->transport_header = skb->transport_header+head_offset;
+ new_skb->network_header = skb->network_header+head_offset;
+ new_skb->mac_header = skb->mac_header+head_offset;
+#else
new_skb->h.raw = skb->h.raw+head_offset;
new_skb->nh.raw = skb->nh.raw+head_offset;
new_skb->mac.raw = skb->mac.raw+head_offset;
+#endif
memcpy(new_skb->cb, skb->cb, sizeof(skb->cb));
new_skb->priority = skb->priority;
new_skb->protocol = skb->protocol;
@@ -573,9 +613,15 @@ void nl_skb_hdr_copy (struct sk_buff *sk
{
skb_to->dev = skb_from->dev;
skb_to->dst = skb_from->dst;
+#if (LINUX_VERSION_CODE >= 0x020616)
+ skb_to->transport_header = skb_from->transport_header;
+ skb_to->network_header = skb_from->network_header;
+ skb_to->mac_header = skb_from->mac_header;
+#else
skb_to->h.raw = skb_from->h.raw;
skb_to->nh.raw = skb_from->nh.raw;
skb_to->mac.raw = skb_from->mac.raw;
+#endif
memcpy(skb_to->cb, skb_from->cb, sizeof(skb_from->cb));
skb_to->priority = skb_from->priority;
skb_to->protocol = skb_from->protocol;
@@ -592,7 +638,11 @@ void nl_skb_hdr_copy (struct sk_buff *sk
struct iphdr * nl_skb_iph (struct sk_buff *skb)
{
+#if (LINUX_VERSION_CODE >= 0x020616)
+ return (struct iphdr*) skb->network_header;
+#else
return skb->nh.iph;
+#endif
}
net_device_t * nl_skb_dev (struct sk_buff *skb)
@@ -613,10 +663,14 @@ void nl_send_skb (struct sk_buff *skb, n
if (skb)
{
- skb->nh.iph = (struct iphdr *) skb->data;
skb->dev = dev;
-
- iph = skb->nh.iph;
+#if (LINUX_VERSION_CODE >= 0x020616)
+ skb->network_header = skb->data;
+ iph = (struct iphdr*) skb->network_header;
+#else
+ skb->nh.iph = (struct iphdr *) skb->data;
+ iph = skb->network_header.iph;
+#endif
rval = ip_route_output (&rt, iph->daddr, 0, RT_TOS(iph->tos), 0);
@@ -749,7 +803,11 @@ void do_checksum_offload( struct sk_buff
{
goto done_exit;
}
+#if (LINUX_VERSION_CODE >= 0x020616)
+ iph = (struct iphdr*) skb->network_header;
+#else
iph = skb->nh.iph;
+#endif
header_length = iph->ihl << 2; /* get the ip header length */
h_ptr = (char*)iph + header_length; /* get pointer to proto header */
frag_ptr = skb_shinfo( skb )->frag_list; /* at most, one frag */
@@ -765,11 +823,11 @@ void do_checksum_offload( struct sk_buff
csum = csum_partial( h_ptr, ntohs(iph->tot_len) - header_length, 0 );
check = csum_fold( csum_partial( frag_ptr->data, nl_data_len( frag_ptr ), csum ) );
}
- if ( skb->nh.iph->protocol == 17 ) /* if UDP, */
+ if ( iph->protocol == 17 ) /* if UDP, */
{
((struct udphdr*)h_ptr)->check = check;
}
- if ( skb->nh.iph->protocol == 6 ) /* if TCP, */
+ if ( iph->protocol == 6 ) /* if TCP, */
{
((struct tcphdr*)h_ptr)->check = check;
}
----------------------
Here are the "horrors" out of a make on the original linux_wrapper.c file against 2.6.22 kernel:
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'init_misc':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:310: error: 'dev_base' undeclared (first use in this function) /usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrap
per.c:310: error: (Each undeclared identifier is reported only once /usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrap
per.c:310: error: for each function it appears in.) /usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrap
per.c: In function 'nl_ip_rcv':/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrap
per.c:434: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'dev_next':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:497: error: 'net_device_t' has no member named 'next'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'nl_skb_dup':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:549: error: 'struct sk_buff' has no member named 'h'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:549: error: 'struct sk_buff' has no member named 'h'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:550: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:550: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:551: error: 'struct sk_buff' has no member named 'mac'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:551: error: 'struct sk_buff' has no member named 'mac'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'nl_skb_hdr_copy':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:576: error: 'struct sk_buff' has no member named 'h'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:576: error: 'struct sk_buff' has no member named 'h'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:577: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:577: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:578: error: 'struct sk_buff' has no member named 'mac'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:578: error: 'struct sk_buff' has no member named 'mac'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'nl_skb_iph':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:595: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'nl_send_skb':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:616: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:619: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c: In function 'nl_data_len':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:658: error: invalid operands to binary - /usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrap
per.c: In function 'do_checksum_offload':
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:752: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:768: error: 'struct sk_buff' has no member named 'nh'
/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.c:772: error: 'struct sk_buff' has no member named 'nh'
make[3]: ***
[/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6/linux_wrapper.o] Error 1
make[2]: ***
[_module_/usr/src/Nortel/Apani_VPN_v3.5/cvc_linux-rh-gcc3-3.5/src/k2.6]
Error 2
- vin
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]