patch-2.1.38 linux/net/ipv6/datagram.c
Next file: linux/net/ipv6/ip6_input.c
Previous file: linux/net/ipv6/af_inet6.c
Back to the patch index
Back to the overall index
- Lines: 90
- Date:
Thu May 15 14:43:52 1997
- Orig file:
v2.1.37/linux/net/ipv6/datagram.c
- Orig date:
Tue May 13 22:41:24 1997
diff -u --recursive --new-file v2.1.37/linux/net/ipv6/datagram.c linux/net/ipv6/datagram.c
@@ -5,7 +5,7 @@
* Authors:
* Pedro Roque <roque@di.fc.ul.pt>
*
- * $Id: datagram.c,v 1.11 1997/05/03 00:58:25 davem Exp $
+ * $Id: datagram.c,v 1.12 1997/05/15 18:55:09 davem Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -39,7 +39,7 @@
src_info.ipi6_ifindex = skb->dev->ifindex;
ipv6_addr_copy(&src_info.ipi6_addr, &skb->nh.ipv6h->daddr);
- put_cmsg(msg, SOL_IPV6, IPV6_RXINFO, sizeof(src_info), &src_info);
+ put_cmsg(msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info);
}
if (np->rxhlim) {
@@ -67,20 +67,18 @@
for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
if (cmsg->cmsg_level != SOL_IPV6) {
- printk(KERN_DEBUG "cmsg_level %d\n", cmsg->cmsg_level);
+ printk(KERN_DEBUG "invalid cmsg_level %d\n", cmsg->cmsg_level);
continue;
}
switch (cmsg->cmsg_type) {
-
- case IPV6_TXINFO:
- if (cmsg->cmsg_len < (sizeof(struct cmsghdr) +
- sizeof(struct in6_pktinfo))) {
+ case IPV6_PKTINFO:
+ if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct in6_pktinfo))) {
err = -EINVAL;
goto exit_f;
}
- src_info = (struct in6_pktinfo *) cmsg->cmsg_data;
+ src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);
if (src_info->ipi6_ifindex) {
int index = src_info->ipi6_ifindex;
@@ -104,18 +102,13 @@
break;
case IPV6_RXSRCRT:
-
- len = cmsg->cmsg_len;
-
- len -= sizeof(struct cmsghdr);
-
- /* validate option length */
- if (len < sizeof(struct ipv6_rt_hdr)) {
+ if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
err = -EINVAL;
goto exit_f;
}
- rthdr = (struct ipv6_rt_hdr *) cmsg->cmsg_data;
+ len = cmsg->cmsg_len - sizeof(struct cmsghdr);
+ rthdr = (struct ipv6_rt_hdr *)CMSG_DATA(cmsg);
/*
* TYPE 0
@@ -142,21 +135,16 @@
break;
case IPV6_HOPLIMIT:
-
- len = cmsg->cmsg_len;
- len -= sizeof(struct cmsghdr);
-
- if (len < sizeof(int)) {
+ if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) {
err = -EINVAL;
goto exit_f;
}
- *hlimit = *((int *) cmsg->cmsg_data);
+ *hlimit = *(int *)CMSG_DATA(cmsg);
break;
default:
- printk(KERN_DEBUG "invalid cmsg type: %d\n",
- cmsg->cmsg_type);
+ printk(KERN_DEBUG "invalid cmsg type: %d\n", cmsg->cmsg_type);
err = -EINVAL;
break;
};
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov