summaryrefslogtreecommitdiff
path: root/app/src/marsio.c
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-10-25 16:20:18 +0800
committerQiuwen Lu <[email protected]>2017-10-25 16:20:18 +0800
commit25737a54491685a4321fe0179430cc629e6602d5 (patch)
tree679203cc7591454f7c94fc5b1b7f3d9524c27953 /app/src/marsio.c
parent3ea066c014f5cd3a7073aa8df662b5a5ab230109 (diff)
增加免费ARP发送功能
- 原实现没有免费ARP发送功能,导致驱动重启后,网段内交换机(路由器?)找不到MAC地址对应的端口位置。现启动时先发送免费ARP,避免这一现象。
Diffstat (limited to 'app/src/marsio.c')
-rw-r--r--app/src/marsio.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/app/src/marsio.c b/app/src/marsio.c
index a72eee8..d4a1692 100644
--- a/app/src/marsio.c
+++ b/app/src/marsio.c
@@ -17,6 +17,7 @@
#include <signal.h>
#include <cJSON.h>
#include <libgen.h>
+#include <arp.h>
#define MR_LIB_MAX_EAL_ARGC 128
@@ -45,6 +46,10 @@ struct mr_instance * _current_instance = NULL;
#define MRAPP_DEFAULT_NEIGH_ARP_SEND_INTERVAL 1
#endif
+#ifndef MRAPP_DEFAULT_NEIGH_GRATUITOUS_ARP_SEND
+#define MRAPP_DEFAULT_NEIGH_GRATUITOUS_ARP_SEND 3
+#endif
+
/* 写入Command参数 */
static void __write_arg(char * eal_argv[], unsigned int * eal_argc,
unsigned int max_argc, const char * value)
@@ -356,7 +361,9 @@ static int mrapp_neigh_init(struct mr_instance * instance)
&neigh_timeout, MRAPP_DEFAULT_NEIGH_TABLE_TIMEOUT);
MESA_load_profile_uint_def(instance->g_cfgfile_path, "neigh", "arp_send_interval",
&arp_send_interval, MRAPP_DEFAULT_NEIGH_ARP_SEND_INTERVAL);
-
+ MESA_load_profile_uint_def(instance->g_cfgfile_path, "neigh", "gratuitous_arp_send",
+ &instance->nr_gratuitous_arp_send, MRAPP_DEFAULT_NEIGH_GRATUITOUS_ARP_SEND);
+
/* 邻居子系统初始化 */
if (neighbour_mamanger_init(instance->neigh, instance->appsym,
neigh_max_entries, neigh_timeout, arp_send_interval) != RT_SUCCESS)
@@ -468,6 +475,7 @@ err:
*/
static int mrapp_neigh_device_init(struct mr_instance * instance, struct mr_vdev * vdev)
{
+ /* 读静态邻居表项 */
struct mr_static_neigh_entry * __neigh_entry_iter;
TAILQ_FOREACH(__neigh_entry_iter, &instance->static_neigh_list, next)
{
@@ -491,6 +499,12 @@ static int mrapp_neigh_device_init(struct mr_instance * instance, struct mr_vdev
__neigh_entry_iter->str_ether_addr, __neigh_entry_iter->devsym);
}
+ /* 设备开启了发送队列后,发免费ARP报文 */
+ for (int i = 0; vdev->nr_txstream > 0 && i < instance->nr_gratuitous_arp_send; i++)
+ {
+ arp_request_send(vdev->vdi, 0, vdev->vdi->vdev->in_addr);
+ }
+
return RT_SUCCESS;
}