diff options
| author | Qiuwen Lu <[email protected]> | 2017-10-25 16:20:18 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-10-25 16:20:18 +0800 |
| commit | 25737a54491685a4321fe0179430cc629e6602d5 (patch) | |
| tree | 679203cc7591454f7c94fc5b1b7f3d9524c27953 /app/src/marsio.c | |
| parent | 3ea066c014f5cd3a7073aa8df662b5a5ab230109 (diff) | |
增加免费ARP发送功能
- 原实现没有免费ARP发送功能,导致驱动重启后,网段内交换机(路由器?)找不到MAC地址对应的端口位置。现启动时先发送免费ARP,避免这一现象。
Diffstat (limited to 'app/src/marsio.c')
| -rw-r--r-- | app/src/marsio.c | 16 |
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; } |
