diff options
| author | 童宗振 <[email protected]> | 2023-12-29 04:09:08 +0000 |
|---|---|---|
| committer | 陆秋文 <[email protected]> | 2023-12-29 04:09:08 +0000 |
| commit | bf85d39733c93f00c9c3540156ced32c34dbf837 (patch) | |
| tree | 8dd72a7e87122a6d09b8284ec64ba5cf3b62322b /app/src | |
| parent | dda2a20a5fc0187f304994fd116711e40fec8493 (diff) | |
fix compile warning
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/arp.c | 268 | ||||
| -rw-r--r-- | app/src/marsio.c | 3 |
2 files changed, 141 insertions, 130 deletions
diff --git a/app/src/arp.c b/app/src/arp.c index 2d0085a..538bdca 100644 --- a/app/src/arp.c +++ b/app/src/arp.c @@ -1,146 +1,155 @@ /* \brief 简单协议栈ARP/RARP协议处理模块 -* -* 处理ARP/RARP协议报文数据 -* -* \author Lu Qiuwen<[email protected]> -* \date 2016-10-21 -*/ + * + * 处理ARP/RARP协议报文数据 + * + * \author Lu Qiuwen<[email protected]> + * \date 2016-10-21 + */ -#include <rte_malloc.h> -#include <rte_arp.h> -#include <rte_version.h> +#include <arp.h> #include <common.h> -#include <neigh.h> -#include <vdev_define.h> #include <mrapp.h> +#include <neigh.h> #include <netinet/in.h> -#include <arp.h> #include <protect.h> +#include <rte_arp.h> +#include <rte_malloc.h> +#include <rte_version.h> +#include <vdev_define.h> -static struct rte_ether_addr broadcast_hwaddr = { { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF } }; +static struct rte_ether_addr broadcast_hwaddr = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}; -static inline int __local_frame_filter(struct vdev * vdev, struct rte_ether_addr * ether_addr) +static inline int __local_frame_filter(const struct vdev * vdev, const struct rte_ether_addr * ether_addr) { - if (rte_is_broadcast_ether_addr(ether_addr)) return 1; - if (rte_is_same_ether_addr(&vdev->ether_addr, ether_addr)) return 1; + if (rte_is_broadcast_ether_addr(ether_addr)) + return 1; + if (rte_is_same_ether_addr(&vdev->ether_addr, ether_addr)) + return 1; return 0; } -static inline int __local_inaddr_filter(struct vdev * vdev, struct in_addr * in_addr) +static inline int __local_inaddr_filter(const struct vdev * vdev, const struct in_addr * in_addr) { return (vdev->in_addr.s_addr == in_addr->s_addr); } -static void arp_reply_entry(struct neighbour_manager * neigh_manager, - struct vdev_instance* vdi, queue_id_t qid, struct rte_mbuf * mbuf, struct rte_arp_hdr * arp_header) +static void arp_reply_entry(struct neighbour_manager * neigh_manager, struct vdev_instance * vdi, queue_id_t qid, + struct rte_mbuf * mbuf, struct rte_arp_hdr * arp_header) { - struct in_addr * s_in_addr = (struct in_addr *)&arp_header->arp_data.arp_sip; - struct in_addr * d_in_addr = (struct in_addr *)&arp_header->arp_data.arp_tip; - struct rte_ether_addr * s_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_sha; - struct rte_ether_addr * d_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_tha; - - // 检测目的IP地址、MAC地址是否是本机的 - if (!__local_frame_filter(vdi->vdev, d_eth_addr)) - goto invalid_frame; - if (!__local_inaddr_filter(vdi->vdev, d_in_addr)) - goto invalid_frame; - - // TODO: 错误处理 - neigh_create_or_update(neigh_manager, *s_in_addr, s_eth_addr, vdi, 0); + struct in_addr s_in_addr; + struct in_addr d_in_addr; + memcpy(&s_in_addr, &arp_header->arp_data.arp_sip, sizeof(struct in_addr)); + memcpy(&d_in_addr, &arp_header->arp_data.arp_tip, sizeof(struct in_addr)); + struct rte_ether_addr * s_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_sha; + struct rte_ether_addr * d_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_tha; + + // 检测目的IP地址、MAC地址是否是本机的 + if (!__local_frame_filter(vdi->vdev, d_eth_addr)) + goto invalid_frame; + if (!__local_inaddr_filter(vdi->vdev, &d_in_addr)) + goto invalid_frame; + + // TODO: 错误处理 + neigh_create_or_update(neigh_manager, s_in_addr, s_eth_addr, vdi, 0); invalid_frame: - return; + return; } -static void arp_request_entry(struct neighbour_manager * neigh_manager, struct vdev_instance * vdi, - queue_id_t qid, struct rte_mbuf * mbuf, struct rte_arp_hdr * arp_header) +static void arp_request_entry(struct neighbour_manager * neigh_manager, struct vdev_instance * vdi, queue_id_t qid, + struct rte_mbuf * mbuf, struct rte_arp_hdr * arp_header) { - struct in_addr * s_in_addr = (struct in_addr *)&arp_header->arp_data.arp_sip; - struct in_addr * d_in_addr = (struct in_addr *)&arp_header->arp_data.arp_tip; - struct rte_ether_addr * s_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_sha; - struct rte_ether_addr * d_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_tha; - - // 过滤非广播报文和非目的MAC是本机的报文 - if (!(rte_is_zero_ether_addr(d_eth_addr) || __local_frame_filter(vdi->vdev, d_eth_addr))) - goto done; - - // 根据广播的ARP报文,更新邻居表 - neigh_create_or_update(neigh_manager, *s_in_addr, s_eth_addr, vdi, 0); - - // 对请求是本机的,进行响应 - if (!__local_inaddr_filter(vdi->vdev, d_in_addr)) - goto done; - - struct rte_mbuf * reply_mbuf = PROTECT_rte_pktmbuf_alloc(vdi->direct_pool); - if (unlikely(reply_mbuf == NULL)) goto done; - - // 构造以太网头 - struct rte_ether_hdr * ether_hdr = (struct rte_ether_hdr *) PROTECT_rte_pktmbuf_append( - reply_mbuf, sizeof(struct rte_ether_hdr)); - -#if RTE_VERSION_NUM(21,11,0,0) <= RTE_VERSION + struct in_addr s_in_addr; + struct in_addr d_in_addr; + memcpy(&s_in_addr, &arp_header->arp_data.arp_sip, sizeof(struct in_addr)); + memcpy(&d_in_addr, &arp_header->arp_data.arp_tip, sizeof(struct in_addr)); + struct rte_ether_addr * s_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_sha; + struct rte_ether_addr * d_eth_addr = (struct rte_ether_addr *)&arp_header->arp_data.arp_tha; + + // 过滤非广播报文和非目的MAC是本机的报文 + if (!(rte_is_zero_ether_addr(d_eth_addr) || __local_frame_filter(vdi->vdev, d_eth_addr))) + goto done; + + // 根据广播的ARP报文,更新邻居表 + neigh_create_or_update(neigh_manager, s_in_addr, s_eth_addr, vdi, 0); + + // 对请求是本机的,进行响应 + if (!__local_inaddr_filter(vdi->vdev, &d_in_addr)) + goto done; + + struct rte_mbuf * reply_mbuf = PROTECT_rte_pktmbuf_alloc(vdi->direct_pool); + if (unlikely(reply_mbuf == NULL)) + goto done; + + // 构造以太网头 + struct rte_ether_hdr * ether_hdr = + (struct rte_ether_hdr *)PROTECT_rte_pktmbuf_append(reply_mbuf, sizeof(struct rte_ether_hdr)); + +#if RTE_VERSION_NUM(21, 11, 0, 0) <= RTE_VERSION rte_ether_addr_copy(&vdi->vdev->ether_addr, ðer_hdr->src_addr); rte_ether_addr_copy(&arp_header->arp_data.arp_sha, ðer_hdr->dst_addr); #else - rte_ether_addr_copy(&vdi->vdev->ether_addr, ðer_hdr->s_addr); - rte_ether_addr_copy(&arp_header->arp_data.arp_sha, ðer_hdr->d_addr); + rte_ether_addr_copy(&vdi->vdev->ether_addr, ðer_hdr->s_addr); + rte_ether_addr_copy(&arp_header->arp_data.arp_sha, ðer_hdr->d_addr); #endif - ether_hdr->ether_type = ntohs(RTE_ETHER_TYPE_ARP); + ether_hdr->ether_type = ntohs(RTE_ETHER_TYPE_ARP); - // 构造ARP应答 - struct rte_arp_hdr * reply_arp_hdr = (struct rte_arp_hdr *) PROTECT_rte_pktmbuf_append( - reply_mbuf, sizeof(struct rte_arp_hdr)); + // 构造ARP应答 + struct rte_arp_hdr * reply_arp_hdr = + (struct rte_arp_hdr *)PROTECT_rte_pktmbuf_append(reply_mbuf, sizeof(struct rte_arp_hdr)); - rte_memcpy(reply_arp_hdr, arp_header, sizeof(struct rte_arp_hdr)); - reply_arp_hdr->arp_opcode = ntohs(RTE_ARP_OP_REPLY); + rte_memcpy(reply_arp_hdr, arp_header, sizeof(struct rte_arp_hdr)); + reply_arp_hdr->arp_opcode = ntohs(RTE_ARP_OP_REPLY); #if RTE_VERSION_NUM(21, 11, 0, 0) <= RTE_VERSION rte_ether_addr_copy(ðer_hdr->src_addr, &reply_arp_hdr->arp_data.arp_sha); - rte_ether_addr_copy(ðer_hdr->dst_addr, &reply_arp_hdr->arp_data.arp_tha); + rte_ether_addr_copy(ðer_hdr->dst_addr, &reply_arp_hdr->arp_data.arp_tha); #else rte_ether_addr_copy(ðer_hdr->s_addr, &reply_arp_hdr->arp_data.arp_sha); - rte_ether_addr_copy(ðer_hdr->d_addr, &reply_arp_hdr->arp_data.arp_tha); + rte_ether_addr_copy(ðer_hdr->d_addr, &reply_arp_hdr->arp_data.arp_tha); #endif - reply_arp_hdr->arp_data.arp_sip = vdi->vdev->in_addr.s_addr; - reply_arp_hdr->arp_data.arp_tip = s_in_addr->s_addr; - - // 写应答包到线路 - mrapp_packet_fast_send_burst(vdi, qid, &reply_mbuf, 1); + reply_arp_hdr->arp_data.arp_sip = vdi->vdev->in_addr.s_addr; + reply_arp_hdr->arp_data.arp_tip = s_in_addr.s_addr; + + // 写应答包到线路 + mrapp_packet_fast_send_burst(vdi, qid, &reply_mbuf, 1); done: - return; + return; } -int arp_entry(struct mr_instance * instance, struct vdev_instance* vdi, queue_id_t qid, - struct rte_mbuf* mbufs_in[], int nr_mbufs_in) +int arp_entry(struct mr_instance * instance, struct vdev_instance * vdi, queue_id_t qid, struct rte_mbuf * mbufs_in[], + int nr_mbufs_in) { - int handled_packets = 0; + int handled_packets = 0; + + for (int i = 0; i < nr_mbufs_in; i++) + { + struct rte_mbuf * mbuf = mbufs_in[i]; + if (unlikely(mbuf == NULL)) + continue; - for (int i = 0; i < nr_mbufs_in; i++) - { - struct rte_mbuf * mbuf = mbufs_in[i]; - if (unlikely(mbuf == NULL)) continue; + struct rte_ether_hdr * eth_hdr = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *); + if (eth_hdr->ether_type != ntohs(RTE_ETHER_TYPE_ARP)) + continue; - struct rte_ether_hdr * eth_hdr = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *); - if (eth_hdr->ether_type != ntohs(RTE_ETHER_TYPE_ARP)) continue; - - struct rte_arp_hdr * arp_hdr = rte_pktmbuf_mtod_offset( - mbuf, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr)); + struct rte_arp_hdr * arp_hdr = + rte_pktmbuf_mtod_offset(mbuf, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr)); - if (arp_hdr->arp_opcode == ntohs(RTE_ARP_OP_REQUEST)) - arp_request_entry(instance->neigh, vdi, qid, mbuf, arp_hdr); - else if (arp_hdr->arp_opcode == ntohs(RTE_ARP_OP_REPLY)) - arp_reply_entry(instance->neigh, vdi, qid, mbuf, arp_hdr); + if (arp_hdr->arp_opcode == ntohs(RTE_ARP_OP_REQUEST)) + arp_request_entry(instance->neigh, vdi, qid, mbuf, arp_hdr); + else if (arp_hdr->arp_opcode == ntohs(RTE_ARP_OP_REPLY)) + arp_reply_entry(instance->neigh, vdi, qid, mbuf, arp_hdr); - handled_packets++; - } + handled_packets++; + } - return handled_packets; + return handled_packets; } -int arp_request_send(struct vdev_instance* vdi, queue_id_t qid, struct in_addr in_addr) +int arp_request_send(struct vdev_instance * vdi, queue_id_t qid, struct in_addr in_addr) { - struct vdev * dev_info = vdi->vdev; + struct vdev * dev_info = vdi->vdev; if (unlikely(dev_info->enable == 0)) { MR_DEBUG("Send ARP request on disable device %s, failed.", dev_info->symbol); @@ -153,42 +162,43 @@ int arp_request_send(struct vdev_instance* vdi, queue_id_t qid, struct in_addr i return -EINVAL; } - struct rte_ether_addr * src_hwaddr = &dev_info->ether_addr; - struct rte_ether_addr * dst_hwaddr = &broadcast_hwaddr; + struct rte_ether_addr * src_hwaddr = &dev_info->ether_addr; + struct rte_ether_addr * dst_hwaddr = &broadcast_hwaddr; - struct in_addr in_addr_src = dev_info->in_addr; - struct rte_mbuf * req_mbuf = PROTECT_rte_pktmbuf_alloc(vdi->direct_pool); - if (unlikely(req_mbuf == NULL)) return -ENOBUFS; + struct in_addr in_addr_src = dev_info->in_addr; + struct rte_mbuf * req_mbuf = PROTECT_rte_pktmbuf_alloc(vdi->direct_pool); + if (unlikely(req_mbuf == NULL)) + return -ENOBUFS; - // 构造以太网头 - struct rte_ether_hdr * ether_hdr = (struct rte_ether_hdr *) PROTECT_rte_pktmbuf_append( - req_mbuf, sizeof(struct rte_ether_hdr)); + // 构造以太网头 + struct rte_ether_hdr * ether_hdr = + (struct rte_ether_hdr *)PROTECT_rte_pktmbuf_append(req_mbuf, sizeof(struct rte_ether_hdr)); -#if RTE_VERSION_NUM(21,11,0,0) <= RTE_VERSION - rte_ether_addr_copy(src_hwaddr, ðer_hdr->src_addr); - rte_ether_addr_copy(dst_hwaddr, ðer_hdr->dst_addr); +#if RTE_VERSION_NUM(21, 11, 0, 0) <= RTE_VERSION + rte_ether_addr_copy(src_hwaddr, ðer_hdr->src_addr); + rte_ether_addr_copy(dst_hwaddr, ðer_hdr->dst_addr); #else - rte_ether_addr_copy(src_hwaddr, ðer_hdr->s_addr); - rte_ether_addr_copy(dst_hwaddr, ðer_hdr->d_addr); + rte_ether_addr_copy(src_hwaddr, ðer_hdr->s_addr); + rte_ether_addr_copy(dst_hwaddr, ðer_hdr->d_addr); #endif - ether_hdr->ether_type = htons(RTE_ETHER_TYPE_ARP); - - // 构造ARP请求报文 - struct rte_arp_hdr * arp_hdr = (struct rte_arp_hdr *) PROTECT_rte_pktmbuf_append( - req_mbuf, sizeof(struct rte_arp_hdr)); - - arp_hdr->arp_hardware = htons(RTE_ARP_HRD_ETHER); - arp_hdr->arp_protocol = htons(RTE_ETHER_TYPE_IPV4); - arp_hdr->arp_hlen = 6; - arp_hdr->arp_plen = 4; - arp_hdr->arp_opcode = htons(RTE_ARP_OP_REQUEST); - arp_hdr->arp_data.arp_sip = in_addr_src.s_addr; - arp_hdr->arp_data.arp_tip = in_addr.s_addr; - - rte_ether_addr_copy(src_hwaddr, &arp_hdr->arp_data.arp_sha); - memset(&arp_hdr->arp_data.arp_tha, 0, sizeof(arp_hdr->arp_data.arp_tha)); - - // 写数据包到线路 - mrapp_packet_fast_send_burst(vdi, qid, &req_mbuf, 1); - return 0; + ether_hdr->ether_type = htons(RTE_ETHER_TYPE_ARP); + + // 构造ARP请求报文 + struct rte_arp_hdr * arp_hdr = + (struct rte_arp_hdr *)PROTECT_rte_pktmbuf_append(req_mbuf, sizeof(struct rte_arp_hdr)); + + arp_hdr->arp_hardware = htons(RTE_ARP_HRD_ETHER); + arp_hdr->arp_protocol = htons(RTE_ETHER_TYPE_IPV4); + arp_hdr->arp_hlen = 6; + arp_hdr->arp_plen = 4; + arp_hdr->arp_opcode = htons(RTE_ARP_OP_REQUEST); + arp_hdr->arp_data.arp_sip = in_addr_src.s_addr; + arp_hdr->arp_data.arp_tip = in_addr.s_addr; + + rte_ether_addr_copy(src_hwaddr, &arp_hdr->arp_data.arp_sha); + memset(&arp_hdr->arp_data.arp_tha, 0, sizeof(arp_hdr->arp_data.arp_tha)); + + // 写数据包到线路 + mrapp_packet_fast_send_burst(vdi, qid, &req_mbuf, 1); + return 0; }
\ No newline at end of file diff --git a/app/src/marsio.c b/app/src/marsio.c index a9dd2da..16de860 100644 --- a/app/src/marsio.c +++ b/app/src/marsio.c @@ -305,6 +305,7 @@ int send_register_request(struct app_register_req * reg_req) }; uintptr_t ptr_address = (uintptr_t)reg_req; + struct app_register_resp * rep_msg = NULL; struct rte_mp_msg reg_msg = {}; strncpy(reg_msg.name, "instance_alive_register", sizeof(reg_msg.name) - 1); @@ -321,7 +322,7 @@ int send_register_request(struct app_register_req * reg_req) uintptr_t stored_ptr_address; memcpy(&stored_ptr_address, mp_reply.msgs->param, sizeof(uintptr_t)); - struct app_register_resp * rep_msg = (struct app_register_resp *)stored_ptr_address; + rep_msg = (struct app_register_resp *)stored_ptr_address; // 应用注册失败,退出。 if (rep_msg->errcode != 0) |
