svn commit: trunk/busybox/networking/libiproute

vda at busybox.net vda at busybox.net
Sun Dec 2 06:30:57 UTC 2007


Author: vda
Date: 2007-12-01 22:30:57 -0800 (Sat, 01 Dec 2007)
New Revision: 20604

Log:
libnetlink: comment out unused code; don't use 8k stack buffers

function                                             old     new   delta
ipaddr_modify                                       1305    1297      -8
do_iprule                                            963     955      -8
do_iproute                                          2193    2169     -24
xrtnl_dump_filter                                    418     391     -27
rtnl_talk                                            671     536    -135
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/5 up/down: 0/-202)           Total: -202 bytes



Modified:
   trunk/busybox/networking/libiproute/libnetlink.c
   trunk/busybox/networking/libiproute/libnetlink.h


Changeset:
Modified: trunk/busybox/networking/libiproute/libnetlink.c
===================================================================
--- trunk/busybox/networking/libiproute/libnetlink.c	2007-12-02 05:36:37 UTC (rev 20603)
+++ trunk/busybox/networking/libiproute/libnetlink.c	2007-12-02 06:30:57 UTC (rev 20604)
@@ -108,9 +108,10 @@
 		int (*junk)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
 		void *arg2*/)
 {
-	char buf[8192];
+	int retval = -1;
+	char *buf = xmalloc(8*1024); /* avoid big stack buffer */
 	struct sockaddr_nl nladdr;
-	struct iovec iov = { buf, sizeof(buf) };
+	struct iovec iov = { buf, 8*1024 };
 
 	while (1) {
 		int status;
@@ -133,7 +134,7 @@
 		}
 		if (status == 0) {
 			bb_error_msg("EOF on netlink");
-			return -1;
+			goto ret;
 		}
 		if (msg.msg_namelen != sizeof(nladdr)) {
 			bb_error_msg_and_die("sender address length == %d", msg.msg_namelen);
@@ -146,16 +147,18 @@
 			if (nladdr.nl_pid != 0 ||
 			    h->nlmsg_pid != rth->local.nl_pid ||
 			    h->nlmsg_seq != rth->dump) {
-/*				if (junk) {
-					err = junk(&nladdr, h, arg2);
-					if (err < 0)
-						return err;
-				} */
+//				if (junk) {
+//					err = junk(&nladdr, h, arg2);
+//					if (err < 0) {
+//						retval = err;
+//						goto ret;
+//					}
+//				}
 				goto skip_it;
 			}
 
 			if (h->nlmsg_type == NLMSG_DONE) {
-				return 0;
+				goto ret_0;
 			}
 			if (h->nlmsg_type == NLMSG_ERROR) {
 				struct nlmsgerr *l_err = (struct nlmsgerr*)NLMSG_DATA(h);
@@ -165,13 +168,15 @@
 					errno = -l_err->error;
 					bb_perror_msg("RTNETLINK answers");
 				}
-				return -1;
+				goto ret;
 			}
 			err = filter(&nladdr, h, arg1);
-			if (err < 0)
-				return err;
+			if (err < 0) {
+				retval = err;
+				goto ret;
+			}
 
-skip_it:
+ skip_it:
 			h = NLMSG_NEXT(h, status);
 		}
 		if (msg.msg_flags & MSG_TRUNC) {
@@ -181,7 +186,12 @@
 		if (status) {
 			bb_error_msg_and_die("remnant of size %d!", status);
 		}
-	}
+	} /* while (1) */
+ ret_0:
+	retval++; /* = 0 */
+ ret:
+	free(buf);
+	return retval;
 }
 
 int xrtnl_dump_filter(struct rtnl_handle *rth,
@@ -194,17 +204,24 @@
 	return ret;
 }
 
-int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
-	      unsigned groups, struct nlmsghdr *answer,
-	      int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
+int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+	      pid_t peer, unsigned groups,
+	      struct nlmsghdr *answer,
+	      int (*junk)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
 	      void *jarg)
 {
+/* bbox doesn't use parameters no. 3, 4, 6, 7, they are stubbed out */
+#define peer   0
+#define groups 0
+#define junk   NULL
+#define jarg   NULL
+	int retval = -1;
 	int status;
 	unsigned seq;
 	struct nlmsghdr *h;
 	struct sockaddr_nl nladdr;
 	struct iovec iov = { (void*)n, n->nlmsg_len };
-	char   buf[8192];
+	char   *buf = xmalloc(8*1024); /* avoid big stack buffer */
 	struct msghdr msg = {
 		(void*)&nladdr, sizeof(nladdr),
 		&iov,	1,
@@ -214,8 +231,8 @@
 
 	memset(&nladdr, 0, sizeof(nladdr));
 	nladdr.nl_family = AF_NETLINK;
-	nladdr.nl_pid = peer;
-	nladdr.nl_groups = groups;
+//	nladdr.nl_pid = peer;
+//	nladdr.nl_groups = groups;
 
 	n->nlmsg_seq = seq = ++rtnl->seq;
 	if (answer == NULL) {
@@ -225,13 +242,13 @@
 
 	if (status < 0) {
 		bb_perror_msg("cannot talk to rtnetlink");
-		return -1;
+		goto ret;
 	}
 
 	iov.iov_base = buf;
 
 	while (1) {
-		iov.iov_len = sizeof(buf);
+		iov.iov_len = 8*1024;
 		status = recvmsg(rtnl->fd, &msg, 0);
 
 		if (status < 0) {
@@ -243,20 +260,20 @@
 		}
 		if (status == 0) {
 			bb_error_msg("EOF on netlink");
-			return -1;
+			goto ret;
 		}
 		if (msg.msg_namelen != sizeof(nladdr)) {
 			bb_error_msg_and_die("sender address length == %d", msg.msg_namelen);
 		}
 		for (h = (struct nlmsghdr*)buf; status >= sizeof(*h); ) {
-			int l_err;
+//			int l_err;
 			int len = h->nlmsg_len;
 			int l = len - sizeof(*h);
 
-			if (l<0 || len>status) {
+			if (l < 0 || len > status) {
 				if (msg.msg_flags & MSG_TRUNC) {
 					bb_error_msg("truncated message");
-					return -1;
+					goto ret;
 				}
 				bb_error_msg_and_die("malformed message: len=%d!", len);
 			}
@@ -264,12 +281,13 @@
 			if (nladdr.nl_pid != peer ||
 			    h->nlmsg_pid != rtnl->local.nl_pid ||
 			    h->nlmsg_seq != seq) {
-				if (junk) {
-					l_err = junk(&nladdr, h, jarg);
-					if (l_err < 0) {
-						return l_err;
-					}
-				}
+//				if (junk) {
+//					l_err = junk(&nladdr, h, jarg);
+//					if (l_err < 0) {
+//						retval = l_err;
+//						goto ret;
+//					}
+//				}
 				continue;
 			}
 
@@ -278,20 +296,20 @@
 				if (l < sizeof(struct nlmsgerr)) {
 					bb_error_msg("ERROR truncated");
 				} else {
-					errno = -err->error;
+					errno = - err->error;
 					if (errno == 0) {
 						if (answer) {
 							memcpy(answer, h, h->nlmsg_len);
 						}
-						return 0;
+						goto ret_0;
 					}
 					bb_perror_msg("RTNETLINK answers");
 				}
-				return -1;
+				goto ret;
 			}
 			if (answer) {
 				memcpy(answer, h, h->nlmsg_len);
-				return 0;
+				goto ret_0;
 			}
 
 			bb_error_msg("unexpected reply!");
@@ -306,7 +324,12 @@
 		if (status) {
 			bb_error_msg_and_die("remnant of size %d!", status);
 		}
-	}
+	} /* while (1) */
+ ret_0:
+	retval++; /* = 0 */
+ ret:
+	free(buf);
+	return retval;
 }
 
 int addattr32(struct nlmsghdr *n, int maxlen, int type, uint32_t data)

Modified: trunk/busybox/networking/libiproute/libnetlink.h
===================================================================
--- trunk/busybox/networking/libiproute/libnetlink.h	2007-12-02 05:36:37 UTC (rev 20603)
+++ trunk/busybox/networking/libiproute/libnetlink.h	2007-12-02 06:30:57 UTC (rev 20604)
@@ -24,10 +24,15 @@
 extern int xrtnl_dump_filter(struct rtnl_handle *rth,
 			int (*filter)(struct sockaddr_nl*, struct nlmsghdr *n, void*),
 			void *arg1);
+
+/* bbox doesn't use parameters no. 3, 4, 6, 7, stub them out */
+#define rtnl_talk(rtnl, n, peer, groups, answer, junk, jarg) \
+	rtnl_talk(rtnl, n, answer)
 extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
 			unsigned groups, struct nlmsghdr *answer,
 			int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
 			void *jarg);
+
 extern int rtnl_send(struct rtnl_handle *rth, char *buf, int);
 
 




More information about the busybox-cvs mailing list