IPACM: add static ARP entry

Add static ARP entry for USB clients.

Change-Id: I3546575625c2ed919d3f1e87fd57707cf03582e7
Signed-off-by: Shihuan Liu <chiaweic@codeaurora.org>
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 1727eaf..991e451 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -1796,6 +1796,8 @@
 	uint32_t tx_index;
 	int eth_index,v6_num;
 	const int NUM = 1;
+	char cmd[200] = {0};
+	uint32_t ipv4_addr;
 
 	if(tx_prop == NULL)
 	{
@@ -1873,6 +1875,17 @@
                 IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
 		  				 eth_index,
 		  				 get_client_memptr(eth_client, eth_index)->hdr_hdl_v4);
+
+				/* add static arp entry */
+				ipv4_addr = get_client_memptr(eth_client, eth_index)->v4_addr;
+				snprintf(cmd, sizeof(cmd), "ip neighbor change %d.%d.%d.%d lladdr %02x:%02x:%02x:%02x:%02x:%02x dev %s nud permanent",
+					(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
+					(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr,
+					mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5],
+					dev_name);
+				IPACMDBG_H("%s\n", cmd);
+				system(cmd);
+
 				strlcpy(rt_rule->rt_tbl_name,
 								IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
 								sizeof(rt_rule->rt_tbl_name));
@@ -2327,6 +2340,8 @@
 	uint32_t tx_index;
 	int num_eth_client_tmp = num_eth_client;
 	int num_v6;
+	char cmd[200] = {0};
+	uint32_t ipv4_addr;
 
 	IPACMDBG_H("total client: %d\n", num_eth_client_tmp);
 
@@ -2385,6 +2400,13 @@
 	get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false;
 	get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0;
 
+	ipv4_addr = get_client_memptr(eth_client, clt_indx)->v4_addr;
+	snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s",
+		(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
+		(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name);
+	system(cmd);
+	IPACMDBG_H("%s\n", cmd);
+
 	for (; clt_indx < num_eth_client_tmp - 1; clt_indx++)
 	{
 		memcpy(get_client_memptr(eth_client, clt_indx)->mac,
@@ -2450,6 +2472,8 @@
 {
 	int i;
 	int res = IPACM_SUCCESS;
+	char cmd[200] = {0};
+	uint32_t ipv4_addr;
 
 	IPACMDBG_H("lan handle_down_evt\n ");
 	if (ipa_if_cate == ODU_IF)
@@ -2640,6 +2664,13 @@
 	IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
 	for (i = 0; i < num_eth_client; i++)
 	{
+		ipv4_addr = get_client_memptr(eth_client, i)->v4_addr;
+		snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s",
+			(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
+			(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name);
+		system(cmd);
+		IPACMDBG_H("%s\n", cmd);
+
 		/* First reset nat rules and then route rules */
 		if(get_client_memptr(eth_client, i)->ipv4_set == true)
 		{