packages: iputils/iputils.spec, iputils/iputils-pingsock.patch (NEW) - rel ...

arekm arekm at pld-linux.org
Fri Jul 22 09:01:18 CEST 2011


Author: arekm                        Date: Fri Jul 22 07:01:18 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- rel 2; icmp sockets support introduced in linux kernel 3.0

---- Files affected:
packages/iputils:
   iputils.spec (1.93 -> 1.94) , iputils-pingsock.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/iputils/iputils.spec
diff -u packages/iputils/iputils.spec:1.93 packages/iputils/iputils.spec:1.94
--- packages/iputils/iputils.spec:1.93	Thu Feb  3 18:13:54 2011
+++ packages/iputils/iputils.spec	Fri Jul 22 09:01:13 2011
@@ -9,7 +9,7 @@
 Summary(uk.UTF-8):	Набір базових мережевих утиліт (ping, tracepath etc.)
 Name:		iputils
 Version:	s20101006
-Release:	1
+Release:	2
 Epoch:		2
 License:	BSD
 Group:		Networking/Admin
@@ -19,6 +19,8 @@
 Patch1:		%{name}-pf.patch
 Patch2:		%{name}-bindnow.patch
 Patch3:		%{name}-build.patch
+# http://cvsweb.openwall.com/cgi/cvsweb.cgi/~checkout~/Owl/packages/iputils/iputils-s20101006-owl-pingsock.diff?rev=1.1;content-type=text%2Fplain
+Patch4:		%{name}-pingsock.patch
 URL:		http://www.linuxfoundation.org/collaborate/workgroups/networking/iputils
 %if %{with doc}
 BuildRequires:	docbook-dtd31-sgml
@@ -94,6 +96,7 @@
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
+%patch4 -p1
 
 %build
 # empty LDLIBS - don't link with -lresolv, it's not necessary
@@ -173,6 +176,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.94  2011/07/22 07:01:13  arekm
+- rel 2; icmp sockets support introduced in linux kernel 3.0
+
 Revision 1.93  2011/02/03 17:13:54  qboosh
 - updated URL
 - use __rm macro

================================================================
Index: packages/iputils/iputils-pingsock.patch
diff -u /dev/null packages/iputils/iputils-pingsock.patch:1.1
--- /dev/null	Fri Jul 22 09:01:18 2011
+++ packages/iputils/iputils-pingsock.patch	Fri Jul 22 09:01:13 2011
@@ -0,0 +1,224 @@
+diff -uNp -r iputils-s20101006.orig/ping.c iputils-s20101006/ping.c
+--- iputils-s20101006.orig/ping.c	2010-10-06 11:59:20 +0000
++++ iputils-s20101006/ping.c	2011-03-24 12:21:30 +0000
+@@ -88,6 +88,7 @@ struct sockaddr_in whereto;	/* who to pi
+ int optlen = 0;
+ int settos = 0;			/* Set TOS, Precendence or other QOS options */
+ int icmp_sock;			/* socket file descriptor */
++int using_ping_socket = 0;
+ u_char outpack[0x10000];
+ int maxpacket = sizeof(outpack);
+ 
+@@ -123,7 +124,11 @@ main(int argc, char **argv)
+ 	char *target, hnamebuf[MAX_HOSTNAMELEN];
+ 	char rspace[3 + 4 * NROUTES + 1];	/* record route space */
+ 
+-	icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
++	icmp_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
++	if (icmp_sock != -1)
++		using_ping_socket = 1;
++	else
++		icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
+ 	socket_errno = errno;
+ 
+ 	uid = getuid();
+@@ -377,13 +382,35 @@ main(int argc, char **argv)
+ 		}
+ 	}
+ 
+-	if ((options&F_STRICTSOURCE) &&
+-	    bind(icmp_sock, (struct sockaddr*)&source, sizeof(source)) == -1) {
+-		perror("bind");
+-		exit(2);
++	if (!using_ping_socket) {
++		if ((options&F_STRICTSOURCE) &&
++		    bind(icmp_sock, (struct sockaddr*)&source, sizeof(source)) == -1) {
++			perror("bind");
++			exit(2);
++		}
++	} else {
++		struct sockaddr_in sa;
++		socklen_t sl;
++
++		sa.sin_family = AF_INET;
++		sa.sin_port = 0;
++		sa.sin_addr.s_addr = (options&F_STRICTSOURCE) ?
++			source.sin_addr.s_addr : 0;
++		sl = sizeof(sa);
++
++		if (bind(icmp_sock, (struct sockaddr *) &sa, sl) == -1) {
++			perror("bind");
++			exit(2);
++		}
++
++		if (getsockname(icmp_sock, (struct sockaddr *) &sa, &sl) == -1) {
++			perror("getsockname");
++			exit(2);
++		}
++		ident = sa.sin_port;
+ 	}
+ 
+-	if (1) {
++	if (!using_ping_socket) {
+ 		struct icmp_filter filt;
+ 		filt.data = ~((1<<ICMP_SOURCE_QUENCH)|
+ 			      (1<<ICMP_DEST_UNREACH)|
+@@ -398,6 +425,12 @@ main(int argc, char **argv)
+ 	hold = 1;
+ 	if (setsockopt(icmp_sock, SOL_IP, IP_RECVERR, (char *)&hold, sizeof(hold)))
+ 		fprintf(stderr, "WARNING: your kernel is veeery old. No problems.\n");
++	if (using_ping_socket) {
++		if (setsockopt(icmp_sock, SOL_IP, IP_RECVTTL, (char *)&hold, sizeof(hold)))
++			perror("WARNING: setsockopt(IP_RECVTTL)");
++		if (setsockopt(icmp_sock, SOL_IP, IP_RETOPTS, (char *)&hold, sizeof(hold)))
++			perror("WARNING: setsockopt(IP_RETOPTS)");
++	}
+ 
+ 	/* record route option */
+ 	if (options & F_RROUTE) {
+@@ -566,6 +599,7 @@ int receive_error_msg()
+ 		nerrors++;
+ 	} else if (e->ee_origin == SO_EE_ORIGIN_ICMP) {
+ 		struct sockaddr_in *sin = (struct sockaddr_in*)(e+1);
++		int error_pkt;
+ 
+ 		if (res < sizeof(icmph) ||
+ 		    target.sin_addr.s_addr != whereto.sin_addr.s_addr ||
+@@ -576,9 +610,18 @@ int receive_error_msg()
+ 			goto out;
+ 		}
+ 
+-		acknowledge(ntohs(icmph.un.echo.sequence));
++		error_pkt = (e->ee_type != ICMP_REDIRECT &&
++			     e->ee_type != ICMP_SOURCE_QUENCH);
++		if (error_pkt) {
++			acknowledge(ntohs(icmph.un.echo.sequence));
++			net_errors++;
++			nerrors++;
++		}
++		else {
++			saved_errno = 0;
++		}
+ 
+-		if (!working_recverr) {
++		if (!using_ping_socket && !working_recverr) {
+ 			struct icmp_filter filt;
+ 			working_recverr = 1;
+ 			/* OK, it works. Add stronger filter. */
+@@ -589,15 +632,14 @@ int receive_error_msg()
+ 				perror("\rWARNING: setsockopt(ICMP_FILTER)");
+ 		}
+ 
+-		net_errors++;
+-		nerrors++;
+ 		if (options & F_QUIET)
+ 			goto out;
+ 		if (options & F_FLOOD) {
+-			write(STDOUT_FILENO, "\bE", 2);
++			if (error_pkt)
++				write(STDOUT_FILENO, "\bE", 2);
+ 		} else {
+ 			print_timestamp();
+-			printf("From %s icmp_seq=%u ", pr_addr(sin->sin_addr.s_addr), ntohs(icmph.un.echo.sequence));
++			printf("From %s: icmp_seq=%u ", pr_addr(sin->sin_addr.s_addr), ntohs(icmph.un.echo.sequence));
+ 			pr_icmph(e->ee_type, e->ee_code, e->ee_info, NULL);
+ 			fflush(stdout);
+ 		}
+@@ -695,15 +737,41 @@ parse_reply(struct msghdr *msg, int cc, 
+ 	struct iphdr *ip;
+ 	int hlen;
+ 	int csfailed;
++	struct cmsghdr *cmsg;
++	int ttl;
++	__u8 *opts;
++	int optlen;
+ 
+ 	/* Check the IP header */
+ 	ip = (struct iphdr *)buf;
+-	hlen = ip->ihl*4;
+-	if (cc < hlen + 8 || ip->ihl < 5) {
+-		if (options & F_VERBOSE)
+-			fprintf(stderr, "ping: packet too short (%d bytes) from %s\n", cc,
+-				pr_addr(from->sin_addr.s_addr));
+-		return 1;
++	if (!using_ping_socket) {
++		hlen = ip->ihl*4;
++		if (cc < hlen + 8 || ip->ihl < 5) {
++			if (options & F_VERBOSE)
++				fprintf(stderr, "ping: packet too short (%d bytes) from %s\n", cc,
++					pr_addr(from->sin_addr.s_addr));
++			return 1;
++		}
++		ttl = ip->ttl;
++		opts = buf + sizeof(struct iphdr);
++		optlen = hlen - sizeof(struct iphdr);
++	} else {
++		hlen = 0;
++		ttl = 0;
++		opts = buf;
++		optlen = 0;
++		for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
++			if (cmsg->cmsg_level != SOL_IP)
++				continue;
++			if (cmsg->cmsg_type == IP_TTL) {
++				if (cmsg->cmsg_len < sizeof(int))
++					continue;
++				ttl = *(int *) CMSG_DATA(cmsg);
++			} else if (cmsg->cmsg_type == IP_RETOPTS) {
++				opts = (__u8 *) CMSG_DATA(cmsg);
++				optlen = cmsg->cmsg_len;
++			}
++		}
+ 	}
+ 
+ 	/* Now the ICMP part */
+@@ -716,7 +784,7 @@ parse_reply(struct msghdr *msg, int cc, 
+ 			return 1;			/* 'Twas not our ECHO */
+ 		if (gather_statistics((__u8*)icp, sizeof(*icp), cc,
+ 				      ntohs(icp->un.echo.sequence),
+-				      ip->ttl, 0, tv, pr_addr(from->sin_addr.s_addr),
++				      ttl, 0, tv, pr_addr(from->sin_addr.s_addr),
+ 				      pr_echo_reply))
+ 			return 0;
+ 	} else {
+@@ -807,7 +875,7 @@ parse_reply(struct msghdr *msg, int cc, 
+ 	}
+ 
+ 	if (!(options & F_FLOOD)) {
+-		pr_options(buf + sizeof(struct iphdr), hlen);
++		pr_options(opts, optlen + sizeof(struct iphdr));
+ 
+ 		if (options & F_AUDIBLE)
+ 			putchar('\a');
+@@ -916,8 +984,7 @@ void pr_icmph(__u8 type, __u8 code, __u3
+ 			printf("Redirect, Bad Code: %d", code);
+ 			break;
+ 		}
+-		if (icp)
+-			printf("(New nexthop: %s)\n", pr_addr(icp->un.gateway));
++		printf("(New nexthop: %s)\n", pr_addr(icp ? icp->un.gateway : info));
+ 		if (icp && (options & F_VERBOSE))
+ 			pr_iph((struct iphdr*)(icp + 1));
+ 		break;
+@@ -1217,7 +1284,7 @@ void install_filter(void)
+ 		insns
+ 	};
+ 
+-	if (once)
++	if (once || using_ping_socket)
+ 		return;
+ 	once = 1;
+ 
+diff -uNp -r iputils-s20101006.orig/ping_common.c iputils-s20101006/ping_common.c
+--- iputils-s20101006.orig/ping_common.c	2010-10-06 11:59:20 +0000
++++ iputils-s20101006/ping_common.c	2011-03-24 12:22:20 +0000
+@@ -515,7 +515,8 @@ void setup(int icmp_sock)
+ 			*p++ = i;
+ 	}
+ 
+-	ident = htons(getpid() & 0xFFFF);
++	if (!ident)
++		ident = htons(getpid() & 0xFFFF);
+ 
+ 	set_signal(SIGINT, sigexit);
+ 	set_signal(SIGALRM, sigexit);
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/iputils/iputils.spec?r1=1.93&r2=1.94&f=u



More information about the pld-cvs-commit mailing list