Index: /branches/rel_apv_8_6_2/usr/click/bin/llb_ping/llb_ping.c
===================================================================
--- /branches/rel_apv_8_6_2/usr/click/bin/llb_ping/llb_ping.c	(revision 18012)
+++ /branches/rel_apv_8_6_2/usr/click/bin/llb_ping/llb_ping.c	(working copy)
@@ -99,10 +99,19 @@
 	struct in6_addr srcip6;
 	struct in_addr srcip;
 	char buf[INET6_ADDRSTRLEN];
+	int argc_ext;
+	char **argv_ext;
+	int i;
 
 #ifdef __LLB_TOOLS__
         print_arg(argc, argv);
 #endif
+
+	/* argv list example: llb_ping -c 5 -s 5 -g 192.168.13.1 8.8.8.8
+	*argv[6]:gateway(192.168.13.1)
+	*argv[7]:dst addr(8.8.8.8)
+	*/
+
 	if (strstr(argv[6], ":") != NULL){
 		isipv6 = 1;
 		ret = get_link_ip(argv[6], isipv6, &srcip6);
@@ -116,18 +125,33 @@
 		printf("Cann't get the source ip by input option gateway ip\n");
 		return -1;
 	}
-	
-	argv[5] = "-S";
-	argv[6] = buf;
-	
+
+	/*malloc a larger arg list for adding source address parameter*/
+	argc_ext = argc + 2;
+	argv_ext = (char**)malloc(sizeof(char*)*(argc_ext));
+	if (argv_ext == NULL) {
+	    printf("malloc argv_ext failed!\n");
+	    return (-1);
+	}
+
+	/*add source addr arg*/
+	for (i = 0; i < 5; i++) {
+	    argv_ext[i] = argv[i];
+	}
+	argv_ext[5] = "-S";
+	argv_ext[6] = buf;
+	for (i = 5; i < argc; i++) {
+	    argv_ext[i + 2] = argv[i];
+	}
+
 #ifdef __LLB_TOOLS__
-	print_arg(argc, argv);
+    print_arg(argc_ext, argv_ext);
 #endif
-	if (strstr(argv[6], ":") != NULL){
-		llb_ping6(argc, argv);
-	}else {
-		llb_ping4(argc, argv);
+	if (strstr(argv_ext[6], ":") != NULL) {
+	    llb_ping6(argc_ext, argv_ext);
+	} else {
+	    llb_ping4(argc_ext, argv_ext);
 	}
 
-
+    free(argv_ext);
 }
