From 5f7578f88b52e648d09f5290ff5884144b4b3c44 Mon Sep 17 00:00:00 2001 From: jiangheng Date: Tue, 4 Jul 2023 19:58:05 +0800 Subject: [PATCH] update version to 1.0.2 (cherry picked from commit c21ad92f973ef093c536294bb9be79de97370fa4) --- 0001-fix-compile-error-unuse-result.patch | 28 - 0002-reduce-copy-in-send.patch | 482 -- ...-gazelle_init_sock-before-read-event.patch | 27 - ...should-use-recvmsg_from_stack-sendms.patch | 193 - 0005-fix-LD_PRELOAD.patch | 31 - ...ce-replenish-send_idle_ring-rpc-call.patch | 65 - ...should-be-executed-before-parse_dpdk.patch | 50 - 0008-fix-gazellectl-l-option-error.patch | 56 - 0009-bind-cpu-fail-just-walrm.patch | 24 - 0010-mfix-close-not-release-sock.patch | 38 - 0011-fix-evetns-err.patch | 66 - 0012-fix-dfx-info-show.patch | 56 - 0013-balance-acept.patch | 49 - 0014-fix-miss-evetn.patch | 248 - 0015-fix-too-much-evetns.patch | 204 - 0016-fix-dead-loop.patch | 24 - 0017-remove-unuse-event.patch | 110 - 0018-fix-gazellectl-show.patch | 45 - 0019-fix-repeate-msg.patch | 423 -- 0020-fix-wakeup-typos.patch | 103 - 0021-fix-pasre-numacpulist.patch | 50 - 0022-fix-get-data-error.patch | 267 - 0023-delete-numa-bind-param.patch | 197 - 0024-refactor-event.patch | 806 --- 0025-fix-event-miss.patch | 420 -- 0026-get-fin-notice-app.patch | 45 - 0027-fix-parse-config.patch | 832 ---- 0028-fix-lstack-show-latency.patch | 60 - 0029-fix-code-check.patch | 217 - 0030-fix-accept-init-sock-faile.patch | 120 - ...x-reuse-ip-listen-event-don-t-notice.patch | 153 - 0032-modify-readme-to-add-constraint.patch | 24 - 0033-fix-accept-check-remain-conn.patch | 75 - 0034-fix-wakeup-list-dead-loop.patch | 59 - 0035-add-check-for-stack-params.patch | 27 - ...ock-last-data-is-triggered-by-lstack.patch | 50 - 0037-add-gazellectl-lstack-constraint.patch | 25 - 0038-refactor-event.patch | 3098 ------------ 0039-update-license-lockless-queue.patch | 91 - 0040-fix-sock-invalid-address.patch | 35 - ...-process-after-ltran-instance-logout.patch | 70 - 0042-use-atomic-variales-to-count.patch | 78 - ...rogram-to-invoke-rte_eth_dev_start-b.patch | 45 - 0044-delete-redundant-file.patch | 183 - 0045-lstack-all-exit-move-to-init.patch | 297 -- 0046-clean-code-fix-huge-func.patch | 356 -- 0047-add-kernel-path-in-epoll-funcs.patch | 58 - 0048-refactor-kernel-event-poll-epoll.patch | 836 ---- ...e1-sem-to-avoid-block-main-thread-wh.patch | 39 - ...r-of-RX-TX-mbufs-of-each-stack-threa.patch | 46 - 0051-modify-README.patch | 365 -- ...ee.com-src-openeuler-gazelle-issues-.patch | 40 - 0053-update-README.md.patch | 332 -- 0054-ltran-fix-use-after-free-issue.patch | 28 - 0055-refactor-pkt-read-send-performance.patch | 3232 ------------ 0056-ltran-support-checksum.patch | 351 -- ...dme-compile-components-main-file-and.patch | 287 -- 0058-add-examples-parameter-parsing.patch | 550 --- ...fix-reta_conf-array-size-calculation.patch | 58 - 0060-Replace-gettid-with-rte_gettid.patch | 39 - ...for-canonical-and-update-the-cmake-b.patch | 190 - ...-secure-compile-and-open-compile-log.patch | 46 - 0063-support-epoll-et-trig-mode.patch | 27 - 0064-lstack-support-low-power.patch | 169 - 0065-add-port-mask-range-check.patch | 39 - 0066-release-kni-device.patch | 125 - 0067-optimize-check-ltran-exist.patch | 167 - 0068-clean-code.patch | 4389 ----------------- 0069-clean-code.patch | 1163 ----- 0070-Support-build-gazelle-with-clang.patch | 155 - 0071-Allow-dynamic-load-PMDs.patch | 76 - 0072-support-epoll-oneshot.patch | 56 - 0073-modify-readme-and-clean-code.patch | 25 - ...ltran-support-muti-proc-with-same-ip.patch | 835 ---- 0075-fix-rpc-msg-out-of-bound.patch | 39 - ...fix-traversal-array-use-NULL-pointer.patch | 27 - ...-stack-thread-don-t-repeate-send-msg.patch | 138 - 0078-fix-memcpy-out-bounds.patch | 26 - 0079-fix-miss-send-rpc-msg-err.patch | 62 - ...-exit-due-to-lack-of-mem-startup-fai.patch | 37 - 0081-read-data-with-err-event.patch | 25 - ...azelle-ring-cons.tail-atomic-protect.patch | 44 - 0083-fix-send-return-vale.patch | 40 - 0084-add-examples.patch | 2668 ---------- 0085-expand-thread-rpc-msg-pool-size.patch | 25 - 0086-fix-fd-leak.patch | 80 - 0087-fix-del-conn-use-after-free.patch | 29 - 0088-init-g_gazelle_errno-before-use.patch | 24 - 0089-code-format-specification.patch | 39 - ...el-event-thread-affinity-same-with-s.patch | 48 - 0091-have_corelist_arg.patch | 77 - 0092-ltran-update-list.patch | 48 - 0093-remove-get_reg_ring_free_count.patch | 37 - 0094-add-errorno-EISCONN.patch | 25 - 0095-fix-sendmsg-data-write-wrong.patch | 29 - 0096-lstack-restore-pci-bus-after-init.patch | 69 - 0097-fix-malloc-rpc-msg-fail.patch | 133 - 0098-support-dpdk-dynamic-memory.patch | 64 - ...x-lwip_send-fail-free-pbuf-miss-data.patch | 87 - 0100-merger-wakeup.patch | 984 ---- 0101-conenct-support-multi-queues.patch | 113 - 0102-merge-sendmsg-write.patch | 275 -- 0103-add-thread-select-path.patch | 160 - 0104-support-conf-control-app-bind-numa.patch | 99 - 0105-fix-epoll_wait-cover-kernel-event.patch | 130 - ...ead-stack-data-return-0-when-no-data.patch | 45 - 0107-fix-stack-wakeup-node-del.patch | 79 - ...oid-useless-stack-check-wakeup-event.patch | 60 - 0109-fix-mesg-loss.patch | 32 - 0110-add-accept4-and-epoll_create1.patch | 232 - 0111-refactor-event-notice.patch | 1243 ----- 0112-add-writev-and-readv.patch | 96 - 0113-optimized-some-function-in-lstack.patch | 150 - ...lectl-stats-err-when-donot-bind-numa.patch | 47 - 0115-add-usleep-when-write_ring-is-busy.patch | 45 - 0116-optimize-variable-access.patch | 432 -- 0117-add-gro.patch | 133 - 0118-expand-nic-rx-desc-size.patch | 25 - 0119-add-kni-local-support-in-lstack.patch | 85 - ...lict-between-the-eth_dev_ops-variabl.patch | 174 - 0121-add-pdump-support-in-lstack.patch | 76 - ...nit-stack-port_id-when-use-mutil-NIC.patch | 46 - ...ak-in-dpdk_ethdev_init-unlikely-path.patch | 25 - ...-epoll_wait-return-when-timeout-is-0.patch | 38 - ...elle-pdump-init-fail-with-dpdk-21.11.patch | 46 - 0126-fix-add-outdated-event.patch | 32 - 0127-revert-write-usleep.patch | 27 - 0128-reduce-thread-variable-access.patch | 83 - 0129-add-readv-and-readv-kernel.patch | 38 - 0130-add-unlock-before-after.patch | 30 - 0131-add-mutil-NIC-support-in-gazelle.patch | 432 -- ...check-in-gazellectl-to-fix-build-err.patch | 27 - ...ock-epoll-ctl-when-lwip-sock-connect.patch | 27 - ...y-readv-and-writev-first-buf-is-null.patch | 66 - 0135-fix-pdump-and-mutil-NIC-init-fail.patch | 57 - 0136-modify-duplicate-code.patch | 36 - 0137-merge-lstack-rx-tx-mbuf-pool.patch | 141 - ...avoid-send-stop-when-mbuf-pool-empty.patch | 142 - 0139-fix-pcb-snd_buf-flip.patch | 28 - ...fix-lwip-send-return-0-add-err-event.patch | 30 - ...ta-flow-error-when-use-NIC-in-kernel.patch | 44 - 0142-fix-write-event-error.patch | 51 - 0143-add-malloc-init-zero.patch | 95 - 0144-modify-event-error.patch | 28 - 0145-add-unix_prefix-in-gazellectl.patch | 69 - 0146-fix-epoll_wait-report-event0.patch | 75 - 0147-add-TSO.patch | 268 - ...optimize-app-thread-write-buff-block.patch | 1001 ---- 0149-expand-rxtx-mbuf-pool.patch | 25 - 0150-add-pdump-support-in-ltran.patch | 25 - 0151-dfx-gazellectl-add-pcb-wins-info.patch | 222 - 0152-fix-genarate-out-event-untimely.patch | 73 - 0153-rxtx-mbuf-pool-size-config-by-conf.patch | 126 - ...kernel-event-thread-bind-numa-failed.patch | 134 - 0155-stack-thread-parms-config-by-conf.patch | 375 -- ...n-rxtx-mbuf-pool-size-config-by-conf.patch | 169 - ...ect_thread_path-after-posix_api_init.patch | 43 - ..._MAX-to-limit-mbuf_pool_size-to-its-.patch | 40 - 0159-stack-thread-params-default-val.patch | 195 - 0160-optimite-net-type.patch | 72 - ...app-bind-numa-when-epoll-poll-create.patch | 36 - 0162-remove-mbuf-reserve-in-mbuf-alloc.patch | 94 - 0163-pkts-bulk-send-to-nic.patch | 123 - 0164-rpc-dont-send.patch | 64 - 0165-recv-pbuf-free-timely.patch | 27 - 0166-optimite-send-pkts-dul-index.patch | 165 - 0167-expand-data-recv-buff.patch | 357 -- 0168-dfx-add-mempool-count-info.patch | 151 - 0169--write-support-without-epoll-poll.patch | 82 - 0170-add-rcv-nxt-dfx-info.patch | 95 - ...f-private-data-size-align-cache-line.patch | 44 - 0172-fix-send-pkts-bluk-err.patch | 59 - 0173-free-recv-pkts-bluks.patch | 94 - 0174-fix-lstack-Makefile-warning.patch | 31 - ...inter-deref-in-stack_broadcast_close.patch | 25 - 0176-pbuf-align-cache-line.patch | 141 - 0177-support-set-main-thread-affinity.patch | 155 - 0178-reduce-epoll-wakeup.patch | 147 - 0179-revert-expand-recv-data-buff.patch | 249 - ...on-of-using-the-u-parameter-when-the.patch | 33 - ...ent_thread-creation-after-control_in.patch | 33 - ...n-pthread_create-and-fix-example-bug.patch | 65 - ...ge-when-wait-for-connecting-to-ltran.patch | 24 - 0184-add-gazelle-fuzz.patch | 544 -- 0185-add-unitest.patch | 1962 -------- 0186-add-gazelle-setup-tools.patch | 1277 ----- ...t-readv-writev-epoll_create1-accept4.patch | 448 -- 0188-add-fucntest.patch | 1359 ----- ...-coredump-in-example-server-mum-mode.patch | 26 - 0190-bring-up-kni-when-init.patch | 145 - ..._size-in-lstack.conf-to-tcp_conn_cou.patch | 145 - 0192-fix-build-error-in-lstack.patch | 30 - ...nd-fix-wakeup_list-when-null-appears.patch | 34 - ...le-TSO-and-fix-TSO-mbuf-pktlen-error.patch | 92 - 0195-adapt-unsupport-sock-optname.patch | 61 - ...educe-duplicate-code-in-lstack_cfg.c.patch | 295 -- 0197-fix-private-data-offset-error.patch | 53 - 0198-fix-do_close-core-dump.patch | 25 - 0199-remove-rxtx-driver-cache.patch | 195 - 0200-send-ring-size-is-configure.patch | 150 - ...return-1-errno-EAGAIN-when-ring-full.patch | 47 - ...ull-whether-dynamic-alloc-mbuf-is-co.patch | 190 - 0203-add-pbuf-lock-when-aggregate-pbuf.patch | 563 --- 0204-supprot-multi-process.patch | 2008 -------- 0205-add-gazellectl-x-to-show-nic-stats.patch | 457 -- ...-ring-for-inter-proces-communication.patch | 590 --- ...by-peer-when-not-sleep-after-connect.patch | 404 -- ...-in-conf-to-diff-rss-rule-and-tuple-.patch | 299 -- 0210-disable-tso-without-ipv4-checksum.patch | 40 - 0210-support-tuple-rule-add-delete.patch | 190 - 0211-refactor-mbuf-private-data.patch | 220 - ...-fix-kernel-scoket-select-path-error.patch | 27 - 0213-discard-wakeup_num-parameter.patch | 299 -- 0214-fix-parse-args-error.patch | 207 - 0215-gazelle-send-recv-thread-bind-numa.patch | 65 - ...en-primary-process-not-start-already.patch | 137 - ...tring_to-array-add-error-args-handle.patch | 243 - ...-broadcast-arp-pkts-to-other-process.patch | 25 - ...read_path-and-optimize-app-thread-wh.patch | 204 - ...process-idx-and-secondary-lstack-num.patch | 471 -- 0221-optimite-select_path-and-pbuf_take.patch | 322 -- 0222-fix-build-err-on-select_path.patch | 25 - ...switch-valid-only-in-primary-process.patch | 27 - 0224-optimize-do_close.patch | 36 - 0225-add-socket-check-before-write-it.patch | 46 - 0226-update-lstack.Makefile.patch | 30 - 0227-fix-config-flow-rule-race.patch | 121 - 0228-fix-build-err-with-dpdk-21.11.patch | 25 - ...-error-when-multiplt-user-nic-config.patch | 68 - ...t-connect-number-unbalance-on-lstack.patch | 93 - 0231-kni-down-not-stop-nic.patch | 218 - 0232-fix-rpc-msg-alloc-failed.patch | 79 - 0233-add-parentheses-to-fix-build-error.patch | 27 - 0234-fix-bond_ports-parse-error.patch | 446 -- ...d-to-1-after-abnormal-close-fd-to-av.patch | 60 - ...unction-failed-return-error-directly.patch | 63 - 0237-add-bond4-suport.patch | 277 -- 0238-clean-code.patch | 2187 -------- ...add-udp-multicast-support-in-gazelle.patch | 518 -- 0240-modify-huge-dir-dir-name.patch | 92 - ...n-read_lwip_data-to-fix-mem-overflow.patch | 61 - ...-bind-numa-only-app_bind_numa-set-to.patch | 28 - 0243-fix-change-low-power-mod-invalid.patch | 33 - ...ion-handling-for-is_dst_ip_localhost.patch | 58 - ...lock-before-lstack-registration-is-c.patch | 27 - 0246-fix-udp-send-recv-in-muliple-queue.patch | 218 - ...sock-when-select-path-is-PATH_UNKNOW.patch | 60 - ...-pool-use-dpdk-mempool-replace-array.patch | 133 - ...se-after-free-in-kernel-event-thread.patch | 97 - 0250-adapt-to-dpdk-19.11-and-dpdk-21.11.patch | 241 - ...nge-send_ring_size-32-in-lstack-conf.patch | 25 - ...in-cfg-to-distinguish-whether-to-use.patch | 115 - ...multicast-enable-in-dpdk_ethdev_init.patch | 25 - ...null-pointer-of-sock-in-udp_recvfrom.patch | 45 - ...hen-tcp-ip-checksum-offloads-disable.patch | 28 - 0256-lstack-cfg-add-app_exclude_cpus.patch | 128 - 0257-enable-UDP-CKSUM-in-gazelle.patch | 64 - ...-fix-core-dump-when-slave-mac-failed.patch | 93 - ...ue-of-hugepage_init-to-avoid-coredum.patch | 29 - ...d-udp_enable-to-turn-off-udp-in-need.patch | 72 - 0261-fix-bond4-EPOLLOUT-event-error.patch | 63 - 0262-bond4-add-dpdk-return-value-check.patch | 50 - gazelle-1.0.1.tar.gz | Bin 132402 -> 0 bytes gazelle-1.0.2.tar.gz | Bin 0 -> 1060611 bytes gazelle.spec | 270 +- 265 files changed, 5 insertions(+), 59380 deletions(-) delete mode 100644 0001-fix-compile-error-unuse-result.patch delete mode 100644 0002-reduce-copy-in-send.patch delete mode 100644 0003-execute-gazelle_init_sock-before-read-event.patch delete mode 100644 0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch delete mode 100644 0005-fix-LD_PRELOAD.patch delete mode 100644 0006-reduce-replenish-send_idle_ring-rpc-call.patch delete mode 100644 0007-parse_host_addr-should-be-executed-before-parse_dpdk.patch delete mode 100644 0008-fix-gazellectl-l-option-error.patch delete mode 100644 0009-bind-cpu-fail-just-walrm.patch delete mode 100644 0010-mfix-close-not-release-sock.patch delete mode 100644 0011-fix-evetns-err.patch delete mode 100644 0012-fix-dfx-info-show.patch delete mode 100644 0013-balance-acept.patch delete mode 100644 0014-fix-miss-evetn.patch delete mode 100644 0015-fix-too-much-evetns.patch delete mode 100644 0016-fix-dead-loop.patch delete mode 100644 0017-remove-unuse-event.patch delete mode 100644 0018-fix-gazellectl-show.patch delete mode 100644 0019-fix-repeate-msg.patch delete mode 100644 0020-fix-wakeup-typos.patch delete mode 100644 0021-fix-pasre-numacpulist.patch delete mode 100644 0022-fix-get-data-error.patch delete mode 100644 0023-delete-numa-bind-param.patch delete mode 100644 0024-refactor-event.patch delete mode 100644 0025-fix-event-miss.patch delete mode 100644 0026-get-fin-notice-app.patch delete mode 100644 0027-fix-parse-config.patch delete mode 100644 0028-fix-lstack-show-latency.patch delete mode 100644 0029-fix-code-check.patch delete mode 100644 0030-fix-accept-init-sock-faile.patch delete mode 100644 0031-fix-reuse-ip-listen-event-don-t-notice.patch delete mode 100644 0032-modify-readme-to-add-constraint.patch delete mode 100644 0033-fix-accept-check-remain-conn.patch delete mode 100644 0034-fix-wakeup-list-dead-loop.patch delete mode 100644 0035-add-check-for-stack-params.patch delete mode 100644 0036-the-sending-of-sock-last-data-is-triggered-by-lstack.patch delete mode 100644 0037-add-gazellectl-lstack-constraint.patch delete mode 100644 0038-refactor-event.patch delete mode 100644 0039-update-license-lockless-queue.patch delete mode 100644 0040-fix-sock-invalid-address.patch delete mode 100644 0041-exit-lstack-process-after-ltran-instance-logout.patch delete mode 100644 0042-use-atomic-variales-to-count.patch delete mode 100644 0043-re-arrange-the-program-to-invoke-rte_eth_dev_start-b.patch delete mode 100644 0044-delete-redundant-file.patch delete mode 100644 0045-lstack-all-exit-move-to-init.patch delete mode 100644 0046-clean-code-fix-huge-func.patch delete mode 100644 0047-add-kernel-path-in-epoll-funcs.patch delete mode 100644 0048-refactor-kernel-event-poll-epoll.patch delete mode 100644 0049-post-thread_phase1-sem-to-avoid-block-main-thread-wh.patch delete mode 100644 0050-adjust-the-number-of-RX-TX-mbufs-of-each-stack-threa.patch delete mode 100644 0051-modify-README.patch delete mode 100644 0052-bugfix-https-gitee.com-src-openeuler-gazelle-issues-.patch delete mode 100644 0053-update-README.md.patch delete mode 100644 0054-ltran-fix-use-after-free-issue.patch delete mode 100644 0055-refactor-pkt-read-send-performance.patch delete mode 100644 0056-ltran-support-checksum.patch delete mode 100644 0057-add-examples-readme-compile-components-main-file-and.patch delete mode 100644 0058-add-examples-parameter-parsing.patch delete mode 100644 0059-lstack-core-fix-reta_conf-array-size-calculation.patch delete mode 100644 0060-Replace-gettid-with-rte_gettid.patch delete mode 100644 0061-modify-the-code-for-canonical-and-update-the-cmake-b.patch delete mode 100644 0062-enable-secure-compile-and-open-compile-log.patch delete mode 100644 0063-support-epoll-et-trig-mode.patch delete mode 100644 0064-lstack-support-low-power.patch delete mode 100644 0065-add-port-mask-range-check.patch delete mode 100644 0066-release-kni-device.patch delete mode 100644 0067-optimize-check-ltran-exist.patch delete mode 100644 0068-clean-code.patch delete mode 100644 0069-clean-code.patch delete mode 100644 0070-Support-build-gazelle-with-clang.patch delete mode 100644 0071-Allow-dynamic-load-PMDs.patch delete mode 100644 0072-support-epoll-oneshot.patch delete mode 100644 0073-modify-readme-and-clean-code.patch delete mode 100644 0074-ltran-support-muti-proc-with-same-ip.patch delete mode 100644 0075-fix-rpc-msg-out-of-bound.patch delete mode 100644 0076-fix-traversal-array-use-NULL-pointer.patch delete mode 100644 0077-same-stack-thread-don-t-repeate-send-msg.patch delete mode 100644 0078-fix-memcpy-out-bounds.patch delete mode 100644 0079-fix-miss-send-rpc-msg-err.patch delete mode 100644 0080-fix-proc-can-not-exit-due-to-lack-of-mem-startup-fai.patch delete mode 100644 0081-read-data-with-err-event.patch delete mode 100644 0082-del-gazelle-ring-cons.tail-atomic-protect.patch delete mode 100644 0083-fix-send-return-vale.patch delete mode 100644 0084-add-examples.patch delete mode 100644 0085-expand-thread-rpc-msg-pool-size.patch delete mode 100644 0086-fix-fd-leak.patch delete mode 100644 0087-fix-del-conn-use-after-free.patch delete mode 100644 0088-init-g_gazelle_errno-before-use.patch delete mode 100644 0089-code-format-specification.patch delete mode 100644 0090-fix-gazelle-kernel-event-thread-affinity-same-with-s.patch delete mode 100644 0091-have_corelist_arg.patch delete mode 100644 0092-ltran-update-list.patch delete mode 100644 0093-remove-get_reg_ring_free_count.patch delete mode 100644 0094-add-errorno-EISCONN.patch delete mode 100644 0095-fix-sendmsg-data-write-wrong.patch delete mode 100644 0096-lstack-restore-pci-bus-after-init.patch delete mode 100644 0097-fix-malloc-rpc-msg-fail.patch delete mode 100644 0098-support-dpdk-dynamic-memory.patch delete mode 100644 0099-fix-lwip_send-fail-free-pbuf-miss-data.patch delete mode 100644 0100-merger-wakeup.patch delete mode 100644 0101-conenct-support-multi-queues.patch delete mode 100644 0102-merge-sendmsg-write.patch delete mode 100644 0103-add-thread-select-path.patch delete mode 100644 0104-support-conf-control-app-bind-numa.patch delete mode 100644 0105-fix-epoll_wait-cover-kernel-event.patch delete mode 100644 0106-fix-read-stack-data-return-0-when-no-data.patch delete mode 100644 0107-fix-stack-wakeup-node-del.patch delete mode 100644 0108-avoid-useless-stack-check-wakeup-event.patch delete mode 100644 0109-fix-mesg-loss.patch delete mode 100644 0110-add-accept4-and-epoll_create1.patch delete mode 100644 0111-refactor-event-notice.patch delete mode 100644 0112-add-writev-and-readv.patch delete mode 100644 0113-optimized-some-function-in-lstack.patch delete mode 100644 0114-fix-gazellectl-stats-err-when-donot-bind-numa.patch delete mode 100644 0115-add-usleep-when-write_ring-is-busy.patch delete mode 100644 0116-optimize-variable-access.patch delete mode 100644 0117-add-gro.patch delete mode 100644 0118-expand-nic-rx-desc-size.patch delete mode 100644 0119-add-kni-local-support-in-lstack.patch delete mode 100644 0120-resolve-the-conflict-between-the-eth_dev_ops-variabl.patch delete mode 100644 0121-add-pdump-support-in-lstack.patch delete mode 100644 0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch delete mode 100644 0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch delete mode 100644 0124-fix-epoll_wait-return-when-timeout-is-0.patch delete mode 100644 0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch delete mode 100644 0126-fix-add-outdated-event.patch delete mode 100644 0127-revert-write-usleep.patch delete mode 100644 0128-reduce-thread-variable-access.patch delete mode 100644 0129-add-readv-and-readv-kernel.patch delete mode 100644 0130-add-unlock-before-after.patch delete mode 100644 0131-add-mutil-NIC-support-in-gazelle.patch delete mode 100644 0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch delete mode 100644 0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch delete mode 100644 0134-modify-readv-and-writev-first-buf-is-null.patch delete mode 100644 0135-fix-pdump-and-mutil-NIC-init-fail.patch delete mode 100644 0136-modify-duplicate-code.patch delete mode 100644 0137-merge-lstack-rx-tx-mbuf-pool.patch delete mode 100644 0138-avoid-send-stop-when-mbuf-pool-empty.patch delete mode 100644 0139-fix-pcb-snd_buf-flip.patch delete mode 100644 0140-fix-lwip-send-return-0-add-err-event.patch delete mode 100644 0141-fix-data-flow-error-when-use-NIC-in-kernel.patch delete mode 100644 0142-fix-write-event-error.patch delete mode 100644 0143-add-malloc-init-zero.patch delete mode 100644 0144-modify-event-error.patch delete mode 100644 0145-add-unix_prefix-in-gazellectl.patch delete mode 100644 0146-fix-epoll_wait-report-event0.patch delete mode 100644 0147-add-TSO.patch delete mode 100644 0148-optimize-app-thread-write-buff-block.patch delete mode 100644 0149-expand-rxtx-mbuf-pool.patch delete mode 100644 0150-add-pdump-support-in-ltran.patch delete mode 100644 0151-dfx-gazellectl-add-pcb-wins-info.patch delete mode 100644 0152-fix-genarate-out-event-untimely.patch delete mode 100644 0153-rxtx-mbuf-pool-size-config-by-conf.patch delete mode 100644 0154-fix-kernel-event-thread-bind-numa-failed.patch delete mode 100644 0155-stack-thread-parms-config-by-conf.patch delete mode 100644 0156-ltran-rxtx-mbuf-pool-size-config-by-conf.patch delete mode 100644 0157-move-select_thread_path-after-posix_api_init.patch delete mode 100644 0158-add-RXTX_NB_MBUF_MAX-to-limit-mbuf_pool_size-to-its-.patch delete mode 100644 0159-stack-thread-params-default-val.patch delete mode 100644 0160-optimite-net-type.patch delete mode 100644 0161-app-bind-numa-when-epoll-poll-create.patch delete mode 100644 0162-remove-mbuf-reserve-in-mbuf-alloc.patch delete mode 100644 0163-pkts-bulk-send-to-nic.patch delete mode 100644 0164-rpc-dont-send.patch delete mode 100644 0165-recv-pbuf-free-timely.patch delete mode 100644 0166-optimite-send-pkts-dul-index.patch delete mode 100644 0167-expand-data-recv-buff.patch delete mode 100644 0168-dfx-add-mempool-count-info.patch delete mode 100644 0169--write-support-without-epoll-poll.patch delete mode 100644 0170-add-rcv-nxt-dfx-info.patch delete mode 100644 0171-mbuf-private-data-size-align-cache-line.patch delete mode 100644 0172-fix-send-pkts-bluk-err.patch delete mode 100644 0173-free-recv-pkts-bluks.patch delete mode 100644 0174-fix-lstack-Makefile-warning.patch delete mode 100644 0175-fix-null-pointer-deref-in-stack_broadcast_close.patch delete mode 100644 0176-pbuf-align-cache-line.patch delete mode 100644 0177-support-set-main-thread-affinity.patch delete mode 100644 0178-reduce-epoll-wakeup.patch delete mode 100644 0179-revert-expand-recv-data-buff.patch delete mode 100644 0180-add-the-suggestion-of-using-the-u-parameter-when-the.patch delete mode 100644 0181-move-control_client_thread-creation-after-control_in.patch delete mode 100644 0182-add-ret-check-in-pthread_create-and-fix-example-bug.patch delete mode 100644 0183-add-log-message-when-wait-for-connecting-to-ltran.patch delete mode 100644 0184-add-gazelle-fuzz.patch delete mode 100644 0185-add-unitest.patch delete mode 100644 0186-add-gazelle-setup-tools.patch delete mode 100644 0187-test-readv-writev-epoll_create1-accept4.patch delete mode 100644 0188-add-fucntest.patch delete mode 100644 0189-fix-coredump-in-example-server-mum-mode.patch delete mode 100644 0190-bring-up-kni-when-init.patch delete mode 100644 0191-change-mbuf_pool_size-in-lstack.conf-to-tcp_conn_cou.patch delete mode 100644 0192-fix-build-error-in-lstack.patch delete mode 100644 0193-check-and-fix-wakeup_list-when-null-appears.patch delete mode 100644 0194-eneble-TSO-and-fix-TSO-mbuf-pktlen-error.patch delete mode 100644 0195-adapt-unsupport-sock-optname.patch delete mode 100644 0196-reduce-duplicate-code-in-lstack_cfg.c.patch delete mode 100644 0197-fix-private-data-offset-error.patch delete mode 100644 0198-fix-do_close-core-dump.patch delete mode 100644 0199-remove-rxtx-driver-cache.patch delete mode 100644 0200-send-ring-size-is-configure.patch delete mode 100644 0201-send-should-return-1-errno-EAGAIN-when-ring-full.patch delete mode 100644 0202-when-send-ring-full-whether-dynamic-alloc-mbuf-is-co.patch delete mode 100644 0203-add-pbuf-lock-when-aggregate-pbuf.patch delete mode 100644 0204-supprot-multi-process.patch delete mode 100644 0205-add-gazellectl-x-to-show-nic-stats.patch delete mode 100644 0206-add-same-node-ring-for-inter-proces-communication.patch delete mode 100644 0207-fix-send-reset-by-peer-when-not-sleep-after-connect.patch delete mode 100644 0208-add-tuple-filter-in-conf-to-diff-rss-rule-and-tuple-.patch delete mode 100644 0210-disable-tso-without-ipv4-checksum.patch delete mode 100644 0210-support-tuple-rule-add-delete.patch delete mode 100644 0211-refactor-mbuf-private-data.patch delete mode 100644 0212-fix-kernel-scoket-select-path-error.patch delete mode 100644 0213-discard-wakeup_num-parameter.patch delete mode 100644 0214-fix-parse-args-error.patch delete mode 100644 0215-gazelle-send-recv-thread-bind-numa.patch delete mode 100644 0216-waiting-when-primary-process-not-start-already.patch delete mode 100644 0217-sepeate_string_to-array-add-error-args-handle.patch delete mode 100644 0218-do-not-transfer-broadcast-arp-pkts-to-other-process.patch delete mode 100644 0219-revert-select_thread_path-and-optimize-app-thread-wh.patch delete mode 100644 0220-check-primary-process-idx-and-secondary-lstack-num.patch delete mode 100644 0221-optimite-select_path-and-pbuf_take.patch delete mode 100644 0222-fix-build-err-on-select_path.patch delete mode 100644 0223-set-kni_switch-valid-only-in-primary-process.patch delete mode 100644 0224-optimize-do_close.patch delete mode 100644 0225-add-socket-check-before-write-it.patch delete mode 100644 0226-update-lstack.Makefile.patch delete mode 100644 0227-fix-config-flow-rule-race.patch delete mode 100644 0228-fix-build-err-with-dpdk-21.11.patch delete mode 100644 0229-fix-gazellectl-x-error-when-multiplt-user-nic-config.patch delete mode 100644 0230-fix-client-connect-number-unbalance-on-lstack.patch delete mode 100644 0231-kni-down-not-stop-nic.patch delete mode 100644 0232-fix-rpc-msg-alloc-failed.patch delete mode 100644 0233-add-parentheses-to-fix-build-error.patch delete mode 100644 0234-fix-bond_ports-parse-error.patch delete mode 100644 0235-dfx-set-g_unix_fd-to-1-after-abnormal-close-fd-to-av.patch delete mode 100644 0236-dfx-security-function-failed-return-error-directly.patch delete mode 100644 0237-add-bond4-suport.patch delete mode 100644 0238-clean-code.patch delete mode 100644 0239-add-udp-multicast-support-in-gazelle.patch delete mode 100644 0240-modify-huge-dir-dir-name.patch delete mode 100644 0241-drop-netbuf-in-read_lwip_data-to-fix-mem-overflow.patch delete mode 100644 0242-send-recv-thread-bind-numa-only-app_bind_numa-set-to.patch delete mode 100644 0243-fix-change-low-power-mod-invalid.patch delete mode 100644 0244-add-exception-handling-for-is_dst_ip_localhost.patch delete mode 100644 0245-fix-gazellectl-block-before-lstack-registration-is-c.patch delete mode 100644 0246-fix-udp-send-recv-in-muliple-queue.patch delete mode 100644 0247-set-sock-when-select-path-is-PATH_UNKNOW.patch delete mode 100644 0248-rpc-pool-use-dpdk-mempool-replace-array.patch delete mode 100644 0249-fix-t_params-use-after-free-in-kernel-event-thread.patch delete mode 100644 0250-adapt-to-dpdk-19.11-and-dpdk-21.11.patch delete mode 100644 0251-change-send_ring_size-32-in-lstack-conf.patch delete mode 100644 0252-add-use_sockmap-in-cfg-to-distinguish-whether-to-use.patch delete mode 100644 0253-add-multicast-enable-in-dpdk_ethdev_init.patch delete mode 100644 0254-fix-null-pointer-of-sock-in-udp_recvfrom.patch delete mode 100644 0255-skip-gro-when-tcp-ip-checksum-offloads-disable.patch delete mode 100644 0256-lstack-cfg-add-app_exclude_cpus.patch delete mode 100644 0257-enable-UDP-CKSUM-in-gazelle.patch delete mode 100644 0258-fix-core-dump-when-slave-mac-failed.patch delete mode 100644 0259-check-return-value-of-hugepage_init-to-avoid-coredum.patch delete mode 100644 0260-add-udp_enable-to-turn-off-udp-in-need.patch delete mode 100644 0261-fix-bond4-EPOLLOUT-event-error.patch delete mode 100644 0262-bond4-add-dpdk-return-value-check.patch delete mode 100644 gazelle-1.0.1.tar.gz create mode 100644 gazelle-1.0.2.tar.gz diff --git a/0001-fix-compile-error-unuse-result.patch b/0001-fix-compile-error-unuse-result.patch deleted file mode 100644 index ed74fa0..0000000 --- a/0001-fix-compile-error-unuse-result.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 9155ca505cc2b3f3aa70ff6c0b4401be517b194f Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 4 Mar 2022 14:19:14 +0800 -Subject: [PATCH] fix compile error - ---- - src/ltran/ltran_dfx.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index c923de0..159fbb9 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -111,7 +111,10 @@ static pid_t ltran_process_exist(void) - char line[LINE]; - FILE *cmd = popen("pidof ltran", "r"); - -- (void)fgets(line, LINE, cmd); -+ if(fgets(line, LINE, cmd) == NULL) { -+ return 0; -+ } -+ - pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE); - (void)pclose(cmd); - --- -2.30.0 - diff --git a/0002-reduce-copy-in-send.patch b/0002-reduce-copy-in-send.patch deleted file mode 100644 index 314db6c..0000000 --- a/0002-reduce-copy-in-send.patch +++ /dev/null @@ -1,482 +0,0 @@ -From 012d15720728b615920b79de929f18a2a86d9d0a Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Tue, 8 Mar 2022 10:24:12 +0800 -Subject: [PATCH] reduce copy in send - ---- - src/common/dpdk_common.h | 23 +++--- - src/lstack/core/lstack_dpdk.c | 11 +-- - src/lstack/core/lstack_lwip.c | 82 ++++++++++++++----- - src/lstack/core/lstack_protocol_stack.c | 11 ++- - src/lstack/include/lstack_ethdev.h | 4 - - src/lstack/include/lstack_lwip.h | 6 +- - src/lstack/netif/lstack_ethdev.c | 101 ++++-------------------- - src/lstack/netif/lstack_vdev.c | 3 +- - 8 files changed, 104 insertions(+), 137 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 165a64b..e9cacc3 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -21,30 +21,25 @@ - #define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2) - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - -+/* NOTE!!! magic code, even the order. -+* I wrote it carefully, and check the assembly. for example, there is 24 ins in A72, -+* and if there is no cache miss, it only take less than 20 cycle(store pipe is the bottleneck). -+*/ - static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf *src) - { -- /* NOTE!!! magic code, even the order. -- I wrote it carefully, and check the assembly. for example, there is 24 ins in A72, -- and if there is no cache miss, it only take less than 20 cycle(store pipe is the bottleneck). -- */ -- uint8_t *dst_data = NULL; -- uint8_t *src_data = NULL; -- uint32_t rx_desc_fields_len = 16; -- uint16_t data_len; -- - /* In the direction of tx, data is copied from lstack to ltran. It is necessary to judge whether - the length of data transmitted from lstack has been tampered with to prevent overflow - */ -- data_len = src->data_len; -+ uint16_t data_len = src->data_len; - if (data_len > RTE_MBUF_DEFAULT_BUF_SIZE) - return; - - dst->ol_flags = src->ol_flags; -- // there is buf_len in rx_descriptor_fields1, copy it is dangerous acturely. -- rte_memcpy((uint8_t *)dst->rx_descriptor_fields1, (const uint8_t *)src->rx_descriptor_fields1, rx_desc_fields_len); -+ // there is buf_len in rx_descriptor_fields1, copy it is dangerous acturely. 16 : mbuf desc size -+ rte_memcpy((uint8_t *)dst->rx_descriptor_fields1, (const uint8_t *)src->rx_descriptor_fields1, 16); - -- dst_data = rte_pktmbuf_mtod(dst, void*); -- src_data = rte_pktmbuf_mtod(src, void*); -+ uint8_t *dst_data = rte_pktmbuf_mtod(dst, void*); -+ uint8_t *src_data = rte_pktmbuf_mtod(src, void*); - - rte_memcpy(dst_data, src_data, data_len); - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 1d355d4..280d643 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -34,6 +34,7 @@ - #include "lstack_dpdk.h" - #include "lstack_lockless_queue.h" - #include "lstack_thread_rpc.h" -+#include "lstack_lwip.h" - #include "lstack_cfg.h" - - struct eth_params { -@@ -257,7 +258,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui - while (remain > 0) { - batch = LWIP_MIN(remain, FREE_RX_QUEUE_SZ); - -- ret = eth_mbuf_claim(mempool, free_buf, batch); -+ ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %d ret=%d\n", (int32_t)batch, ret); - return -1; -@@ -341,7 +342,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { - #if CHECKSUM_CHECK_IP_HW - rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM; -- CONFIG_VAR_APPEND("DEV_RX_OFFLOAD_IPV4_CKSUM "); -+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n"); - #endif - } - -@@ -349,7 +350,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { - #if CHECKSUM_CHECK_TCP_HW - rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM; -- CONFIG_VAR_APPEND("DEV_RX_OFFLOAD_TCP_CKSUM "); -+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_TCP_CKSUM\n"); - #endif - } - -@@ -357,7 +358,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) { - #if CHECKSUM_GEN_IP_HW - tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM; -- CONFIG_VAR_APPEND("DEV_TX_OFFLOAD_IPV4_CKSUM "); -+ LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_IPV4_CKSUM\n"); - #endif - } - -@@ -365,7 +366,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) { - #if CHECKSUM_GEN_TCP_HW - tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM; -- CONFIG_VAR_APPEND("DEV_TX_OFFLOAD_TCP_CKSUM "); -+ LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_TCP_CKSUM\n"); - #endif - } - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 379682c..fbb4d62 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - - #include "gazelle_base_func.h" - #include "lstack_ethdev.h" -@@ -140,37 +141,80 @@ void gazelle_clean_sock(int32_t fd) - sock->stack->conn_num--; - } - --static void gazelle_free_pbuf(struct pbuf *p) -+void gazelle_free_pbuf(struct pbuf *pbuf) - { -- struct rte_mbuf *mbuf = pbuf_to_mbuf(p); -- rte_pktmbuf_free(mbuf); -+ if (pbuf == NULL) { -+ return; -+ } -+ -+ struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -+ if (mbuf->pool != NULL) { -+ rte_pktmbuf_free(mbuf); -+ } else { -+ rte_free(mbuf); -+ } - } - --static struct pbuf *tcp_pktmbuf_alloc(struct rte_mempool *pool, pbuf_layer layer, u16_t len) -+static int32_t alloc_mbufs(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) -+{ -+ // alloc mbuf from pool -+ if (rte_pktmbuf_alloc_bulk(pool, mbufs, num) == 0) { -+ return 0; -+ } -+ -+ // alloc mbuf from system -+ for (uint32_t i = 0; i < num; i++) { -+ struct rte_mbuf *mbuf = (struct rte_mbuf *)rte_malloc(NULL, pool->elt_size, sizeof(uint64_t)); -+ if (mbuf == NULL) { -+ for (uint32_t j = 0; j < i; j++) { -+ rte_free(mbufs[j]); -+ mbufs[j] = NULL; -+ } -+ return -1; -+ } -+ -+ mbufs[i] = mbuf; -+ rte_pktmbuf_init(pool, NULL, mbuf, 0); -+ rte_pktmbuf_reset(mbuf); -+ mbuf->pool = NULL; -+ } -+ -+ return 0; -+} -+ -+int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) - { -- struct rte_mbuf *mbuf = NULL; -- struct pbuf *pbuf = NULL; - struct pbuf_custom *pbuf_custom = NULL; - -- u16_t offset = layer; -- u16_t total_len = LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(len); -+ int32_t ret = alloc_mbufs(pool, mbufs, num); -+ if (ret != 0) { -+ get_protocol_stack()->stats.tx_allocmbuf_fail++; -+ return ret; -+ } - -- int32_t ret = rte_pktmbuf_alloc_bulk(pool, &mbuf, 1); -- if (ret) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld pktmbuf_alloc failed ret=%d\n", get_stack_tid(), ret); -- return NULL; -+ -+ for (uint32_t i = 0; i < num; i++) { -+ pbuf_custom = mbuf_to_pbuf(mbufs[i]); -+ pbuf_custom->custom_free_function = gazelle_free_pbuf; - } - -- uint8_t *data = (uint8_t *)rte_pktmbuf_append(mbuf, total_len); -- if (!data) { -- rte_pktmbuf_free(mbuf); -+ return 0; -+} -+ -+struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) -+{ -+ struct rte_mbuf *mbuf; -+ int32_t ret = alloc_mbufs(get_protocol_stack()->tx_pktmbuf_pool, &mbuf, 1); -+ if (ret != 0) { -+ get_protocol_stack()->stats.tx_allocmbuf_fail++; - return NULL; - } - -- pbuf_custom = mbuf_to_pbuf(mbuf); -+ struct pbuf_custom *pbuf_custom = mbuf_to_pbuf(mbuf); - pbuf_custom->custom_free_function = gazelle_free_pbuf; -- pbuf = pbuf_alloced_custom(layer, len, PBUF_RAM, pbuf_custom, data, total_len); -- pbuf->flags |= PBUF_FLAG_SND_SAVE_CPY; -+ -+ void *data = rte_pktmbuf_mtod(mbuf, void *); -+ struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); - - return pbuf; - } -@@ -180,7 +224,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack) - uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring); - - for (uint32_t i = 0; i < replenish_cnt; i++) { -- struct pbuf *pbuf = tcp_pktmbuf_alloc(stack->tx_pktmbuf_pool, PBUF_TRANSPORT, TCP_MSS); -+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM); - if (pbuf == NULL) { - break; - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index c0ab451..35665e6 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -198,8 +198,6 @@ int32_t init_protocol_stack(void) - init_list_node(&stack->recv_list); - init_list_node(&stack->listen_list); - -- stack_replenish_send_idlembuf(stack); -- - stack_group->stacks[i] = stack; - } - -@@ -290,6 +288,8 @@ static void stack_thread_init(struct protocol_stack *stack) - - hugepage_init(); - -+ stack_replenish_send_idlembuf(stack); -+ - tcpip_init(NULL, NULL); - - if (use_ltran()) { -@@ -631,10 +631,9 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - if (cur_stack == stack) { - continue; - } -- -- mbuf_copy = rte_pktmbuf_alloc(stack->rx_pktmbuf_pool); -- if (mbuf_copy == NULL) { -- stack->stats.rx_allocmbuf_fail++; -+ -+ ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); -+ if (ret != 0) { - return; - } - copy_mbuf(mbuf_copy, mbuf); -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index 492a7c8..29e0c23 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -30,11 +30,7 @@ struct eth_dev_ops { - }; - - int32_t ethdev_init(struct protocol_stack *stack); -- - int32_t eth_dev_poll(void); --int32_t eth_mbuf_claim(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count); -- -- - uint32_t eth_get_flow_cnt(void); - void eth_dev_recv(struct rte_mbuf *mbuf); - -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 3be365d..8bf0f29 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -14,13 +14,11 @@ - #define __LIBOS_LWIP_H__ - - #include "lstack_thread_rpc.h" -+#include "lwipsock.h" - - #define SOCK_RECV_RING_SIZE (128) - #define SOCK_SEND_RING_SIZE (32) - --/* flags define last type PBUF_FLAG_TCP_FIN 0x20U in pbuf.h */ --#define PBUF_FLAG_SND_SAVE_CPY 0x40U -- - #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) - #define NETCONN_IS_DATAIN(sock) ((rte_ring_count((sock)->recv_ring) || (sock)->recv_lastdata)) - #define NETCONN_IS_DATAOUT(sock) rte_ring_free_count((sock)->send_ring) -@@ -39,5 +37,7 @@ void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); - void stack_replenish_send_idlembuf(struct protocol_stack *stack); -+int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); -+void gazelle_free_pbuf(struct pbuf *pbuf); - - #endif -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 5d7161c..796a46d 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -36,63 +36,11 @@ - #include "lstack_stack_stat.h" - #include "lstack_log.h" - #include "lstack_dpdk.h" -+#include "lstack_lwip.h" - #include "lstack_ethdev.h" - - #define PKTMBUF_MALLOC_FLAG NULL - --static inline void eth_mbuf_reclaim(struct rte_mbuf *mbuf) --{ -- if (mbuf->pool != PKTMBUF_MALLOC_FLAG) { -- rte_pktmbuf_free(mbuf); -- } else { -- rte_free(mbuf); -- } --} -- --static void eth_pbuf_reclaim(struct pbuf *pbuf) --{ -- if (pbuf != NULL) { -- struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -- eth_mbuf_reclaim(mbuf); -- } --} -- --int32_t eth_mbuf_claim(struct rte_mempool *mp, struct rte_mbuf **mbufs, unsigned count) --{ -- struct rte_mbuf *m = NULL; -- uint32_t i; -- -- // try alloc mbuf from mbufpoll -- if (rte_pktmbuf_alloc_bulk(mp, mbufs, count) == 0) { -- return 0; -- } -- -- // try alloc mbuf from system -- for (i = 0; i < count; i++) { -- // elt_size == sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE + MBUF_SZ -- m = (struct rte_mbuf *)rte_malloc(NULL, mp->elt_size, sizeof(uint64_t)); -- if (m == NULL) { -- LSTACK_LOG(ERR, LSTACK, "vdev failed to malloc mbuf\n"); -- break; -- } -- // init mbuf -- mbufs[i] = m; -- rte_pktmbuf_init(mp, NULL, m, 0); -- rte_pktmbuf_reset(m); -- m->pool = PKTMBUF_MALLOC_FLAG; -- } -- -- if (unlikely(i != count)) { -- for (uint32_t j = 0; j < i; j++) { -- rte_free(mbufs[j]); -- mbufs[j] = NULL; -- } -- return -1; -- } -- -- return 0; --} -- - void eth_dev_recv(struct rte_mbuf *mbuf) - { - int32_t ret; -@@ -108,14 +56,11 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - while (m != NULL) { - len = (uint16_t)rte_pktmbuf_pkt_len(m); - payload = rte_pktmbuf_mtod(m, void *); -- - pc = mbuf_to_pbuf(m); -- pc->custom_free_function = eth_pbuf_reclaim; -- -+ pc->custom_free_function = gazelle_free_pbuf; - next = pbuf_alloced_custom(PBUF_RAW, (uint16_t)len, PBUF_RAM, pc, payload, (uint16_t)len); - if (next == NULL) { -- stack->stats.rx_drop++; -- LSTACK_LOG(ERR, LSTACK, "eth_dev_recv: failed to allocate pbuf!\n"); -+ stack->stats.rx_allocmbuf_fail++; - break; - } - -@@ -185,42 +130,28 @@ uint32_t eth_get_flow_cnt(void) - - static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - { -- uint8_t *data = NULL; -- int32_t ret; -- uint32_t sent_pkts; -- struct rte_mbuf *mbufs[DPDK_PKT_BURST_SIZE]; -- uint16_t total_len = pbuf->tot_len; -- struct pbuf *head = pbuf; - struct protocol_stack *stack = get_protocol_stack(); -+ struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); - -- ret = rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, &mbufs[0], 1); -- if (ret != 0) { -- stack->stats.tx_drop++; -- stack->stats.tx_allocmbuf_fail++; -- LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for output ret=%d\n", ret); -- return ERR_MEM; -- } -- -- data = (uint8_t *)rte_pktmbuf_append(mbufs[0], total_len); -- if (data == NULL) { -+ if (mbuf->buf_addr == 0) { - stack->stats.tx_drop++; -- stack->stats.tx_allocmbuf_fail++; -- LSTACK_LOG(ERR, LSTACK, "eth_dev_output: append mbuf failed!\n"); -- rte_pktmbuf_free(mbufs[0]); -- return ERR_MEM; -+ return ERR_BUF; - } - -- for (; head != NULL; head = head->next) { -- rte_memcpy(data, head->payload, head->len); -- data += head->len; -- } -+ mbuf->data_len = pbuf->len; -+ mbuf->pkt_len = pbuf->tot_len; -+ rte_mbuf_refcnt_update(mbuf, 1); -+#if CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW -+ mbuf->ol_flags = pbuf->ol_flags; -+ mbuf->l2_len = pbuf->l2_len; -+ mbuf->l3_len = pbuf->l3_len; -+#endif - -- sent_pkts = stack->dev_ops->tx_xmit(stack, mbufs, 1); -+ uint32_t sent_pkts = stack->dev_ops->tx_xmit(stack, &mbuf, 1); - stack->stats.tx += sent_pkts; - if (sent_pkts < 1) { - stack->stats.tx_drop++; -- rte_pktmbuf_free(mbufs[0]); -- mbufs[0] = NULL; -+ rte_pktmbuf_free(mbuf); - return ERR_MEM; - } - -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 2b30334..a2f89fa 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -25,6 +25,7 @@ - #include "lstack_ethdev.h" - #include "lstack_control_plane.h" - #include "lstack_log.h" -+#include "lstack_lwip.h" - #include "lstack_vdev.h" - - /* INUSE_TX_PKTS_WATERMARK < VDEV_RX_QUEUE_SZ; -@@ -46,7 +47,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk - stack->rx_ring_used += rcvd_pkts; - if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) { - uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, DPDK_PKT_BURST_SIZE); -- int32_t ret = eth_mbuf_claim(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); -+ int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); - if (likely(ret == 0)) { - nr_pkts = rte_ring_en_enqueue_bulk(stack->rx_ring, (void **)free_buf, free_cnt); - stack->rx_ring_used -= nr_pkts; --- -2.30.0 - diff --git a/0003-execute-gazelle_init_sock-before-read-event.patch b/0003-execute-gazelle_init_sock-before-read-event.patch deleted file mode 100644 index 087a29f..0000000 --- a/0003-execute-gazelle_init_sock-before-read-event.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 23c3c39dda9ff0810ee16a5db7e2b21edc6a37d7 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 7 Mar 2022 23:14:21 +0800 -Subject: [PATCH 03/34] execute gazelle_init_sock() before read event - ---- - src/lstack/core/lstack_protocol_stack.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 35665e6..f96d7a3 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -518,9 +518,7 @@ void stack_accept(struct rpc_msg *msg) - fd = sock->attach_fd; - - msg->result = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (msg->result > 0) { -- gazelle_init_sock(msg->result); -- } else { -+ if (msg->result <= 0) { - LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, - fd, msg->result); - } --- -1.8.3.1 - diff --git a/0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch b/0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch deleted file mode 100644 index e4a9d9d..0000000 --- a/0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch +++ /dev/null @@ -1,193 +0,0 @@ -From 0f126e8723824823cddc608c2a6493ea9fc99e89 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 8 Mar 2022 10:59:59 +0800 -Subject: [PATCH 04/34] recvmsg/sendmsg should use - recvmsg_from_stack/sendmsg_to_stack instead of - rpc_call_recvmsg/rpc_call_sendmsg - ---- - src/lstack/api/lstack_wrap.c | 33 +-------------- - src/lstack/core/lstack_lwip.c | 88 ++++++++++++++++++++++++++++++++++++++++ - src/lstack/include/lstack_lwip.h | 3 ++ - 3 files changed, 93 insertions(+), 31 deletions(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 6488c62..7804ce9 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -103,10 +103,6 @@ static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, in - - static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *addrlen) - { -- if (addr == NULL || addrlen == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -- - if (select_path(s) == PATH_KERNEL) { - return posix_api->accept_fn(s, addr, addrlen); - } -@@ -292,31 +288,6 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len) - return posix_api->read_fn(s, mem, len); - } - --static inline ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) --{ -- if (buf == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -- -- if (len == 0) { -- return 0; -- } -- -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -- -- ssize_t send = write_stack_data(sock, buf, len); -- if (send < 0 || sock->have_rpc_send) { -- return send; -- } -- -- sock->have_rpc_send = true; -- ssize_t ret = rpc_call_send(fd, buf, len, flags); -- return (ret < 0) ? ret : send; --} -- - static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags) - { - if (select_path(sockfd) != PATH_LWIP) { -@@ -342,7 +313,7 @@ static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flag - } - - if (select_path(s) == PATH_LWIP) { -- return rpc_call_recvmsg(s, message, flags); -+ return recvmsg_from_stack(s, message, flags); - } - - return posix_api->recv_msg(s, message, flags); -@@ -355,7 +326,7 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_ - } - - if (select_path(s) == PATH_LWIP) { -- return rpc_call_sendmsg(s, message, flags); -+ return sendmsg_to_stack(s, message, flags); - } - - return posix_api->send_msg(s, message, flags); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index fbb4d62..0a71aae 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -386,6 +386,94 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - return recv_len; - } - -+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) -+{ -+ ssize_t buflen = 0; -+ int32_t i; -+ -+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ for (i = 0; i < message->msg_iovlen; i++) { -+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || -+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || -+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); -+ } -+ buflen = 0; -+ for (i = 0; i < message->msg_iovlen; i++) { -+ ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); -+ if (recvd_local > 0) { -+ buflen += recvd_local; -+ } -+ if (recvd_local < 0 || (recvd_local < (int)message->msg_iov[i].iov_len) || (flags & MSG_PEEK)) { -+ if (buflen <= 0) { -+ buflen = recvd_local; -+ } -+ break; -+ } -+ flags |= MSG_DONTWAIT; -+ } -+ -+ return buflen; -+} -+ -+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) -+{ -+ if (buf == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ if (len == 0) { -+ return 0; -+ } -+ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ ssize_t send = write_stack_data(sock, buf, len); -+ if (send < 0 || sock->have_rpc_send) { -+ return send; -+ } -+ -+ sock->have_rpc_send = true; -+ ssize_t ret = rpc_call_send(fd, buf, len, flags); -+ return (ret < 0) ? ret : send; -+} -+ -+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) -+{ -+ int32_t ret; -+ int32_t i; -+ ssize_t buflen = 0; -+ -+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ for (i = 0; i < message->msg_iovlen; i++) { -+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || -+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || -+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); -+ } -+ -+ for (i = 0; i < message->msg_iovlen; i++) { -+ ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); -+ if (ret < 0) { -+ return buflen == 0 ? ret : buflen; -+ } -+ buflen += ret; -+ } -+ -+ return buflen; -+} -+ - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - { - size_t recv_left = len; -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 8bf0f29..581b9fe 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -39,5 +39,8 @@ void stack_recvlist_count(struct rpc_msg *msg); - void stack_replenish_send_idlembuf(struct protocol_stack *stack); - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); - void gazelle_free_pbuf(struct pbuf *pbuf); -+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags); -+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags); -+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags); - - #endif --- -1.8.3.1 - diff --git a/0005-fix-LD_PRELOAD.patch b/0005-fix-LD_PRELOAD.patch deleted file mode 100644 index be6fed4..0000000 --- a/0005-fix-LD_PRELOAD.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ff74c402d0502797fe4411178882bb3cb8e3ddd9 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 7 Mar 2022 23:30:12 +0800 -Subject: [PATCH 05/34] fix LD_PRELOAD - ---- - src/lstack/api/lstack_wrap.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 7804ce9..6ee5639 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -44,6 +44,14 @@ enum KERNEL_LWIP_PATH { - - static inline enum KERNEL_LWIP_PATH select_path(int fd) - { -+ if (posix_api == NULL) { -+ /* link liblstack.so using LD_PRELOAD mode will read liblstack.so, -+ poisx_api need to be initialized here */ -+ if (posix_api_init() != 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); -+ } -+ return PATH_KERNEL; -+ } - struct lwip_sock *sock = posix_api->get_socket(fd); - - /* AF_UNIX case */ --- -1.8.3.1 - diff --git a/0006-reduce-replenish-send_idle_ring-rpc-call.patch b/0006-reduce-replenish-send_idle_ring-rpc-call.patch deleted file mode 100644 index d88e667..0000000 --- a/0006-reduce-replenish-send_idle_ring-rpc-call.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 7b7dd1bdda75f8877e57f3b29432e3e1686bf9b5 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 7 Mar 2022 23:35:07 +0800 -Subject: [PATCH 06/34] reduce replenish send_idle_ring rpc call - ---- - src/lstack/core/lstack_lwip.c | 4 ++-- - src/lstack/core/lstack_thread_rpc.c | 2 ++ - src/lstack/include/lstack_protocol_stack.h | 1 + - 3 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 0a71aae..a9ef824 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -240,7 +240,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack) - ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags) - { - struct pbuf *pbuf = NULL; -- ssize_t send_ret; -+ ssize_t send_ret = 0; - ssize_t send_len = 0; - - do { -@@ -327,7 +327,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - sock->have_event = false; - } - -- if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK) { -+ if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { - rpc_call_replenish_idlembuf(sock->stack); - } - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 1ed20dd..8b3d36c 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -194,10 +194,12 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg) - { - struct protocol_stack *stack = get_protocol_stack(); - stack_replenish_send_idlembuf(stack); -+ stack->in_replenish = 0; - } - - void rpc_call_replenish_idlembuf(struct protocol_stack *stack) - { -+ stack->in_replenish = 1; - struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf); - if (msg == NULL) { - return; -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 3c49bd5..1020e83 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -28,6 +28,7 @@ struct protocol_stack { - uint16_t socket_id; - uint16_t cpu_id; - volatile uint16_t conn_num; -+ volatile bool in_replenish; - - // for dispatcher thread - cpu_set_t idle_cpuset; --- -1.8.3.1 - diff --git a/0007-parse_host_addr-should-be-executed-before-parse_dpdk.patch b/0007-parse_host_addr-should-be-executed-before-parse_dpdk.patch deleted file mode 100644 index f9bf7c7..0000000 --- a/0007-parse_host_addr-should-be-executed-before-parse_dpdk.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 6289822ec806dbcc0499378148e1b291d9f992f5 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 10 Mar 2022 21:03:59 +0800 -Subject: [PATCH 07/34] parse_host_addr() should be executed before - parse_dpdk_args() - ---- - src/lstack/core/lstack_cfg.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 0f899b1..d8eaced 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -63,16 +63,16 @@ struct config_vector_t { - }; - - static struct config_vector_t g_config_tbl[] = { -- { "dpdk_args", parse_dpdk_args }, -+ { "host_addr", parse_host_addr }, -+ { "gateway_addr", parse_gateway_addr }, -+ { "mask_addr", parse_mask_addr }, - { "use_ltran", parse_use_ltran }, -+ { "devices", parse_devices }, -+ { "dpdk_args", parse_dpdk_args }, - { "num_cpus", parse_stack_cpu_number }, - { "num_weakup", parse_weakup_cpu_number }, - { "numa_bind", parse_numa_bind }, - { "low_power_mode", parse_low_power_mode }, -- { "host_addr", parse_host_addr }, -- { "mask_addr", parse_mask_addr }, -- { "devices", parse_devices }, -- { "gateway_addr", parse_gateway_addr }, - { "kni_switch", parse_kni_switch }, - { NULL, NULL } - }; -@@ -302,8 +302,9 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu - int32_t count = 0; - char *elem = strtok(strbuf, "-"); - while (elem && count < num) { -- while (elem && isspace(*elem)) -+ while (elem && isspace(*elem)) { - elem++; -+ } - cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal - - if (count % 2 == 0) // 2 : even --- -1.8.3.1 - diff --git a/0008-fix-gazellectl-l-option-error.patch b/0008-fix-gazellectl-l-option-error.patch deleted file mode 100644 index 85ba72d..0000000 --- a/0008-fix-gazellectl-l-option-error.patch +++ /dev/null @@ -1,56 +0,0 @@ -From b9914a2ff92b34242eefd9d42bc80a8b0a6307c5 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Tue, 8 Mar 2022 14:45:59 +0800 -Subject: [PATCH 08/34] fix gazellectl -l option error - ---- - src/ltran/ltran_dfx.c | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 159fbb9..381d30d 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -1182,19 +1182,23 @@ static int32_t parse_dfx_cmd_args(int32_t argc, char *argv[], struct gazelle_sta - return num_cmd; - } - --static int32_t check_cmd_support(enum GAZELLE_STAT_MODE stat_mode) -+static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32_t req_msg_num) - { -- switch (stat_mode) { -+ switch (req_msg[0].stat_mode) { - case GAZELLE_STAT_LSTACK_LOG_LEVEL_SET: - case GAZELLE_STAT_LSTACK_SHOW: - case GAZELLE_STAT_LSTACK_SHOW_SNMP: - case GAZELLE_STAT_LSTACK_SHOW_CONN: - case GAZELLE_STAT_LSTACK_SHOW_LATENCY: - case GAZELLE_STAT_LSTACK_LOW_POWER_MDF: -- case GAZELLE_STAT_LTRAN_START_LATENCY: - return 0; - default: -- show_usage(); -+ if (req_msg[0].stat_mode == GAZELLE_STAT_LTRAN_START_LATENCY && -+ req_msg[req_msg_num - 1].stat_mode == GAZELLE_STAT_LSTACK_SHOW_LATENCY) { -+ return 0; -+ } -+ /* keep output consistency */ -+ printf("connect ltran failed. errno: 111 ret=-1\n"); - return -1; - } - -@@ -1220,9 +1224,9 @@ int32_t main(int32_t argc, char *argv[]) - g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data); - g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data); - g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_STOP_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data); -- ret = check_cmd_support(req_msg[msg_index].stat_mode); -+ ret = check_cmd_support(req_msg, req_msg_num); - if (ret < 0) { -- return 0; -+ return -1; - } - } - --- -1.8.3.1 - diff --git a/0009-bind-cpu-fail-just-walrm.patch b/0009-bind-cpu-fail-just-walrm.patch deleted file mode 100644 index 4caf3d8..0000000 --- a/0009-bind-cpu-fail-just-walrm.patch +++ /dev/null @@ -1,24 +0,0 @@ -From bc1452fc1b981f62f72744954c2679497ac28f77 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Tue, 8 Mar 2022 20:19:35 +0800 -Subject: [PATCH 09/34] bind cpu fail just walrm - ---- - src/lstack/core/lstack_dpdk.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 280d643..0544943 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -80,7 +80,6 @@ int32_t thread_affinity_init(int32_t cpu_id) - ret = rte_thread_set_affinity(&cpuset); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "thread %d pthread_setaffinity_np failed ret=%d\n", rte_gettid(), ret); -- return -1; - } - - return 0; --- -1.8.3.1 - diff --git a/0010-mfix-close-not-release-sock.patch b/0010-mfix-close-not-release-sock.patch deleted file mode 100644 index 7b7df05..0000000 --- a/0010-mfix-close-not-release-sock.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 175ea2338bc5f9f428b1155d3910f40a8a311c25 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 17:34:59 +0800 -Subject: [PATCH 10/34] -mfix close not release sock - ---- - src/lstack/core/lstack_lwip.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index a9ef824..87d99d3 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -127,18 +127,18 @@ void gazelle_init_sock(int32_t fd) - - void gazelle_clean_sock(int32_t fd) - { -- struct lwip_sock *sock = get_socket(fd); -+ struct lwip_sock *sock = get_socket_by_fd(fd); - if (sock == NULL) { - return; - } - -+ sock->stack->conn_num--; -+ - reset_sock_data(sock); - - list_del_node_init(&sock->recv_list); - list_del_node_init(&sock->attach_list); - list_del_node_init(&sock->listen_list); -- -- sock->stack->conn_num--; - } - - void gazelle_free_pbuf(struct pbuf *pbuf) --- -1.8.3.1 - diff --git a/0011-fix-evetns-err.patch b/0011-fix-evetns-err.patch deleted file mode 100644 index b0ef758..0000000 --- a/0011-fix-evetns-err.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 7f3dbd7145d683c22e70d69ec8799a49cb837415 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 17:44:50 +0800 -Subject: [PATCH 11/34] fix evetns err - ---- - src/lstack/core/lstack_lwip.c | 36 ++++++++++++++++++++---------------- - 1 file changed, 20 insertions(+), 16 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 87d99d3..3b97bb8 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -317,14 +317,16 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - send_pkt++; - } - -- if (NETCONN_IS_DATAOUT(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLOUT; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -- sock->stack->stats.write_events++; -- } else { -- sock->have_event = false; -+ if ((sock->epoll_events & EPOLLOUT)) { -+ if (NETCONN_IS_DATAOUT(sock)) { -+ sock->have_event = true; -+ sock->events |= EPOLLOUT; -+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.write_events++; -+ } else { -+ sock->have_event = false; -+ } - } - - if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { -@@ -518,14 +520,16 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -- if (NETCONN_IS_DATAIN(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLIN; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -- sock->stack->stats.read_events++; -- } else { -- sock->have_event = false; -+ if ((sock->epoll_events & EPOLLIN)) { -+ if (NETCONN_IS_DATAIN(sock)) { -+ sock->have_event = true; -+ sock->events |= EPOLLIN; -+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.read_events++; -+ } else { -+ sock->have_event = false; -+ } - } - - if (recvd == 0) { --- -1.8.3.1 - diff --git a/0012-fix-dfx-info-show.patch b/0012-fix-dfx-info-show.patch deleted file mode 100644 index 9814be6..0000000 --- a/0012-fix-dfx-info-show.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 5d5268f64f4bd9b3fcdc2aad3d0d2f24c307351a Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 19:26:51 +0800 -Subject: [PATCH 12/34] fix dfx info show - ---- - src/lstack/core/lstack_lwip.c | 12 ++++++------ - src/ltran/ltran_dfx.c | 2 +- - 2 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 3b97bb8..8de032f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -667,6 +667,12 @@ void get_lwip_conntable(struct rpc_msg *msg) - conn_num++; - } - -+ for (pcb = tcp_tw_pcbs; pcb != NULL && conn_num < max_num; pcb = pcb->next) { -+ conn[conn_num].state = TIME_WAIT_LIST; -+ copy_pcb_to_conn(conn + conn_num, pcb); -+ conn_num++; -+ } -+ - for (struct tcp_pcb_listen *pcbl = tcp_listen_pcbs.listen_pcbs; pcbl != NULL && conn_num < max_num; - pcbl = pcbl->next) { - conn[conn_num].state = LISTEN_LIST; -@@ -680,12 +686,6 @@ void get_lwip_conntable(struct rpc_msg *msg) - conn_num++; - } - -- for (pcb = tcp_tw_pcbs; pcb != NULL && conn_num < max_num; pcb = pcb->next) { -- conn[conn_num].state = TIME_WAIT_LIST; -- copy_pcb_to_conn(conn + conn_num, pcb); -- conn_num++; -- } -- - msg->result = conn_num; - } - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 381d30d..2a268f7 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -879,7 +879,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); - printf("No. Proto recv_cnt recv_ring in_send send_ring Local Address" -- " Foreign Address State\n"); -+ " Foreign Address State\n"); - unread_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { - struct gazelle_stat_lstack_conn_info *conn_info = &conn->conn_list[i]; --- -1.8.3.1 - diff --git a/0013-balance-acept.patch b/0013-balance-acept.patch deleted file mode 100644 index f86b3cd..0000000 --- a/0013-balance-acept.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 92b990c766e21fc275bd7cd80bbdccc819ac30f8 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 20:13:16 +0800 -Subject: [PATCH 13/34] balance acept - ---- - src/lstack/core/lstack_protocol_stack.c | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index f96d7a3..badcfd3 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -709,18 +709,30 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) - /* ergodic the protocol stack thread to find the connection, because all threads are listening */ - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) - { -+ struct lwip_sock *min_sock = NULL; -+ int32_t min_fd; -+ - while (fd > 0) { - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - GAZELLE_RETURN(EINVAL); - } - -- if (NETCONN_IS_ACCEPTIN(sock)) { -- return rpc_call_accept(fd, addr, addrlen); -+ if (!NETCONN_IS_ACCEPTIN(sock)) { -+ continue; -+ } -+ -+ if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) { -+ min_sock = sock; -+ min_fd = fd; - } - - fd = sock->nextfd; - } - -+ if (min_sock) { -+ return rpc_call_accept(min_fd, addr, addrlen); -+ } -+ - GAZELLE_RETURN(EAGAIN); - } --- -1.8.3.1 - diff --git a/0014-fix-miss-evetn.patch b/0014-fix-miss-evetn.patch deleted file mode 100644 index 0a60412..0000000 --- a/0014-fix-miss-evetn.patch +++ /dev/null @@ -1,248 +0,0 @@ -From 4defcc589cfdd71234c2931ca8bee081ceab491a Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 21:27:04 +0800 -Subject: [PATCH 14/34] fix miss evetn - ---- - src/common/gazelle_dfx_msg.h | 1 + - src/lstack/api/lstack_epoll.c | 5 --- - src/lstack/core/lstack_lwip.c | 16 ++++++--- - src/lstack/core/lstack_protocol_stack.c | 59 +++++++++++++++++++++++---------- - src/lstack/include/lstack_weakup.h | 26 ++++++++++----- - src/ltran/ltran_dfx.c | 7 ++-- - 6 files changed, 75 insertions(+), 39 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index cde2fec..e681424 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -83,6 +83,7 @@ struct gazelle_stat_pkts { - uint64_t call_alloc_fail; - uint64_t read_events; - uint64_t write_events; -+ uint64_t accept_events; - uint64_t read_null; - uint64_t recv_empty; - uint64_t event_null; -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 99d1eac..b1bb84c 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -43,11 +43,6 @@ enum POLL_TYPE { - - static inline bool report_events(struct lwip_sock *sock, uint32_t event) - { -- /* listen fd event */ -- if (sock->attach_fd > 0) { -- return true; -- } -- - /* error event */ - if ((event & EPOLLERR) || (event & EPOLLHUP) || (event & EPOLLRDHUP)) { - return true; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 8de032f..0561678 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -318,14 +318,18 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - } - - if ((sock->epoll_events & EPOLLOUT)) { -+ /* avoid miss EPOLLOUT event, call NETCONN_IS_DATAOUT twice. -+ write data full and have_event=true, then data out add event failed because of have_event */ -+ if (!NETCONN_IS_DATAOUT(sock)) { -+ sock->have_event = false; -+ } -+ - if (NETCONN_IS_DATAOUT(sock)) { - sock->have_event = true; - sock->events |= EPOLLOUT; - rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); - sem_post(&sock->weakup->event_sem); - sock->stack->stats.write_events++; -- } else { -- sock->have_event = false; - } - } - -@@ -521,14 +525,18 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - - if ((sock->epoll_events & EPOLLIN)) { -+ /* avoid miss EPOLLIN event, call NETCONN_IS_DATAIN twice. -+ read data empty and have_event=true, then data in add event failed because of have_event */ -+ if (!NETCONN_IS_DATAIN(sock)) { -+ sock->have_event = false; -+ } -+ - if (NETCONN_IS_DATAIN(sock)) { - sock->have_event = true; - sock->events |= EPOLLIN; - rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); - sem_post(&sock->weakup->event_sem); - sock->stack->stats.read_events++; -- } else { -- sock->have_event = false; - } - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index badcfd3..197942f 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -505,6 +505,24 @@ void stack_listen(struct rpc_msg *msg) - } - } - -+static bool have_accept_event(int32_t fd) -+{ -+ do { -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ break; -+ } -+ -+ if (NETCONN_IS_ACCEPTIN(sock)) { -+ return true; -+ } -+ -+ fd = sock->nextfd; -+ } while (fd > 0); -+ -+ return false; -+} -+ - void stack_accept(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; -@@ -522,21 +540,6 @@ void stack_accept(struct rpc_msg *msg) - LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, - fd, msg->result); - } -- -- /* report remain accept event */ -- do { -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- break; -- } -- -- if ((sock->epoll_events & EPOLLIN) && NETCONN_IS_ACCEPTIN(sock)) { -- add_epoll_event(sock->conn, EPOLLIN); -- break; -- } -- -- fd = sock->nextfd; -- } while (fd > 0); - } - - void stack_connect(struct rpc_msg *msg) -@@ -710,7 +713,9 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) - { - struct lwip_sock *min_sock = NULL; -- int32_t min_fd; -+ int32_t head_fd = fd; -+ int32_t min_fd = fd; -+ int32_t ret = -1; - - while (fd > 0) { - struct lwip_sock *sock = get_socket(fd); -@@ -731,8 +736,26 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - } - - if (min_sock) { -- return rpc_call_accept(min_fd, addr, addrlen); -+ ret = rpc_call_accept(min_fd, addr, addrlen); -+ } -+ -+ /* avoid miss accept event, call have_accept_event twice. -+ rpc_call_accept empty and have_event=true, then establish connection add event failed because of have_event */ -+ struct lwip_sock *sock = get_socket(head_fd); -+ if (!have_accept_event(head_fd)) { -+ sock->have_event = false; -+ } -+ -+ if (have_accept_event(head_fd)) { -+ sock->have_event = true; -+ sock->events |= EPOLLIN; -+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.accept_events++; - } - -- GAZELLE_RETURN(EAGAIN); -+ if(ret < 0) { -+ errno = EAGAIN; -+ } -+ return ret; - } -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -index 6f11653..f334a0f 100644 ---- a/src/lstack/include/lstack_weakup.h -+++ b/src/lstack/include/lstack_weakup.h -@@ -49,21 +49,29 @@ static inline __attribute__((always_inline)) void weakup_attach_sock(struct lwip - - static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring *weakup_ring) - { -- uint32_t num; -- struct lwip_sock *sock[WEAKUP_MAX]; -+ struct lwip_sock *sock; - int32_t ret; - -- num = rte_ring_sc_dequeue_burst(weakup_ring, (void **)sock, WEAKUP_MAX, NULL); -- for (uint32_t i = 0; i < num; ++i) { -- ret = rte_ring_mp_enqueue(sock[i]->weakup->event_ring, (void *)sock[i]); -+ for (uint32_t i = 0; i < WEAKUP_MAX; ++i) { -+ ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock); -+ if (ret != 0) { -+ break; -+ } -+ -+ ret = rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); - if (ret == 0) { -- sem_post(&sock[i]->weakup->event_sem); -- sock[i]->stack->stats.lwip_events++; -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.lwip_events++; - } - - /* listen notice attach sock */ -- if (!list_is_empty(&sock[i]->attach_list)) { -- weakup_attach_sock(sock[i]); -+ if (!list_is_empty(&sock->attach_list)) { -+ weakup_attach_sock(sock); -+ } -+ -+ /* event_ring of attach sock may have idle elem */ -+ if (ret != 0) { -+ break; - } - } - } -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 2a268f7..1f4d88a 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -567,14 +567,15 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("weakup_events: %-14"PRIu64" ", lstack_stat->data.pkts.weakup_events); - printf("lwip_events: %-16"PRIu64" ", lstack_stat->data.pkts.lwip_events); - printf("app_events: %-17"PRIu64"\n", lstack_stat->data.pkts.app_events); -+ printf("read_events: %-16"PRIu64" ", lstack_stat->data.pkts.read_events); -+ printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events); -+ printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events); - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null); -- printf("read_events: %-16"PRIu64" \n", lstack_stat->data.pkts.read_events); -+ printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null); - printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event); -- printf("recv_empty: %-17"PRIu64" ", lstack_stat->data.pkts.recv_empty); -- printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events); - printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc); - } - --- -1.8.3.1 - diff --git a/0015-fix-too-much-evetns.patch b/0015-fix-too-much-evetns.patch deleted file mode 100644 index 293b6b3..0000000 --- a/0015-fix-too-much-evetns.patch +++ /dev/null @@ -1,204 +0,0 @@ -From a43b1b763b970660caeaf3f3206cd742990c0cd3 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 9 Mar 2022 23:05:41 +0800 -Subject: [PATCH 15/34] fix too much evetns - ---- - src/lstack/api/lstack_epoll.c | 50 +++++++++++++++++---------------- - src/lstack/core/lstack_lwip.c | 40 ++++++++------------------ - src/lstack/core/lstack_protocol_stack.c | 8 +----- - src/ltran/ltran_dfx.c | 4 +-- - 4 files changed, 41 insertions(+), 61 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index b1bb84c..6c9c582 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -41,6 +41,19 @@ enum POLL_TYPE { - TYPE_EPOLL, - }; - -+static inline bool check_event_vaild(struct lwip_sock *sock, uint32_t event) -+{ -+ if (event == EPOLLIN && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) { -+ return false; -+ } -+ -+ if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) { -+ return false; -+ } -+ -+ return true; -+} -+ - static inline bool report_events(struct lwip_sock *sock, uint32_t event) - { - /* error event */ -@@ -48,7 +61,11 @@ static inline bool report_events(struct lwip_sock *sock, uint32_t event) - return true; - } - -- return false; -+ if (sock->have_event) { -+ return false; -+ } -+ -+ return check_event_vaild(sock, event); - } - - void add_epoll_event(struct netconn *conn, uint32_t event) -@@ -72,7 +89,7 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - - sock->events |= event & sock->epoll_events; - -- if (!sock->have_event || report_events(sock, event)) { -+ if (report_events(sock, event)) { - sock->have_event = true; - weakup_enqueue(sock->stack->weakup_ring, sock); - sock->stack->stats.weakup_events++; -@@ -232,29 +249,16 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st - return event_num; - } - --static int32_t check_event_vaild(struct epoll_event *events, int32_t event_num, struct lwip_sock *sock, -- struct lwip_sock **sock_list, enum POLL_TYPE etype) -+static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock) - { - /* remove duplicate event */ -- if (etype == TYPE_EPOLL) { -- for (uint32_t i = 0; i < event_num; i++) { -- if (sock_list[i] == sock) { -- return -1; -- } -+ for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) { -+ if (sock_list[i] == sock) { -+ return true; - } - } - -- /* non_listen_fd remove no data EPOLLIN event */ -- if (sock->events == EPOLLIN && sock->attach_fd < 0 && !NETCONN_IS_DATAIN(sock)) { -- return -1; -- } -- -- /* remove no send_buff OUT event */ -- if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) { -- return -1; -- } -- -- return 0; -+ return !check_event_vaild(sock, sock->events); - } - - static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t maxevents, enum POLL_TYPE etype) -@@ -280,11 +284,9 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - get_protocol_stack_group()->event_null++; - break; - } -+ sock->have_event = false; - -- ret = check_event_vaild(events, event_num, sock, weakup->sock_list, etype); -- if (ret != 0) { -- events_cnt--; -- sock->have_event = false; -+ if (remove_event(etype, weakup->sock_list, event_num, sock)) { - sock->stack->stats.remove_event++; - continue; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 0561678..4a79f46 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -317,20 +317,12 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - send_pkt++; - } - -- if ((sock->epoll_events & EPOLLOUT)) { -- /* avoid miss EPOLLOUT event, call NETCONN_IS_DATAOUT twice. -- write data full and have_event=true, then data out add event failed because of have_event */ -- if (!NETCONN_IS_DATAOUT(sock)) { -- sock->have_event = false; -- } -- -- if (NETCONN_IS_DATAOUT(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLOUT; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -- sock->stack->stats.write_events++; -- } -+ if (!sock->have_event && (sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) { -+ sock->have_event = true; -+ sock->events |= EPOLLOUT; -+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.write_events++; - } - - if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { -@@ -524,20 +516,12 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -- if ((sock->epoll_events & EPOLLIN)) { -- /* avoid miss EPOLLIN event, call NETCONN_IS_DATAIN twice. -- read data empty and have_event=true, then data in add event failed because of have_event */ -- if (!NETCONN_IS_DATAIN(sock)) { -- sock->have_event = false; -- } -- -- if (NETCONN_IS_DATAIN(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLIN; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -- sock->stack->stats.read_events++; -- } -+ if (!sock->have_event && (sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) { -+ sock->have_event = true; -+ sock->events |= EPOLLIN; -+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ sem_post(&sock->weakup->event_sem); -+ sock->stack->stats.read_events++; - } - - if (recvd == 0) { -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 197942f..68cc49d 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -739,14 +739,8 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - ret = rpc_call_accept(min_fd, addr, addrlen); - } - -- /* avoid miss accept event, call have_accept_event twice. -- rpc_call_accept empty and have_event=true, then establish connection add event failed because of have_event */ - struct lwip_sock *sock = get_socket(head_fd); -- if (!have_accept_event(head_fd)) { -- sock->have_event = false; -- } -- -- if (have_accept_event(head_fd)) { -+ if (!sock->have_event && have_accept_event(head_fd)) { - sock->have_event = true; - sock->events |= EPOLLIN; - rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 1f4d88a..a552b40 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -556,9 +556,9 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("read_lwip: %-18"PRIu64" ", lstack_stat->data.pkts.read_lwip_cnt); - printf("read_lwip_drop: %-13"PRIu64" \n", lstack_stat->data.pkts.read_lwip_drop); - printf("app_write: %-18"PRIu64" ", lstack_stat->data.pkts.app_write_cnt); -- printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop); -- printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.app_write_idlefail); - printf("write_lwip: %-17"PRIu64" ", lstack_stat->data.pkts.write_lwip_cnt); -+ printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.app_write_idlefail); -+ printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop); - printf("write_lwip_drop: %-12"PRIu64" ", lstack_stat->data.pkts.write_lwip_drop); - printf("app_write_idlebuf: %-10"PRIu16" \n", lstack_stat->data.pkts.send_idle_ring_cnt); - printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list); --- -1.8.3.1 - diff --git a/0016-fix-dead-loop.patch b/0016-fix-dead-loop.patch deleted file mode 100644 index 8475e95..0000000 --- a/0016-fix-dead-loop.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 5755516a6d49b5fee68169521e974abe276801f1 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 10 Mar 2022 10:12:09 +0800 -Subject: [PATCH 16/34] fix dead loop - ---- - src/lstack/core/lstack_protocol_stack.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 68cc49d..939543b 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -724,6 +724,7 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - } - - if (!NETCONN_IS_ACCEPTIN(sock)) { -+ fd = sock->nextfd; - continue; - } - --- -1.8.3.1 - diff --git a/0017-remove-unuse-event.patch b/0017-remove-unuse-event.patch deleted file mode 100644 index 7045997..0000000 --- a/0017-remove-unuse-event.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 0a2b49d63807e62c5b13418e70e641b3d50ce3f2 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 10 Mar 2022 20:19:14 +0800 -Subject: [PATCH 17/34] remove unuse event - ---- - src/lstack/api/lstack_epoll.c | 19 +++++++++++++------ - src/lstack/core/lstack_lwip.c | 9 ++++++++- - src/lstack/core/lstack_thread_rpc.c | 1 - - 3 files changed, 21 insertions(+), 8 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 6c9c582..b12ce58 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -43,15 +43,15 @@ enum POLL_TYPE { - - static inline bool check_event_vaild(struct lwip_sock *sock, uint32_t event) - { -- if (event == EPOLLIN && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) { -- return false; -+ if ((event & EPOLLIN) && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) { -+ event &= ~EPOLLIN; - } - -- if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) { -- return false; -+ if ((event & EPOLLOUT) && !NETCONN_IS_DATAOUT(sock)) { -+ event &= ~EPOLLOUT; - } - -- return true; -+ return (event) ? true : false; - } - - static inline bool report_events(struct lwip_sock *sock, uint32_t event) -@@ -251,6 +251,11 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st - - static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock) - { -+ /* close sock */ -+ if (sock->stack == NULL) { -+ return true; -+ } -+ - /* remove duplicate event */ - for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) { - if (sock_list[i] == sock) { -@@ -287,7 +292,9 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - sock->have_event = false; - - if (remove_event(etype, weakup->sock_list, event_num, sock)) { -- sock->stack->stats.remove_event++; -+ if (sock->stack) { -+ sock->stack->stats.remove_event++; -+ } - continue; - } - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 4a79f46..fd334fb 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -128,7 +128,7 @@ void gazelle_init_sock(int32_t fd) - void gazelle_clean_sock(int32_t fd) - { - struct lwip_sock *sock = get_socket_by_fd(fd); -- if (sock == NULL) { -+ if (sock == NULL || sock->stack == NULL) { - return; - } - -@@ -324,8 +324,12 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - sem_post(&sock->weakup->event_sem); - sock->stack->stats.write_events++; - } -+ if (!NETCONN_IS_DATAOUT(sock)) { -+ sock->events &= ~EPOLLOUT; -+ } - - if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { -+ stack->in_replenish = true; - rpc_call_replenish_idlembuf(sock->stack); - } - -@@ -523,6 +527,9 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - sem_post(&sock->weakup->event_sem); - sock->stack->stats.read_events++; - } -+ if (!NETCONN_IS_DATAIN(sock)) { -+ sock->events &= ~EPOLLIN; -+ } - - if (recvd == 0) { - sock->stack->stats.read_null++; -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 8b3d36c..af5fad3 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -199,7 +199,6 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg) - - void rpc_call_replenish_idlembuf(struct protocol_stack *stack) - { -- stack->in_replenish = 1; - struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf); - if (msg == NULL) { - return; --- -1.8.3.1 - diff --git a/0018-fix-gazellectl-show.patch b/0018-fix-gazellectl-show.patch deleted file mode 100644 index 180b83a..0000000 --- a/0018-fix-gazellectl-show.patch +++ /dev/null @@ -1,45 +0,0 @@ -From e531579c08a56b2a53ea605a7bbba70bedfbae45 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Fri, 11 Mar 2022 10:53:28 +0800 -Subject: [PATCH 18/34] fix gazellectl show - ---- - src/lstack/core/lstack_lwip.c | 2 +- - src/ltran/ltran_dfx.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index fd334fb..90ddecc 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -329,7 +329,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - } - - if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { -- stack->in_replenish = true; -+ sock->stack->in_replenish = true; - rpc_call_replenish_idlembuf(sock->stack); - } - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index a552b40..a01d91f 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -1214,13 +1214,13 @@ int32_t main(int32_t argc, char *argv[]) - struct gazelle_dfx_list *dfx = NULL; - char recv_buf[GAZELLE_CMD_RESP_BUFFER_SIZE + 1] = {0}; - -+ g_use_ltran = ltran_process_exist() ? true : false; - req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg); - if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) { - show_usage(); - return 0; - } - -- g_use_ltran = ltran_process_exist() ? true : false; - if (!g_use_ltran) { - g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data); - g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data); --- -1.8.3.1 - diff --git a/0019-fix-repeate-msg.patch b/0019-fix-repeate-msg.patch deleted file mode 100644 index 24dff80..0000000 --- a/0019-fix-repeate-msg.patch +++ /dev/null @@ -1,423 +0,0 @@ -From 18a911bfd87c4b558740a586728e2bbec9813a6f Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 11 Mar 2022 16:21:43 +0800 -Subject: [PATCH 19/34] fix repeate msg - ---- - src/common/gazelle_dfx_msg.h | 1 + - src/lstack/core/lstack_dpdk.c | 2 +- - src/lstack/core/lstack_lwip.c | 25 ++++--------- - src/lstack/core/lstack_protocol_stack.c | 2 +- - src/lstack/core/lstack_thread_rpc.c | 63 ++++++++++++++++++--------------- - src/lstack/include/lstack_thread_rpc.h | 3 +- - src/ltran/ltran_dfx.c | 3 +- - 7 files changed, 46 insertions(+), 53 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index e681424..41cbefa 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -89,6 +89,7 @@ struct gazelle_stat_pkts { - uint64_t event_null; - uint64_t remove_event; - uint64_t send_self_rpc; -+ uint64_t call_null; - }; - - /* same as define in lwip/stats.h - struct stats_mib2 */ -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 0544943..b8320db 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -133,7 +133,7 @@ static struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_i - if (ret < 0) { - return NULL; - } -- pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), CALL_CACHE_SZ, 0, NULL, NULL, NULL, -+ pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL, - NULL, rte_socket_id(), 0); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 90ddecc..1fc8446 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -26,6 +26,7 @@ - #include "lstack_protocol_stack.h" - #include "lstack_log.h" - #include "lstack_weakup.h" -+#include "lstack_dpdk.h" - #include "lstack_stack_stat.h" - #include "lstack_lwip.h" - -@@ -82,9 +83,9 @@ static void reset_sock_data(struct lwip_sock *sock) - } - } - -- - void gazelle_init_sock(int32_t fd) - { -+ static uint32_t name_tick = 0; - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - return; -@@ -92,29 +93,15 @@ void gazelle_init_sock(int32_t fd) - - reset_sock_data(sock); - -- int32_t ret; -- char name[RTE_RING_NAMESIZE] = {0}; -- static uint32_t name_tick = 0; -- -- ret = snprintf_s(name, sizeof(name), RTE_RING_NAMESIZE - 1, "%s_%d", "sock_recv", name_tick++); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "%s create failed.\n", name); -- return; -- } -- sock->recv_ring = rte_ring_create(name, SOCK_RECV_RING_SIZE, rte_socket_id(), RING_F_SP_ENQ | RING_F_SC_DEQ); -+ sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, name_tick++); - if (sock->recv_ring == NULL) { -- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno); -+ LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno); - return; - } - -- ret = snprintf_s(name, sizeof(name), RTE_RING_NAMESIZE - 1, "%s_%d", "sock_send", name_tick++); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno); -- return; -- } -- sock->send_ring = rte_ring_create(name, SOCK_SEND_RING_SIZE, rte_socket_id(), RING_F_SP_ENQ | RING_F_SC_DEQ); -+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, name_tick++); - if (sock->send_ring == NULL) { -- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno); -+ LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 939543b..db8a20a 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -318,7 +318,7 @@ static void* gazelle_stack_thread(void *arg) - stack_thread_init(stack); - - for (;;) { -- poll_rpc_msg(&stack->rpc_queue, stack->rpc_pool); -+ poll_rpc_msg(stack); - - eth_dev_poll(); - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index af5fad3..b4d57d3 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -24,12 +24,12 @@ - #define HANDLE_RPC_MSG_MAX (8) - - static inline __attribute__((always_inline)) --struct rpc_msg *rpc_msg_alloc(struct rte_mempool *pool, rpc_msg_func func) -+struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - { - int32_t ret; - struct rpc_msg *msg = NULL; - -- ret = rte_mempool_get(pool, (void **)&msg); -+ ret = rte_mempool_get(stack->rpc_pool, (void **)&msg); - if (ret < 0) { - get_protocol_stack_group()->call_alloc_fail++; - return NULL; -@@ -46,6 +46,9 @@ static inline __attribute__((always_inline)) - void rpc_msg_free(struct rte_mempool *pool, struct rpc_msg *msg) - { - pthread_spin_destroy(&msg->lock); -+ -+ msg->self_release = 0; -+ msg->func = NULL; - rte_mempool_put(pool, (void *)msg); - } - -@@ -71,7 +74,7 @@ int32_t rpc_sync_call(lockless_queue *queue, struct rte_mempool *pool, struct rp - return ret; - } - --void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool) -+void poll_rpc_msg(struct protocol_stack *stack) - { - int32_t num; - struct rpc_msg *msg = NULL; -@@ -79,7 +82,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool) - num = 0; - lockless_queue_node *first_node = NULL; - while (num++ < HANDLE_RPC_MSG_MAX) { -- lockless_queue_node *node = lockless_queue_mpsc_pop(rpc_queue); -+ lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue); - if (node == NULL) { - return; - } -@@ -91,6 +94,8 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool) - - if (msg->func) { - msg->func(msg); -+ } else { -+ stack->stats.call_null++; - } - - rte_mb(); -@@ -98,7 +103,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool) - if (msg->self_release) { - pthread_spin_unlock(&msg->lock); - } else { -- rpc_msg_free(rpc_pool, msg); -+ rpc_msg_free(stack->rpc_pool, msg); - } - - if (first_node == node) { -@@ -109,7 +114,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool) - - int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint32_t max_conn) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, get_lwip_conntable); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, get_lwip_conntable); - if (msg == NULL) { - return -1; - } -@@ -122,7 +127,7 @@ int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint3 - - int32_t rpc_call_connnum(struct protocol_stack *stack) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, get_lwip_connnum); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, get_lwip_connnum); - if (msg == NULL) { - return -1; - } -@@ -132,7 +137,7 @@ int32_t rpc_call_connnum(struct protocol_stack *stack) - - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, create_shadow_fd); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, create_shadow_fd); - if (msg == NULL) { - return -1; - } -@@ -152,7 +157,7 @@ static void rpc_msgcnt(struct rpc_msg *msg) - - int32_t rpc_call_msgcnt(struct protocol_stack *stack) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_msgcnt); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_msgcnt); - if (msg == NULL) { - return -1; - } -@@ -162,7 +167,7 @@ int32_t rpc_call_msgcnt(struct protocol_stack *stack) - - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, thread_register_phase1); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, thread_register_phase1); - if (msg == NULL) { - return -1; - } -@@ -172,7 +177,7 @@ int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn) - - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, thread_register_phase2); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, thread_register_phase2); - if (msg == NULL) { - return -1; - } -@@ -182,7 +187,7 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_recvlist_count); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count); - if (msg == NULL) { - return -1; - } -@@ -199,7 +204,7 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg) - - void rpc_call_replenish_idlembuf(struct protocol_stack *stack) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_replenish_idlembuf); - if (msg == NULL) { - return; - } -@@ -210,7 +215,7 @@ void rpc_call_replenish_idlembuf(struct protocol_stack *stack) - - int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - { -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_arp); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_arp); - if (msg == NULL) { - return -1; - } -@@ -225,7 +230,7 @@ int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol) - { - struct protocol_stack *stack = get_minconn_protocol_stack(); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_socket); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_socket); - if (msg == NULL) { - return -1; - } -@@ -240,7 +245,7 @@ int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol) - int32_t rpc_call_close(int fd) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_close); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_close); - if (msg == NULL) { - return -1; - } -@@ -253,7 +258,7 @@ int32_t rpc_call_close(int fd) - int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_bind); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_bind); - if (msg == NULL) { - return -1; - } -@@ -268,7 +273,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen - int32_t rpc_call_listen(int s, int backlog) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(s); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_listen); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_listen); - if (msg == NULL) { - return -1; - } -@@ -282,7 +287,7 @@ int32_t rpc_call_listen(int s, int backlog) - int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_accept); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_accept); - if (msg == NULL) { - return -1; - } -@@ -297,7 +302,7 @@ int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_connect); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_connect); - if (msg == NULL) { - return -1; - } -@@ -312,7 +317,7 @@ int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen) - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getpeername); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getpeername); - if (msg == NULL) { - return -1; - } -@@ -327,7 +332,7 @@ int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen) - int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getsockname); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getsockname); - if (msg == NULL) { - return -1; - } -@@ -342,7 +347,7 @@ int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen) - int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getsockopt); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getsockopt); - if (msg == NULL) { - return -1; - } -@@ -359,7 +364,7 @@ int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, sockle - int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_setsockopt); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_setsockopt); - if (msg == NULL) { - return -1; - } -@@ -376,7 +381,7 @@ int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, - int32_t rpc_call_fcntl(int fd, int cmd, long val) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_fcntl); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_fcntl); - if (msg == NULL) { - return -1; - } -@@ -391,7 +396,7 @@ int32_t rpc_call_fcntl(int fd, int cmd, long val) - int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_ioctl); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_ioctl); - if (msg == NULL) { - return -1; - } -@@ -437,7 +442,7 @@ static void stack_send(struct rpc_msg *msg) - ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_send); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send); - if (msg == NULL) { - return -1; - } -@@ -454,7 +459,7 @@ ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_sendmsg); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendmsg); - if (msg == NULL) { - return -1; - } -@@ -469,7 +474,7 @@ int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) - int32_t rpc_call_recvmsg(int fd, struct msghdr *msghdr, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_recvmsg); -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvmsg); - if (msg == NULL) { - return -1; - } -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 8a05d6c..1365234 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -47,9 +47,8 @@ struct rpc_msg { - union rpc_msg_arg args[RPM_MSG_ARG_SIZE]; /* resolve by type */ - }; - --void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool); -- - struct protocol_stack; -+void poll_rpc_msg(struct protocol_stack *stack); - void rpc_call_replenish_idlembuf(struct protocol_stack *stack); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index a01d91f..4b46ac9 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -576,7 +576,8 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null); - printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event); -- printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc); -+ printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); -+ printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); - } - - static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat, --- -1.8.3.1 - diff --git a/0020-fix-wakeup-typos.patch b/0020-fix-wakeup-typos.patch deleted file mode 100644 index d7bf865..0000000 --- a/0020-fix-wakeup-typos.patch +++ /dev/null @@ -1,103 +0,0 @@ -From e9294baffd16b59f481d787332f11c657d85473a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 14:34:43 +0800 -Subject: [PATCH 20/34] fix wakeup typos - ---- - src/lstack/core/lstack_cfg.c | 19 ++++++++++++------- - src/lstack/include/lstack_cfg.h | 2 +- - src/lstack/lstack.conf | 2 +- - 3 files changed, 14 insertions(+), 9 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index d8eaced..e5a92ca 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -70,7 +70,7 @@ static struct config_vector_t g_config_tbl[] = { - { "devices", parse_devices }, - { "dpdk_args", parse_dpdk_args }, - { "num_cpus", parse_stack_cpu_number }, -- { "num_weakup", parse_weakup_cpu_number }, -+ { "num_wakeup", parse_weakup_cpu_number }, - { "numa_bind", parse_numa_bind }, - { "low_power_mode", parse_low_power_mode }, - { "kni_switch", parse_kni_switch }, -@@ -305,12 +305,17 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu - while (elem && isspace(*elem)) { - elem++; - } -+ if (elem == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "parse %s failed\n", path); -+ return -1; -+ } - cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal - -- if (count % 2 == 0) // 2 : even -+ if (count % 2 == 0) { // 2 : even - elem = strtok(NULL, "-"); -- else -+ } else { - elem = strtok(NULL, ","); -+ } - } - - return count; -@@ -353,7 +358,7 @@ int32_t init_stack_numa_cpuset(void) - for (int32_t idx = 0; idx < cfg->num_cpu; ++idx) { - CPU_SET(cfg->cpus[idx], &stack_cpuset); - } -- for (int32_t idx = 0; idx < cfg->num_weakup; ++idx) { -+ for (int32_t idx = 0; idx < cfg->num_wakeup; ++idx) { - CPU_SET(cfg->weakup[idx], &stack_cpuset); - } - -@@ -691,9 +696,9 @@ static int32_t parse_weakup_cpu_number(void) - - int32_t ret; - -- g_config_params.num_weakup = 0; -+ g_config_params.num_wakeup = 0; - -- cfg_args = config_lookup(&g_config, "num_weakup"); -+ cfg_args = config_lookup(&g_config, "num_wakeup"); - if (cfg_args == NULL) { - return 0; - } -@@ -707,7 +712,7 @@ static int32_t parse_weakup_cpu_number(void) - if (ret <= 0) { - return -EINVAL; - } -- g_config_params.num_weakup = (uint16_t)ret; -+ g_config_params.num_wakeup = (uint16_t)ret; - - return 0; - } -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index a8f5ea0..9096797 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -66,7 +66,7 @@ struct cfg_params { - uint8_t numa_bind; - uint16_t num_cpu; - uint16_t cpus[CFG_MAX_CPUS]; -- uint16_t num_weakup; -+ uint16_t num_wakeup; - uint16_t weakup[CFG_MAX_CPUS]; - uint8_t num_ports; - uint16_t ports[CFG_MAX_PORTS]; -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index 0f46e77..eb996f1 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -16,7 +16,7 @@ kni_switch=0 - low_power_mode=0 - - num_cpus="2" --num_weakup="3" -+num_wakeup="3" - - numa_bind=1 - --- -1.8.3.1 - diff --git a/0021-fix-pasre-numacpulist.patch b/0021-fix-pasre-numacpulist.patch deleted file mode 100644 index cd8b469..0000000 --- a/0021-fix-pasre-numacpulist.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ce951a907f5634e8502d28fb66ae79a3a3c82689 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 11 Mar 2022 21:19:19 +0800 -Subject: [PATCH 21/34] fix pasre numacpulist - ---- - src/lstack/core/lstack_cfg.c | 19 ++++++++----------- - 1 file changed, 8 insertions(+), 11 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index e5a92ca..058a392 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -323,25 +323,22 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu - - static int32_t stack_idle_cpuset(struct protocol_stack *stack, cpu_set_t *exclude) - { -- int32_t cpunum; - uint32_t cpulist[CPUS_RANGE_NUM]; - -- cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_RANGE_NUM); -- if (cpunum <= 0 || cpunum % 2 != 0) { // 2 : even -+ int32_t cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_RANGE_NUM); -+ if (cpunum <= 0 ) { - LSTACK_LOG(ERR, LSTACK, "numa_to_cpusnum failed\n"); - return -1; - } - - CPU_ZERO(&stack->idle_cpuset); -- for (uint32_t n = 0; n < cpunum; n += 2) { // 2 : even -- for (uint32_t i = cpulist[n]; i <= cpulist[n + 1]; i++) { -- /* skip stack cpu */ -- if (CPU_ISSET(i, exclude)) { -- continue; -- } -- -- CPU_SET(i, &stack->idle_cpuset); -+ for (int32_t i = 0; i < cpunum; i++) { -+ /* skip stack cpu */ -+ if (CPU_ISSET(cpulist[i], exclude)) { -+ continue; - } -+ -+ CPU_SET(cpulist[i], &stack->idle_cpuset); - } - - return 0; --- -1.8.3.1 - diff --git a/0022-fix-get-data-error.patch b/0022-fix-get-data-error.patch deleted file mode 100644 index 1f24208..0000000 --- a/0022-fix-get-data-error.patch +++ /dev/null @@ -1,267 +0,0 @@ -From c064bea759414419d7fcae6c31455e517a9556f9 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 15:19:53 +0800 -Subject: [PATCH 22/34] fix get data error - ---- - src/common/gazelle_dfx_msg.h | 2 +- - src/lstack/api/lstack_epoll.c | 10 ++++------ - src/lstack/core/lstack_dpdk.c | 8 +++----- - src/lstack/core/lstack_lwip.c | 15 ++++++++------- - src/lstack/core/lstack_stack_stat.c | 1 - - src/lstack/core/lstack_thread_rpc.c | 8 -------- - src/lstack/include/lstack_protocol_stack.h | 1 - - src/lstack/netif/lstack_ethdev.c | 4 ++-- - src/ltran/ltran_dfx.c | 7 +++---- - 9 files changed, 21 insertions(+), 35 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 41cbefa..3956c33 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -86,10 +86,10 @@ struct gazelle_stat_pkts { - uint64_t accept_events; - uint64_t read_null; - uint64_t recv_empty; -- uint64_t event_null; - uint64_t remove_event; - uint64_t send_self_rpc; - uint64_t call_null; -+ uint64_t arp_copy_fail; - }; - - /* same as define in lwip/stats.h - struct stats_mib2 */ -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index b12ce58..885ec45 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -78,17 +78,16 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - sock = sock->shadowed_sock; - } - -- /* sock not in monitoring */ -- if (!sock->weakup) { -+ if ((event & sock->epoll_events) == 0) { - return; - } -+ sock->events |= event & sock->epoll_events; - -- if ((event & sock->epoll_events) == 0) { -+ /* sock not in monitoring */ -+ if (!sock->weakup) { - return; - } - -- sock->events |= event & sock->epoll_events; -- - if (report_events(sock, event)) { - sock->have_event = true; - weakup_enqueue(sock->stack->weakup_ring, sock); -@@ -286,7 +285,6 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - while (event_num < events_cnt) { - int32_t ret = rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock); - if (ret != 0) { -- get_protocol_stack_group()->event_null++; - break; - } - sock->have_event = false; -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index b8320db..fb0e988 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -167,14 +167,12 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ, -- stack->queue_id); -+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, 0, stack->queue_id); - if (stack->rx_pktmbuf_pool == NULL) { - return -1; - } - -- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ, -- stack->queue_id); -+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, 0, stack->queue_id); - if (stack->tx_pktmbuf_pool == NULL) { - return -1; - } -@@ -557,7 +555,7 @@ int32_t dpdk_init_lstack_kni(void) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- stack_group->kni_pktmbuf_pool = create_pktmbuf_mempool("kni_mbuf", KNI_NB_MBUF, KNI_MBUF_CACHE_SZ, 0); -+ stack_group->kni_pktmbuf_pool = create_pktmbuf_mempool("kni_mbuf", KNI_NB_MBUF, 0, 0); - if (stack_group->kni_pktmbuf_pool == NULL) { - return -1; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 1fc8446..1a9d9b9 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -175,7 +175,6 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - - int32_t ret = alloc_mbufs(pool, mbufs, num); - if (ret != 0) { -- get_protocol_stack()->stats.tx_allocmbuf_fail++; - return ret; - } - -@@ -289,7 +288,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - } - - copy_len = (len - send_len > pbuf->len) ? pbuf->len : (len - send_len); -- pbuf_take(pbuf, buf + send_len, copy_len); -+ pbuf_take(pbuf, (char *)buf + send_len, copy_len); - pbuf->tot_len = pbuf->len = copy_len; - - ret = rte_ring_sp_enqueue(sock->send_ring, pbuf); -@@ -331,13 +330,13 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - - uint32_t free_count = rte_ring_free_count(sock->recv_ring); - uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -- -+ uint32_t read_max = LWIP_MIN(free_count, data_count); - struct pbuf *pbuf = NULL; -- uint32_t read_count = LWIP_MIN(free_count, data_count); -+ uint32_t read_count = 0; - ssize_t recv_len = 0; - int32_t ret; - -- for (uint32_t i = 0; i < read_count; i++) { -+ for (uint32_t i = 0; i < read_max; i++) { - err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbuf, apiflags); - if (err != ERR_OK) { - if (recv_len > 0) { -@@ -356,6 +355,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - sock->stack->stats.read_lwip_drop++; - break; - } -+ read_count++; - } - - recv_len += pbuf->len; -@@ -364,7 +364,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN; - } - -- if (data_count > free_count) { -+ if (data_count > read_count) { - add_recv_list(sock->conn->socket); - } - -@@ -481,6 +481,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; -+ sock->recv_lastdata = NULL; - } else { - ret = rte_ring_sc_dequeue(sock->recv_ring, (void **)&pbuf); - if (ret != 0) { -@@ -490,7 +491,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - - copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : (u16_t)recv_left; -- pbuf_copy_partial(pbuf, buf + recvd, copy_len, 0); -+ pbuf_copy_partial(pbuf, (char *)buf + recvd, copy_len, 0); - - recvd += copy_len; - recv_left -= copy_len; -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 0bd1c6c..41fe9bf 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -105,7 +105,6 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - lstack_get_low_power_info(&dfx->low_power_info); - memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; -- dfx->data.pkts.event_null = stack_group->event_null; - dfx->data.pkts.weakup_ring_cnt = rte_ring_count(stack->weakup_ring); - dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring); - dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack); -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index b4d57d3..8af1077 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -80,15 +80,11 @@ void poll_rpc_msg(struct protocol_stack *stack) - struct rpc_msg *msg = NULL; - - num = 0; -- lockless_queue_node *first_node = NULL; - while (num++ < HANDLE_RPC_MSG_MAX) { - lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue); - if (node == NULL) { - return; - } -- if (first_node == NULL) { -- first_node = node; -- } - - msg = container_of(node, struct rpc_msg, queue_node); - -@@ -105,10 +101,6 @@ void poll_rpc_msg(struct protocol_stack *stack) - } else { - rpc_msg_free(stack->rpc_pool, msg); - } -- -- if (first_node == node) { -- break; -- } - } - } - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 1020e83..f289465 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -72,7 +72,6 @@ struct protocol_stack_group { - /* dfx stats */ - bool latency_start; - uint64_t call_alloc_fail; -- uint64_t event_null; - }; - - long get_stack_tid(void); -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 796a46d..026f545 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -97,8 +97,8 @@ int32_t eth_dev_poll(void) - } - - if (get_protocol_stack_group()->latency_start) { -- uint64_t time_stamp = get_current_time(); -- time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); -+ uint64_t time_stamp = get_current_time(); -+ time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); - } - - for (uint32_t i = 0; i < nr_pkts; i++) { -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 4b46ac9..5b3a95c 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -390,7 +390,7 @@ static void gazelle_print_ltran_start_latency(void *buf, const struct gazelle_st - static void gazelle_print_ltran_stat_latency(void *buf, const struct gazelle_stat_msg_request *req_msg) - { - struct in_addr *ip_addr = (struct in_addr *)buf; -- struct gazelle_stat_lstack_total *stat = (struct gazelle_stat_lstack_total *)(buf + sizeof(*ip_addr)); -+ struct gazelle_stat_lstack_total *stat = (struct gazelle_stat_lstack_total *)((char *)buf + sizeof(*ip_addr)); - uint64_t total_rx = 0; - double total_latency = 0; - uint64_t max = 0; -@@ -574,9 +574,8 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null); - printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); -- printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null); -- printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event); -- printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); -+ printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event); -+ printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); - } - --- -1.8.3.1 - diff --git a/0023-delete-numa-bind-param.patch b/0023-delete-numa-bind-param.patch deleted file mode 100644 index fd1e145..0000000 --- a/0023-delete-numa-bind-param.patch +++ /dev/null @@ -1,197 +0,0 @@ -From efd5bfb1a4a070217a0ff174d32500130b629d0a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 15:35:20 +0800 -Subject: [PATCH 23/34] delete numa bind param - ---- - src/common/gazelle_dfx_msg.h | 1 - - src/lstack/api/lstack_epoll.c | 11 ++++------- - src/lstack/core/lstack_cfg.c | 19 ------------------- - src/lstack/core/lstack_lwip.c | 1 - - src/lstack/core/lstack_protocol_stack.c | 4 ---- - src/lstack/core/lstack_thread_rpc.c | 8 +++----- - src/lstack/include/lstack_cfg.h | 1 - - src/lstack/lstack.conf | 2 -- - src/ltran/ltran_dfx.c | 5 ++--- - 9 files changed, 9 insertions(+), 43 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 3956c33..cea4200 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -85,7 +85,6 @@ struct gazelle_stat_pkts { - uint64_t write_events; - uint64_t accept_events; - uint64_t read_null; -- uint64_t recv_empty; - uint64_t remove_event; - uint64_t send_self_rpc; - uint64_t call_null; -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 885ec45..bcbb35e 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -83,16 +83,13 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - } - sock->events |= event & sock->epoll_events; - -- /* sock not in monitoring */ -- if (!sock->weakup) { -+ if (!sock->weakup || !report_events(sock, event)) { - return; - } - -- if (report_events(sock, event)) { -- sock->have_event = true; -- weakup_enqueue(sock->stack->weakup_ring, sock); -- sock->stack->stats.weakup_events++; -- } -+ sock->have_event = true; -+ weakup_enqueue(sock->stack->weakup_ring, sock); -+ sock->stack->stats.weakup_events++; - } - - static void raise_pending_events(struct lwip_sock *sock) -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 058a392..fcc1c0b 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -53,7 +53,6 @@ static int32_t parse_weakup_cpu_number(void); - static int32_t parse_mask_addr(void); - static int32_t parse_devices(void); - static int32_t parse_dpdk_args(void); --static int32_t parse_numa_bind(void); - static int32_t parse_gateway_addr(void); - static int32_t parse_kni_switch(void); - -@@ -71,7 +70,6 @@ static struct config_vector_t g_config_tbl[] = { - { "dpdk_args", parse_dpdk_args }, - { "num_cpus", parse_stack_cpu_number }, - { "num_wakeup", parse_weakup_cpu_number }, -- { "numa_bind", parse_numa_bind }, - { "low_power_mode", parse_low_power_mode }, - { "kni_switch", parse_kni_switch }, - { NULL, NULL } -@@ -714,23 +712,6 @@ static int32_t parse_weakup_cpu_number(void) - return 0; - } - --static int32_t parse_numa_bind(void) --{ -- const config_setting_t *numa_bind = NULL; -- -- numa_bind = config_lookup(&g_config, "numa_bind"); -- if (numa_bind == NULL) { -- g_config_params.numa_bind = 1; -- return 0; -- } -- g_config_params.numa_bind = (uint8_t)config_setting_get_bool(numa_bind); -- if (g_config_params.numa_bind != 0 && g_config_params.numa_bind != 1) { -- return -EINVAL; -- } -- -- return 0; --} -- - static int32_t parse_use_ltran(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 1a9d9b9..b157517 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -485,7 +485,6 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } else { - ret = rte_ring_sc_dequeue(sock->recv_ring, (void **)&pbuf); - if (ret != 0) { -- sock->stack->stats.recv_empty++; - break; - } - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index db8a20a..c88f902 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -46,10 +46,6 @@ int32_t bind_to_stack_numa(int32_t stack_id) - struct protocol_stack *stack = get_protocol_stack_group()->stacks[stack_id]; - pthread_t tid = pthread_self(); - -- if (get_global_cfg_params()->numa_bind == 0) { -- return 0; -- } -- - if (last_stack_id == stack_id) { - return 0; - } -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 8af1077..b3665a7 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -414,12 +414,9 @@ static void stack_send(struct rpc_msg *msg) - } - - msg->result = write_lwip_data(sock, fd, flags); -- if (msg->result < 0 || rte_ring_count(sock->send_ring) == 0) { -- msg->self_release = 0; -- sock->have_rpc_send = false; -- } -+ sock->have_rpc_send = false; - -- if (rte_ring_count(sock->send_ring)) { -+ if (msg->result >= 0 && rte_ring_count(sock->send_ring)) { - sock->have_rpc_send = true; - sock->stack->stats.send_self_rpc++; - msg->self_release = 1; -@@ -443,6 +440,7 @@ ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - msg->args[MSG_ARG_1].size = len; - msg->args[MSG_ARG_2].i = flags; - -+ msg->self_release = 0; - rpc_call(&stack->rpc_queue, msg); - - return 0; -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 9096797..1a59c6c 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -63,7 +63,6 @@ struct cfg_params { - ip4_addr_t netmask; - ip4_addr_t gateway_addr; - struct rte_ether_addr ethdev; -- uint8_t numa_bind; - uint16_t num_cpu; - uint16_t cpus[CFG_MAX_CPUS]; - uint16_t num_wakeup; -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index eb996f1..fdca602 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -18,8 +18,6 @@ low_power_mode=0 - num_cpus="2" - num_wakeup="3" - --numa_bind=1 -- - host_addr="192.168.1.10" - mask_addr="255.255.255.0" - gateway_addr="192.168.1.1" -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 5b3a95c..451f527 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -572,10 +572,9 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events); - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null); -- printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty); -- printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); -+ printf("call_alloc_fail: %-12"PRIu64" \n", lstack_stat->data.pkts.call_alloc_fail); - printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event); -- printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc); -+ printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); - } - --- -1.8.3.1 - diff --git a/0024-refactor-event.patch b/0024-refactor-event.patch deleted file mode 100644 index c6f85f5..0000000 --- a/0024-refactor-event.patch +++ /dev/null @@ -1,806 +0,0 @@ -From fadeb43a653ab5da503b7030b60b4e063f0b3aef Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Sun, 13 Mar 2022 22:57:44 +0800 -Subject: [PATCH 24/34] refactor event - ---- - src/common/gazelle_dfx_msg.h | 10 +++- - src/lstack/api/lstack_epoll.c | 73 +++++++++++++++++--------- - src/lstack/core/lstack_control_plane.c | 13 +++++ - src/lstack/core/lstack_lwip.c | 76 ++++++++++++++++++++------- - src/lstack/core/lstack_protocol_stack.c | 36 ++++++++++--- - src/lstack/core/lstack_stack_stat.c | 4 ++ - src/lstack/core/lstack_thread_rpc.c | 42 +++++++++++++++ - src/lstack/include/lstack_lwip.h | 3 ++ - src/lstack/include/lstack_protocol_stack.h | 2 + - src/lstack/include/lstack_thread_rpc.h | 3 ++ - src/lstack/include/lstack_weakup.h | 84 +++++++++++++++++++++--------- - src/ltran/ltran_dfx.c | 36 ++++++++----- - 12 files changed, 290 insertions(+), 92 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index cea4200..ae20436 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -64,10 +64,12 @@ struct gazelle_stat_pkts { - uint64_t rx_drop; - uint64_t rx_allocmbuf_fail; - uint64_t tx_allocmbuf_fail; -- uint16_t weakup_ring_cnt; - uint64_t call_msg_cnt; -+ uint16_t weakup_ring_cnt; - uint16_t conn_num; - uint16_t send_idle_ring_cnt; -+ uint64_t event_list; -+ uint64_t wakeup_list; - uint64_t read_lwip_drop; - uint64_t read_lwip_cnt; - uint64_t write_lwip_drop; -@@ -89,6 +91,10 @@ struct gazelle_stat_pkts { - uint64_t send_self_rpc; - uint64_t call_null; - uint64_t arp_copy_fail; -+ uint64_t epoll_pending; -+ uint64_t epoll_pending_call; -+ uint64_t epoll_self_call; -+ uint64_t epoll_self_event; - }; - - /* same as define in lwip/stats.h - struct stats_mib2 */ -@@ -162,6 +168,8 @@ struct gazelle_stat_lstack_conn_info { - uint32_t send_ring_cnt; - uint32_t recv_ring_cnt; - uint32_t tcp_sub_state; -+ uint32_t event_ring_cnt; -+ uint32_t self_ring_cnt; - }; - - struct gazelle_stat_lstack_conn { -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index bcbb35e..a686ddb 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -87,19 +87,27 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - return; - } - -- sock->have_event = true; -- weakup_enqueue(sock->stack->weakup_ring, sock); -- sock->stack->stats.weakup_events++; -+ if (weakup_enqueue(sock->stack->weakup_ring, sock)) { -+ if (list_is_empty(&sock->event_list)) { -+ list_add_node(&sock->stack->event_list, &sock->event_list); -+ } -+ } else { -+ sock->have_event = true; -+ sock->stack->stats.weakup_events++; -+ } - } - - static void raise_pending_events(struct lwip_sock *sock) - { -- if (!sock->conn) { -+ struct weakup_poll *wakeup = sock->weakup; -+ struct protocol_stack *stack = sock->stack; -+ struct netconn *conn = sock->conn; -+ if (wakeup == NULL || stack == NULL || conn == NULL) { - return; - } - - struct lwip_sock *attach_sock = NULL; -- if (sock->attach_fd > 0 && sock->attach_fd != sock->conn->socket) { -+ if (sock->attach_fd > 0 && sock->attach_fd != conn->socket) { - attach_sock = get_socket_by_fd(sock->attach_fd); - if (attach_sock == NULL) { - return; -@@ -108,7 +116,10 @@ static void raise_pending_events(struct lwip_sock *sock) - attach_sock = sock; - } - -- struct netconn *conn = attach_sock->conn; -+ conn = attach_sock->conn; -+ if (conn == NULL) { -+ return; -+ } - struct tcp_pcb *tcp = conn->pcb.tcp; - if ((tcp == NULL) || (tcp->state < ESTABLISHED)) { - return; -@@ -132,10 +143,17 @@ static void raise_pending_events(struct lwip_sock *sock) - event |= POLLERR | POLLIN; - } - -- if (event != 0) { -- sock->events |= event; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -+ if (event == 0) { -+ return; -+ } -+ sock->events |= event; -+ if (rte_ring_mp_enqueue(wakeup->event_ring, (void *)sock) == 0 || -+ rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { -+ sem_post(&wakeup->event_sem); -+ stack->stats.epoll_pending++; -+ } else { -+ rpc_call_addevent(stack, sock); -+ stack->stats.epoll_pending_call++; - } - } - -@@ -168,6 +186,12 @@ int32_t lstack_epoll_create(int32_t size) - GAZELLE_RETURN(ENOMEM); - } - -+ weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, fd); -+ if (weakup->self_ring == NULL) { -+ posix_api->close_fn(fd); -+ GAZELLE_RETURN(ENOMEM); -+ } -+ - sock->weakup = weakup; - - return fd; -@@ -247,11 +271,6 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st - - static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock) - { -- /* close sock */ -- if (sock->stack == NULL) { -- return true; -- } -- - /* remove duplicate event */ - for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) { - if (sock_list[i] == sock) { -@@ -267,29 +286,26 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - struct epoll_event *events = (struct epoll_event *)out; - struct pollfd *fds = (struct pollfd *)out; - -- uint32_t events_cnt = rte_ring_count(weakup->event_ring); -- if (events_cnt == 0) { -- return 0; -- } - - if (etype == TYPE_EPOLL) { - maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents); - } -- events_cnt = LWIP_MIN(events_cnt, maxevents); - int32_t event_num = 0; - struct lwip_sock *sock = NULL; - -- while (event_num < events_cnt) { -- int32_t ret = rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock); -- if (ret != 0) { -+ while (event_num < maxevents) { -+ if (rte_ring_sc_dequeue(weakup->self_ring, (void **)&sock) && -+ rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock)) { - break; - } -+ /* close sock */ -+ if (sock->stack == NULL) { -+ return true; -+ } - sock->have_event = false; - - if (remove_event(etype, weakup->sock_list, event_num, sock)) { -- if (sock->stack) { -- sock->stack->stats.remove_event++; -- } -+ sock->stack->stats.remove_event++; - continue; - } - -@@ -390,6 +406,11 @@ static int32_t poll_init(struct pollfd *fds, nfds_t nfds, struct weakup_poll *we - if (weakup->event_ring == NULL) { - GAZELLE_RETURN(ENOMEM); - } -+ -+ weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, rte_gettid()); -+ if (weakup->self_ring == NULL) { -+ GAZELLE_RETURN(ENOMEM); -+ } - } - - for (uint32_t i = 0; i < nfds; i++) { -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index a7e084d..c782d51 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -38,6 +38,7 @@ - #define RECONNECT_TO_LTRAN_DELAY (1) - #define GAZELLE_BADFD (-1) - #define GAZELLE_LISTEN_BACKLOG 5 -+#define GAZELLE_10MS (10000) - - static int32_t g_data_fd = -1; - static volatile bool g_register_state = true; -@@ -701,6 +702,12 @@ void control_server_thread(void *arg) - int32_t num, connfd; - struct epoll_event evt_array; - while (1) { -+ /* wait init finish */ -+ if (posix_api->is_chld) { -+ usleep(GAZELLE_10MS); -+ continue; -+ } -+ - num = posix_api->epoll_wait_fn(epfd, &evt_array, 1, -1); - if (num <= 0) { - continue; -@@ -741,6 +748,12 @@ void control_client_thread(void *arg) - } - - while (1) { -+ /* wait init finish */ -+ if (posix_api->is_chld) { -+ usleep(GAZELLE_10MS); -+ continue; -+ } -+ - if (sockfd < 0) { - set_register_state(false); - sockfd = client_reg_proc_reconnect(epfd); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index b157517..d55f1e6 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -110,6 +110,8 @@ void gazelle_init_sock(int32_t fd) - init_list_node(&sock->recv_list); - init_list_node(&sock->attach_list); - init_list_node(&sock->listen_list); -+ init_list_node(&sock->event_list); -+ init_list_node(&sock->wakeup_list); - } - - void gazelle_clean_sock(int32_t fd) -@@ -126,6 +128,8 @@ void gazelle_clean_sock(int32_t fd) - list_del_node_init(&sock->recv_list); - list_del_node_init(&sock->attach_list); - list_del_node_init(&sock->listen_list); -+ list_del_node_init(&sock->event_list); -+ list_del_node_init(&sock->wakeup_list); - } - - void gazelle_free_pbuf(struct pbuf *pbuf) -@@ -266,6 +270,30 @@ ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags) - return (send_ret < 0) ? send_ret : send_len; - } - -+void add_self_event(struct lwip_sock *sock, uint32_t events) -+{ -+ struct weakup_poll *wakeup = sock->weakup; -+ struct protocol_stack *stack = sock->stack; -+ if (wakeup == NULL || stack == NULL) { -+ return; -+ } -+ -+ sock->events |= events; -+ -+ if (sock->have_event) { -+ return; -+ } -+ -+ if (rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { -+ sock->have_event = true; -+ sem_post(&sock->weakup->event_sem); -+ stack->stats.epoll_self_event++; -+ } else { -+ rpc_call_addevent(stack, sock); -+ stack->stats.epoll_self_call++; -+ } -+} -+ - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - { - uint32_t free_count = rte_ring_free_count(sock->send_ring); -@@ -303,14 +331,10 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - send_pkt++; - } - -- if (!sock->have_event && (sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLOUT; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) { -+ add_self_event(sock, EPOLLOUT); - sock->stack->stats.write_events++; -- } -- if (!NETCONN_IS_DATAOUT(sock)) { -+ } else { - sock->events &= ~EPOLLOUT; - } - -@@ -507,14 +531,10 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -- if (!sock->have_event && (sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) { -- sock->have_event = true; -- sock->events |= EPOLLIN; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -+ if ((sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) { -+ add_self_event(sock, EPOLLIN); - sock->stack->stats.read_events++; -- } -- if (!NETCONN_IS_DATAIN(sock)) { -+ } else { - sock->events &= ~EPOLLIN; - } - -@@ -577,9 +597,14 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring); - - struct lwip_sock *sock = get_socket(netconn->socket); -- if (sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { -+ if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { - conn->recv_ring_cnt = rte_ring_count(sock->recv_ring); - conn->send_ring_cnt = rte_ring_count(sock->send_ring); -+ struct weakup_poll *weakup = sock->weakup; -+ if (weakup) { -+ conn->event_ring_cnt = rte_ring_count(weakup->event_ring); -+ conn->self_ring_cnt = rte_ring_count(weakup->self_ring); -+ } - } - } - } -@@ -696,10 +721,8 @@ void get_lwip_connnum(struct rpc_msg *msg) - msg->result = conn_num; - } - --void stack_recvlist_count(struct rpc_msg *msg) -+static uint32_t get_list_count(struct list_node *list) - { -- struct protocol_stack *stack = get_protocol_stack(); -- struct list_node *list = &(stack->recv_list); - struct list_node *node, *temp; - uint32_t count = 0; - -@@ -707,5 +730,20 @@ void stack_recvlist_count(struct rpc_msg *msg) - count++; - } - -- msg->result = count; -+ return count; -+} -+ -+void stack_wakeuplist_count(struct rpc_msg *msg) -+{ -+ msg->result = get_list_count(get_protocol_stack()->wakeup_list); -+} -+ -+void stack_eventlist_count(struct rpc_msg *msg) -+{ -+ msg->result = get_list_count(&get_protocol_stack()->event_list); -+} -+ -+void stack_recvlist_count(struct rpc_msg *msg) -+{ -+ msg->result = get_list_count(&get_protocol_stack()->recv_list); - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index c88f902..45649fe 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -193,6 +193,7 @@ int32_t init_protocol_stack(void) - - init_list_node(&stack->recv_list); - init_list_node(&stack->listen_list); -+ init_list_node(&stack->event_list); - - stack_group->stacks[i] = stack; - } -@@ -261,8 +262,14 @@ static void* gazelle_weakup_thread(void *arg) - thread_affinity_init(lcore_id); - LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - -+ struct list_node wakeup_list; -+ init_list_node(&wakeup_list); -+ stack->wakeup_list = &wakeup_list; -+ - for (;;) { -- weakup_thread(stack->weakup_ring); -+ wakeup_list_sock(&wakeup_list); -+ -+ weakup_thread(stack->weakup_ring, &wakeup_list); - } - - return NULL; -@@ -307,6 +314,24 @@ static void stack_thread_init(struct protocol_stack *stack) - LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); - } - -+static void report_stack_event(struct protocol_stack *stack) -+{ -+ struct list_node *list = &(stack->event_list); -+ struct list_node *node, *temp; -+ struct lwip_sock *sock; -+ -+ list_for_each_safe(node, temp, list) { -+ sock = container_of(node, struct lwip_sock, event_list); -+ -+ if (weakup_enqueue(stack->weakup_ring, sock) == 0) { -+ list_del_node_init(&sock->event_list); -+ stack->stats.weakup_events++; -+ } else { -+ break; -+ } -+ } -+} -+ - static void* gazelle_stack_thread(void *arg) - { - struct protocol_stack *stack = (struct protocol_stack *)arg; -@@ -321,6 +346,8 @@ static void* gazelle_stack_thread(void *arg) - read_recv_list(); - - sys_timer_run(); -+ -+ report_stack_event(stack); - } - - return NULL; -@@ -737,11 +764,8 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - } - - struct lwip_sock *sock = get_socket(head_fd); -- if (!sock->have_event && have_accept_event(head_fd)) { -- sock->have_event = true; -- sock->events |= EPOLLIN; -- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -- sem_post(&sock->weakup->event_sem); -+ if (have_accept_event(head_fd)) { -+ add_self_event(sock, EPOLLIN); - sock->stack->stats.accept_events++; - } - -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 41fe9bf..b7b94e2 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -109,6 +109,10 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring); - dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack); - dfx->data.pkts.recv_list = rpc_call_recvlistcnt(stack); -+ dfx->data.pkts.event_list = rpc_call_eventlistcnt(stack); -+ if (stack->wakeup_list) { -+ dfx->data.pkts.wakeup_list = rpc_call_eventlistcnt(stack); -+ } - dfx->data.pkts.conn_num = stack->conn_num; - } - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index b3665a7..2fb24b4 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -177,6 +177,26 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); - } - -+int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_wakeuplist_count); -+ if (msg == NULL) { -+ return -1; -+ } -+ -+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+} -+ -+int32_t rpc_call_eventlistcnt(struct protocol_stack *stack) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_eventlist_count); -+ if (msg == NULL) { -+ return -1; -+ } -+ -+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+} -+ - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count); -@@ -187,6 +207,28 @@ int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); - } - -+void add_epoll_event(struct netconn *conn, uint32_t event); -+static void rpc_add_event(struct rpc_msg *msg) -+{ -+ struct lwip_sock *sock = (struct lwip_sock *)msg->args[MSG_ARG_0].p; -+ if (sock->conn) { -+ add_epoll_event(sock->conn, sock->events); -+ } -+} -+ -+void rpc_call_addevent(struct protocol_stack *stack, void *sock) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_add_event); -+ if (msg == NULL) { -+ return; -+ } -+ -+ msg->args[MSG_ARG_0].p = sock; -+ -+ msg->self_release = 0; -+ rpc_call(&stack->rpc_queue, msg); -+} -+ - static void rpc_replenish_idlembuf(struct rpc_msg *msg) - { - struct protocol_stack *stack = get_protocol_stack(); -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 581b9fe..87442cd 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -33,6 +33,8 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags); - void read_recv_list(void); - void add_recv_list(int32_t fd); -+void stack_eventlist_count(struct rpc_msg *msg); -+void stack_wakeuplist_count(struct rpc_msg *msg); - void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); -@@ -42,5 +44,6 @@ void gazelle_free_pbuf(struct pbuf *pbuf); - ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags); - ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags); - ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags); -+void add_self_event(struct lwip_sock *sock, uint32_t events); - - #endif -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index f289465..dd7633b 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -51,6 +51,8 @@ struct protocol_stack { - - struct list_node recv_list; - struct list_node listen_list; -+ struct list_node event_list; -+ struct list_node *wakeup_list; - - struct gazelle_stat_pkts stats; - struct gazelle_stack_latency latency; -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 1365234..cffb273 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -50,9 +50,12 @@ struct rpc_msg { - struct protocol_stack; - void poll_rpc_msg(struct protocol_stack *stack); - void rpc_call_replenish_idlembuf(struct protocol_stack *stack); -+void rpc_call_addevent(struct protocol_stack *stack, void *sock); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack); -+int32_t rpc_call_eventlistcnt(struct protocol_stack *stack); -+int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack); - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn); - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn); - int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint32_t max_conn); -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -index f334a0f..8f7fca2 100644 ---- a/src/lstack/include/lstack_weakup.h -+++ b/src/lstack/include/lstack_weakup.h -@@ -22,55 +22,93 @@ struct weakup_poll { - sem_t event_sem; - struct lwip_sock *sock_list[EPOLL_MAX_EVENTS]; - struct rte_ring *event_ring; -+ struct rte_ring *self_ring; - }; - - #define WEAKUP_MAX (32) - --static inline __attribute__((always_inline)) void weakup_attach_sock(struct lwip_sock *sock) -+static inline void wakeup_list_sock(struct list_node *wakeup_list) - { -- struct list_node *list = &(sock->attach_list); - struct list_node *node, *temp; -- struct lwip_sock *attach_sock; -- int32_t ret; - -- list_for_each_safe(node, temp, list) { -- attach_sock = container_of(node, struct lwip_sock, attach_list); -- if (attach_sock->weakup == NULL) { -+ list_for_each_safe(node, temp, wakeup_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, wakeup_list); -+ -+ struct weakup_poll *weakup = sock->weakup; -+ struct protocol_stack *stack = sock->stack; -+ if (weakup == NULL || stack == NULL) { - continue; - } - -- ret = rte_ring_mp_enqueue(attach_sock->weakup->event_ring, (void *)attach_sock); -+ int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); - if (ret == 0) { -- sem_post(&attach_sock->weakup->event_sem); -- attach_sock->stack->stats.lwip_events++; -+ list_del_node_init(&sock->event_list); -+ sem_post(&weakup->event_sem); -+ stack->stats.lwip_events++; -+ } else { -+ break; - } - } - } - --static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring *weakup_ring) -+static inline int32_t weakup_attach_sock(struct list_node *attach_list) -+{ -+ struct list_node *node, *temp; -+ int32_t wakeuped = -1; -+ -+ list_for_each_safe(node, temp, attach_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, attach_list); -+ -+ struct weakup_poll *weakup = sock->weakup; -+ struct protocol_stack *stack = sock->stack; -+ if (weakup == NULL || stack == NULL) { -+ continue; -+ } -+ -+ int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); -+ if (ret == 0) { -+ sem_post(&weakup->event_sem); -+ stack->stats.lwip_events++; -+ wakeuped = 0; -+ } -+ } -+ -+ return wakeuped; -+} -+ -+static inline void weakup_thread(struct rte_ring *weakup_ring, struct list_node *wakeup_list) - { - struct lwip_sock *sock; -- int32_t ret; - - for (uint32_t i = 0; i < WEAKUP_MAX; ++i) { -- ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock); -+ int32_t ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock); - if (ret != 0) { - break; - } - -- ret = rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock); -+ struct weakup_poll *weakup = sock->weakup; -+ struct protocol_stack *stack = sock->stack; -+ if (weakup == NULL || stack == NULL) { -+ continue; -+ } -+ -+ ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); - if (ret == 0) { -- sem_post(&sock->weakup->event_sem); -- sock->stack->stats.lwip_events++; -+ sem_post(&weakup->event_sem); -+ stack->stats.lwip_events++; - } - - /* listen notice attach sock */ -+ int32_t wakeuped = -1; - if (!list_is_empty(&sock->attach_list)) { -- weakup_attach_sock(sock); -+ wakeuped = weakup_attach_sock(&sock->attach_list); - } - -- /* event_ring of attach sock may have idle elem */ -- if (ret != 0) { -+ /* notice any epoll enough */ -+ if (ret != 0 && wakeuped != 0) { -+ if (list_is_empty(&sock->wakeup_list)) { -+ list_add_node(wakeup_list, &sock->wakeup_list); -+ } - break; - } - } -@@ -79,13 +117,7 @@ static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring - static inline __attribute__((always_inline)) - int weakup_enqueue(struct rte_ring *weakup_ring, struct lwip_sock *sock) - { -- int ret = rte_ring_sp_enqueue(weakup_ring, (void *)sock); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %d, failed\n", gettid()); -- return -1; -- } -- -- return 0; -+ return rte_ring_sp_enqueue(weakup_ring, (void *)sock); - } - - #endif -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 451f527..66d6053 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -567,14 +567,20 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("weakup_events: %-14"PRIu64" ", lstack_stat->data.pkts.weakup_events); - printf("lwip_events: %-16"PRIu64" ", lstack_stat->data.pkts.lwip_events); - printf("app_events: %-17"PRIu64"\n", lstack_stat->data.pkts.app_events); -+ printf("epoll_pending: %-14"PRIu64" ", lstack_stat->data.pkts.epoll_pending); -+ printf("epoll_self_event: %-11"PRIu64" ", lstack_stat->data.pkts.epoll_self_event); -+ printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event); - printf("read_events: %-16"PRIu64" ", lstack_stat->data.pkts.read_events); - printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events); - printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events); -- printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null); -- printf("call_alloc_fail: %-12"PRIu64" \n", lstack_stat->data.pkts.call_alloc_fail); -- printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event); -+ printf("wakeup_list: %-16"PRIu64" ", lstack_stat->data.pkts.wakeup_list); -+ printf("event_list: %-17"PRIu64" \n", lstack_stat->data.pkts.event_list); - printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); -+ printf("epoll_pending_call: %-9"PRIu64" ", lstack_stat->data.pkts.epoll_pending_call); -+ printf("epoll_self_call: %-12"PRIu64" \n", lstack_stat->data.pkts.epoll_self_call); -+ printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); -+ printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); - } - -@@ -866,8 +872,7 @@ static void gazelle_print_lstack_stat_snmp(void *buf, const struct gazelle_stat_ - - static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_msg_request *req_msg) - { -- int32_t ret; -- uint32_t i, unread_pkts; -+ uint32_t i; - struct in_addr rip; - struct in_addr lip; - char str_ip[GAZELLE_SUBNET_LENGTH_MAX] = {0}; -@@ -878,30 +883,33 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - printf("Active Internet connections (servers and established)\n"); - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); -- printf("No. Proto recv_cnt recv_ring in_send send_ring Local Address" -+ printf("No. Proto recv_cnt recv_ring in_send send_ring event self_event Local Address" - " Foreign Address State\n"); -- unread_pkts = 0; -+ uint32_t unread_pkts = 0; -+ uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { - struct gazelle_stat_lstack_conn_info *conn_info = &conn->conn_list[i]; - - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt, -- conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, -- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, inet_ntop(AF_INET, &rip, -- str_rip, sizeof(str_rip)), conn_info->r_port, tcp_state_to_str(conn_info->tcp_sub_state)); -+ printf("%-6utcp %-10u%-11u%-9u%-11u%-7u%-12u%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt, -+ conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->event_ring_cnt, -+ conn_info->self_ring_cnt, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, -+ tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-41u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-60u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, conn_info->state); - } - unread_pkts += conn_info->recv_ring_cnt; -+ unsend_pkts += conn_info->send_ring_cnt; - } - if (conn->conn_num > 0) { -- printf("Total unread pkts: %u \n", unread_pkts); -+ printf("Total unread pkts:%u unsend pkts:%u\n", unread_pkts, unsend_pkts); - } - - if (i < conn->total_conn_num) { -@@ -912,7 +920,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - if (stat->eof != 0) { - break; - } -- ret = dfx_stat_read_from_ltran(buf, sizeof(struct gazelle_stack_dfx_data), req_msg->stat_mode); -+ int32_t ret = dfx_stat_read_from_ltran(buf, sizeof(struct gazelle_stack_dfx_data), req_msg->stat_mode); - if (ret != GAZELLE_OK) { - return; - } --- -1.8.3.1 - diff --git a/0025-fix-event-miss.patch b/0025-fix-event-miss.patch deleted file mode 100644 index 015fb32..0000000 --- a/0025-fix-event-miss.patch +++ /dev/null @@ -1,420 +0,0 @@ -From aa422a75961523de411ec849fd1f4e45da4477ac Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Mon, 14 Mar 2022 20:32:39 +0800 -Subject: [PATCH 25/34] fix event miss - ---- - src/common/gazelle_dfx_msg.h | 1 + - src/lstack/api/lstack_epoll.c | 6 ++-- - src/lstack/core/lstack_lwip.c | 54 ++++++++++++++++++++++++++---- - src/lstack/core/lstack_protocol_stack.c | 31 +++++++++++++++++ - src/lstack/core/lstack_stack_stat.c | 27 +++++++++++---- - src/lstack/core/lstack_thread_rpc.c | 38 ++++++--------------- - src/lstack/include/lstack_lwip.h | 2 ++ - src/lstack/include/lstack_protocol_stack.h | 1 + - src/lstack/include/lstack_thread_rpc.h | 1 + - src/lstack/include/lstack_weakup.h | 2 +- - src/ltran/ltran_dfx.c | 3 +- - 11 files changed, 120 insertions(+), 46 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index ae20436..de669f5 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -95,6 +95,7 @@ struct gazelle_stat_pkts { - uint64_t epoll_pending_call; - uint64_t epoll_self_call; - uint64_t epoll_self_event; -+ uint64_t send_list; - }; - - /* same as define in lwip/stats.h - struct stats_mib2 */ -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index a686ddb..cf072b0 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -61,7 +61,7 @@ static inline bool report_events(struct lwip_sock *sock, uint32_t event) - return true; - } - -- if (sock->have_event) { -+ if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) { - return false; - } - -@@ -92,7 +92,7 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - list_add_node(&sock->stack->event_list, &sock->event_list); - } - } else { -- sock->have_event = true; -+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); - sock->stack->stats.weakup_events++; - } - } -@@ -302,7 +302,7 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - if (sock->stack == NULL) { - return true; - } -- sock->have_event = false; -+ __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE); - - if (remove_event(etype, weakup->sock_list, event_num, sock)) { - sock->stack->stats.remove_event++; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d55f1e6..d35a217 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -112,6 +112,7 @@ void gazelle_init_sock(int32_t fd) - init_list_node(&sock->listen_list); - init_list_node(&sock->event_list); - init_list_node(&sock->wakeup_list); -+ init_list_node(&sock->send_list); - } - - void gazelle_clean_sock(int32_t fd) -@@ -130,6 +131,7 @@ void gazelle_clean_sock(int32_t fd) - list_del_node_init(&sock->listen_list); - list_del_node_init(&sock->event_list); - list_del_node_init(&sock->wakeup_list); -+ list_del_node_init(&sock->send_list); - } - - void gazelle_free_pbuf(struct pbuf *pbuf) -@@ -280,12 +282,12 @@ void add_self_event(struct lwip_sock *sock, uint32_t events) - - sock->events |= events; - -- if (sock->have_event) { -+ if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) { - return; - } - - if (rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { -- sock->have_event = true; -+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); - sem_post(&sock->weakup->event_sem); - stack->stats.epoll_self_event++; - } else { -@@ -346,6 +348,34 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - return send_len; - } - -+void stack_send(struct rpc_msg *msg) -+{ -+ int32_t fd = msg->args[MSG_ARG_0].i; -+ int32_t flags = msg->args[MSG_ARG_2].i; -+ -+ struct protocol_stack *stack = get_protocol_stack(); -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ msg->result = -1; -+ return; -+ } -+ -+ msg->result = write_lwip_data(sock, fd, flags); -+ __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); -+ -+ if (msg->result >= 0 && rte_ring_count(sock->send_ring)) { -+ if (list_is_empty(&sock->send_list)) { -+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -+ list_add_node(&stack->send_list, &sock->send_list); -+ sock->stack->stats.send_self_rpc++; -+ } -+ } -+ -+ if (rte_ring_free_count(sock->send_ring)) { -+ add_epoll_event(sock->conn, EPOLLOUT); -+ } -+} -+ - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - { - if (sock->conn->recvmbox == NULL) { -@@ -448,14 +478,19 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - GAZELLE_RETURN(EINVAL); - } - -+ sock->send_flags = flags; - ssize_t send = write_stack_data(sock, buf, len); -- if (send < 0 || sock->have_rpc_send) { -- return send; -+ -+ ssize_t ret = 0; -+ if (!__atomic_load_n(&sock->have_rpc_send, __ATOMIC_ACQUIRE)) { -+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -+ ret = rpc_call_send(fd, buf, len, flags); - } - -- sock->have_rpc_send = true; -- ssize_t ret = rpc_call_send(fd, buf, len, flags); -- return (ret < 0) ? ret : send; -+ if (send <= 0 || ret < 0) { -+ GAZELLE_RETURN(EAGAIN); -+ } -+ return send; - } - - ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) -@@ -743,6 +778,11 @@ void stack_eventlist_count(struct rpc_msg *msg) - msg->result = get_list_count(&get_protocol_stack()->event_list); - } - -+void stack_sendlist_count(struct rpc_msg *msg) -+{ -+ msg->result = get_list_count(&get_protocol_stack()->send_list); -+} -+ - void stack_recvlist_count(struct rpc_msg *msg) - { - msg->result = get_list_count(&get_protocol_stack()->recv_list); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 45649fe..4ba851a 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -194,6 +194,7 @@ int32_t init_protocol_stack(void) - init_list_node(&stack->recv_list); - init_list_node(&stack->listen_list); - init_list_node(&stack->event_list); -+ init_list_node(&stack->send_list); - - stack_group->stacks[i] = stack; - } -@@ -324,6 +325,7 @@ static void report_stack_event(struct protocol_stack *stack) - sock = container_of(node, struct lwip_sock, event_list); - - if (weakup_enqueue(stack->weakup_ring, sock) == 0) { -+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); - list_del_node_init(&sock->event_list); - stack->stats.weakup_events++; - } else { -@@ -332,6 +334,33 @@ static void report_stack_event(struct protocol_stack *stack) - } - } - -+static void send_stack_list(struct protocol_stack *stack) -+{ -+ struct list_node *list = &(stack->send_list); -+ struct list_node *node, *temp; -+ struct lwip_sock *sock; -+ -+ list_for_each_safe(node, temp, list) { -+ sock = container_of(node, struct lwip_sock, send_list); -+ -+ if (sock->conn == NULL) { -+ continue; -+ } -+ -+ ssize_t ret = write_lwip_data(sock, sock->conn->socket, sock->send_flags); -+ __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); -+ if (ret >= 0 && rte_ring_count(sock->send_ring)) { -+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -+ } else { -+ list_del_node_init(&sock->send_list); -+ } -+ -+ if (rte_ring_free_count(sock->send_ring)) { -+ add_epoll_event(sock->conn, EPOLLOUT); -+ } -+ } -+} -+ - static void* gazelle_stack_thread(void *arg) - { - struct protocol_stack *stack = (struct protocol_stack *)arg; -@@ -348,6 +377,8 @@ static void* gazelle_stack_thread(void *arg) - sys_timer_run(); - - report_stack_event(stack); -+ -+ send_stack_list(stack); - } - - return NULL; -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index b7b94e2..9a8fd08 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -107,11 +107,22 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; - dfx->data.pkts.weakup_ring_cnt = rte_ring_count(stack->weakup_ring); - dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring); -- dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack); -- dfx->data.pkts.recv_list = rpc_call_recvlistcnt(stack); -- dfx->data.pkts.event_list = rpc_call_eventlistcnt(stack); -+ -+ int32_t rpc_call_result = rpc_call_msgcnt(stack); -+ dfx->data.pkts.call_msg_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ -+ rpc_call_result = rpc_call_recvlistcnt(stack); -+ dfx->data.pkts.recv_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ -+ rpc_call_result = rpc_call_eventlistcnt(stack); -+ dfx->data.pkts.event_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ -+ rpc_call_result = rpc_call_sendlistcnt(stack); -+ dfx->data.pkts.send_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ - if (stack->wakeup_list) { -- dfx->data.pkts.wakeup_list = rpc_call_eventlistcnt(stack); -+ rpc_call_result = rpc_call_eventlistcnt(stack); -+ dfx->data.pkts.wakeup_list = (rpc_call_result < 0) ? 0 : rpc_call_result; - } - dfx->data.pkts.conn_num = stack->conn_num; - } -@@ -119,6 +130,8 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protocol_stack *stack, - enum GAZELLE_STAT_MODE stat_mode) - { -+ int32_t rpc_call_result; -+ - switch (stat_mode) { - case GAZELLE_STAT_LSTACK_SHOW: - case GAZELLE_STAT_LSTACK_SHOW_RATE: -@@ -129,8 +142,10 @@ static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protoc - sizeof(stack->lwip_stats->mib2)); - break; - case GAZELLE_STAT_LSTACK_SHOW_CONN: -- dfx->data.conn.conn_num = rpc_call_conntable(stack, dfx->data.conn.conn_list, GAZELLE_LSTACK_MAX_CONN); -- dfx->data.conn.total_conn_num = rpc_call_connnum(stack); -+ rpc_call_result = rpc_call_conntable(stack, dfx->data.conn.conn_list, GAZELLE_LSTACK_MAX_CONN); -+ dfx->data.conn.conn_num = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ rpc_call_result = rpc_call_connnum(stack); -+ dfx->data.conn.total_conn_num = (rpc_call_result < 0) ? 0 : rpc_call_result; - break; - case GAZELLE_STAT_LSTACK_SHOW_LATENCY: - memcpy_s(&dfx->data.latency, sizeof(dfx->data.latency), &stack->latency, sizeof(stack->latency)); -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 2fb24b4..c95f2c0 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -197,6 +197,16 @@ int32_t rpc_call_eventlistcnt(struct protocol_stack *stack) - return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); - } - -+int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendlist_count); -+ if (msg == NULL) { -+ return -1; -+ } -+ -+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+} -+ - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count); -@@ -442,34 +452,6 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); - } - --static void stack_send(struct rpc_msg *msg) --{ -- int32_t fd = msg->args[MSG_ARG_0].i; -- int32_t flags = msg->args[MSG_ARG_2].i; -- -- struct protocol_stack *stack = get_protocol_stack(); -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- msg->result = -1; -- msg->self_release = 0; -- return; -- } -- -- msg->result = write_lwip_data(sock, fd, flags); -- sock->have_rpc_send = false; -- -- if (msg->result >= 0 && rte_ring_count(sock->send_ring)) { -- sock->have_rpc_send = true; -- sock->stack->stats.send_self_rpc++; -- msg->self_release = 1; -- rpc_call(&stack->rpc_queue, msg); -- } -- -- if (rte_ring_free_count(sock->send_ring)) { -- add_epoll_event(sock->conn, EPOLLOUT); -- } --} -- - ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 87442cd..cfd454d 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -33,11 +33,13 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags); - void read_recv_list(void); - void add_recv_list(int32_t fd); -+void stack_sendlist_count(struct rpc_msg *msg); - void stack_eventlist_count(struct rpc_msg *msg); - void stack_wakeuplist_count(struct rpc_msg *msg); - void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); -+void stack_send(struct rpc_msg *msg); - void stack_replenish_send_idlembuf(struct protocol_stack *stack); - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); - void gazelle_free_pbuf(struct pbuf *pbuf); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index dd7633b..5b95dc9 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -52,6 +52,7 @@ struct protocol_stack { - struct list_node recv_list; - struct list_node listen_list; - struct list_node event_list; -+ struct list_node send_list; - struct list_node *wakeup_list; - - struct gazelle_stat_pkts stats; -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index cffb273..76ba36a 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -55,6 +55,7 @@ int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack); - int32_t rpc_call_eventlistcnt(struct protocol_stack *stack); -+int32_t rpc_call_sendlistcnt(struct protocol_stack *stack); - int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack); - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn); - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn); -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -index 8f7fca2..4f6321e 100644 ---- a/src/lstack/include/lstack_weakup.h -+++ b/src/lstack/include/lstack_weakup.h -@@ -16,7 +16,7 @@ - #include - #include "lstack_dpdk.h" - --#define EPOLL_MAX_EVENTS 256 -+#define EPOLL_MAX_EVENTS 512 - - struct weakup_poll { - sem_t event_sem; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 66d6053..a575c33 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -582,6 +582,7 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); -+ printf("send_list: %-18"PRIu64" \n", lstack_stat->data.pkts.send_list); - } - - static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat, -@@ -884,7 +885,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); - printf("No. Proto recv_cnt recv_ring in_send send_ring event self_event Local Address" -- " Foreign Address State\n"); -+ " Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { --- -1.8.3.1 - diff --git a/0026-get-fin-notice-app.patch b/0026-get-fin-notice-app.patch deleted file mode 100644 index 781db98..0000000 --- a/0026-get-fin-notice-app.patch +++ /dev/null @@ -1,45 +0,0 @@ -From a066142dfb38235ea46307e4b1d3395dcc2694a7 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Tue, 15 Mar 2022 17:47:42 +0800 -Subject: [PATCH 26/34] get fin notice app - ---- - src/lstack/api/lstack_epoll.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index cf072b0..1f0aea8 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -73,6 +73,11 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - /* conn sock nerver null, because lwip call this func */ - struct lwip_sock *sock = get_socket(conn->socket); - -+ /* close_wait event should be (EPOLLRDHUP | EPOLLIN), but lwip is EPOLLERR */ -+ if (event == EPOLLERR && conn->pcb.tcp && conn->pcb.tcp->state == CLOSE_WAIT) { -+ event = EPOLLRDHUP | EPOLLIN | EPOLLERR; -+ } -+ - /* shadow_fd event notice listen_fd */ - if (sock->shadowed_sock) { - sock = sock->shadowed_sock; -@@ -286,7 +291,6 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - struct epoll_event *events = (struct epoll_event *)out; - struct pollfd *fds = (struct pollfd *)out; - -- - if (etype == TYPE_EPOLL) { - maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents); - } -@@ -300,7 +304,7 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - } - /* close sock */ - if (sock->stack == NULL) { -- return true; -+ continue; - } - __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE); - --- -1.8.3.1 - diff --git a/0027-fix-parse-config.patch b/0027-fix-parse-config.patch deleted file mode 100644 index 6613bd3..0000000 --- a/0027-fix-parse-config.patch +++ /dev/null @@ -1,832 +0,0 @@ -From d8c362e9a1af1c5ef50fbcda24fd4a127d591311 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 16:26:28 +0800 -Subject: [PATCH 27/34] fix parse config - ---- - src/common/dir.mk | 2 +- - src/common/dpdk_common.h | 4 +- - src/common/gazelle_parse_config.c | 64 ++++++++++++++++++++++++++++ - src/common/gazelle_parse_config.h | 20 +++++++++ - src/common/gazelle_reg_msg.h | 2 +- - src/lstack/Makefile | 2 +- - src/lstack/core/lstack_cfg.c | 67 +++++------------------------- - src/lstack/include/lstack_cfg.h | 14 +++---- - src/lstack/include/lstack_compiler.h | 6 +-- - src/lstack/include/lstack_control_plane.h | 6 +-- - src/lstack/include/lstack_dpdk.h | 8 ++-- - src/lstack/include/lstack_ethdev.h | 6 +-- - src/lstack/include/lstack_lockless_queue.h | 4 +- - src/lstack/include/lstack_lwip.h | 4 +- - src/lstack/include/lstack_protocol_stack.h | 4 +- - src/lstack/include/lstack_signal.h | 6 +-- - src/lstack/include/lstack_thread_rpc.h | 4 +- - src/lstack/include/lstack_vdev.h | 6 +-- - src/lstack/include/lstack_weakup.h | 4 +- - src/lstack/include/posix/lstack_epoll.h | 6 +-- - src/lstack/include/posix/lstack_fcntl.h | 6 +-- - src/lstack/include/posix/lstack_fork.h | 6 +-- - src/lstack/include/posix/lstack_socket.h | 6 +-- - src/lstack/include/posix/lstack_unistd.h | 6 +-- - src/lstack/netif/lstack_ethdev.c | 12 ------ - src/ltran/CMakeLists.txt | 3 +- - src/ltran/ltran_base.h | 2 +- - src/ltran/ltran_config.c | 5 ++- - src/ltran/ltran_ethdev.h | 2 +- - src/ltran/ltran_param.c | 33 +++------------ - 30 files changed, 162 insertions(+), 158 deletions(-) - create mode 100644 src/common/gazelle_parse_config.c - create mode 100644 src/common/gazelle_parse_config.h - -diff --git a/src/common/dir.mk b/src/common/dir.mk -index b61edf3..68a2b72 100644 ---- a/src/common/dir.mk -+++ b/src/common/dir.mk -@@ -8,6 +8,6 @@ - # PURPOSE. - # See the Mulan PSL v2 for more details. - --SRC = dpdk_common.c -+SRC = dpdk_common.c gazelle_parse_config.c - $(eval $(call register_dir, ../common, $(SRC))) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index e9cacc3..6137bcb 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_DPDK_COMMON_H__ --#define __LIBOS_DPDK_COMMON_H__ -+#ifndef __GAZELLE_DPDK_COMMON_H__ -+#define __GAZELLE_DPDK_COMMON_H__ - - #include - -diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c -new file mode 100644 -index 0000000..bbc8362 ---- /dev/null -+++ b/src/common/gazelle_parse_config.c -@@ -0,0 +1,64 @@ -+/* -+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+#include -+#include -+#include -+ -+#include "gazelle_parse_config.h" -+ -+static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size) -+{ -+ const char *delim = "-"; -+ char *elem = NULL; -+ char *next_token = NULL; -+ char *endptr = NULL; -+ int32_t cnt = 0; -+ int64_t start, end; -+ -+ elem = strtok_s(args, delim, &next_token); -+ start = strtol(elem, &endptr, 0); -+ -+ elem = strtok_s(NULL, delim, &next_token); -+ if (elem == NULL) { -+ /* just a single data */ -+ array[cnt++] = start; -+ return cnt; -+ } -+ end = strtol(elem, &endptr, 0); -+ -+ for (int64_t i = start; i <= end && cnt < array_size; i++) { -+ if (i < 0 || i > UINT_MAX) { -+ break; -+ } -+ array[cnt++] = i; -+ } -+ -+ return cnt; -+} -+ -+/* support '-' and ',' */ -+int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size) -+{ -+ const char *delim = ","; -+ char *elem = NULL; -+ char *next_token = NULL; -+ int32_t cnt = 0; -+ -+ elem = strtok_s(args, delim, &next_token); -+ while (elem != NULL && cnt < array_size) { -+ cnt += parse_str_data(elem, &array[cnt], array_size - cnt); -+ elem = strtok_s(NULL, delim, &next_token); -+ } -+ -+ return cnt; -+} -diff --git a/src/common/gazelle_parse_config.h b/src/common/gazelle_parse_config.h -new file mode 100644 -index 0000000..0f86d80 ---- /dev/null -+++ b/src/common/gazelle_parse_config.h -@@ -0,0 +1,20 @@ -+/* -+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+#ifndef __GAZELLE_PARSE_CONFIG__ -+#define __GAZELLE_PARSE_CONFIG__ -+ -+#include -+ -+int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); -+ -+#endif -\ No newline at end of file -diff --git a/src/common/gazelle_reg_msg.h b/src/common/gazelle_reg_msg.h -index fa8f319..ff846fd 100644 ---- a/src/common/gazelle_reg_msg.h -+++ b/src/common/gazelle_reg_msg.h -@@ -18,7 +18,7 @@ - #include - #include - --#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/libos_client.sock" -+#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock" - #define GAZELLE_RUN_DIR "/var/run/gazelle/" - #define GAZELLE_FILE_PERMISSION 0700 - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index 7a888de..8fc2435 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -27,7 +27,7 @@ INC = -I$(LSTACK_DIR)/include \ - -I$(LSTACK_DIR)/../common \ - -I$(LWIP_INCLUDE_FILE) - --CFLAGS = $(OPTIMIZATION) -fno-strict-aliasing $(INC) -DUSE_LIBOS_MEM -+CFLAGS = $(OPTIMIZATION) -fno-strict-aliasing $(INC) - - ifeq ($(GAZELLE_COVERAGE_ENABLE), 1) - LDFLAGS += -fprofile-arcs -ftest-coverage -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index fcc1c0b..ca25b58 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -33,6 +33,7 @@ - #include "gazelle_reg_msg.h" - #include "lstack_log.h" - #include "gazelle_base_func.h" -+#include "gazelle_parse_config.h" - #include "lstack_protocol_stack.h" - - #define DEFAULT_CONF_FILE "/etc/gazelle/lstack.conf" -@@ -189,35 +190,6 @@ static int32_t parse_devices(void) - return ret; - } - --static int32_t turn_str_to_array(char *args, uint16_t *array, int32_t size) --{ -- int32_t val; -- uint16_t cnt = 0; -- const char *delim = ","; -- char *elem = NULL; -- char *next_token = NULL; -- -- memset_s(array, sizeof(*array) * size, 0, sizeof(*array) * size); -- -- elem = strtok_s((char *)args, delim, &next_token); -- while (elem != NULL) { -- if (cnt >= size) { -- return -1; -- } -- -- val = atoi(elem); -- if (val < 0) { -- return -1; -- } -- array[cnt] = (uint16_t)val; -- cnt++; -- -- elem = strtok_s(NULL, delim, &next_token); -- } -- -- return cnt; --} -- - static int32_t get_param_idx(int32_t argc, char **argv, const char *param) - { - int32_t ret; -@@ -241,9 +213,6 @@ static int32_t parse_stack_cpu_number(void) - const config_setting_t *num_cpus = NULL; - const char *args = NULL; - -- int32_t ret; -- int32_t idx; -- - num_cpus = config_lookup(&g_config, "num_cpus"); - if (num_cpus == NULL) { - return -EINVAL; -@@ -254,7 +223,7 @@ static int32_t parse_stack_cpu_number(void) - return -EINVAL; - } - -- idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); -+ int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); - if (idx < 0) { - g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); - g_config_params.dpdk_argc++; -@@ -263,11 +232,14 @@ static int32_t parse_stack_cpu_number(void) - g_config_params.dpdk_argc++; - } - -- ret = turn_str_to_array((char *)args, g_config_params.cpus, CFG_MAX_CPUS); -- if (ret <= 0) { -+ char *tmp_arg = strdup(args); -+ int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.cpus, CFG_MAX_CPUS); -+ free(tmp_arg); -+ if (cnt <= 0 || cnt > CFG_MAX_CPUS) { - return -EINVAL; - } -- g_config_params.num_cpu = (uint16_t)ret; -+ -+ g_config_params.num_cpu = cnt; - get_protocol_stack_group()->stack_num = g_config_params.num_cpu; - - return 0; -@@ -368,7 +340,6 @@ int32_t init_stack_numa_cpuset(void) - return 0; - } - --#ifdef USE_LIBOS_MEM - static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vaddr) - { - uint64_t viraddr; -@@ -389,14 +360,8 @@ static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vadd - static int32_t gazelle_parse_socket_mem(const char *arg, struct secondary_attach_arg *sec_attach_arg) - { - size_t mem_size = 0; -- uint8_t count = 0; - char socket_mem[PATH_MAX]; - -- const char *delim = ","; -- char *mem_elem = NULL; -- char *end = NULL; -- char *next_token = NULL; -- - errno = 0; - - if ((arg == NULL) || (sec_attach_arg == NULL)) { -@@ -408,22 +373,13 @@ static int32_t gazelle_parse_socket_mem(const char *arg, struct secondary_attach - return -1; - } - -- mem_elem = strtok_s(socket_mem, delim, &next_token); -- while (mem_elem != NULL) { -- if (count >= GAZELLE_MAX_NUMA_NODES) { -- return -1; -- } -- sec_attach_arg->socket_per_size[count] = strtoull(mem_elem, &end, BASE_DEC_SCALE); -+ int32_t count = separate_str_to_array(socket_mem, sec_attach_arg->socket_per_size, GAZELLE_MAX_NUMA_NODES); -+ for (uint32_t i = 0; i < count; i++) { - mem_size += sec_attach_arg->socket_per_size[count]; -- if ((errno != 0) || end == NULL || (*end != '\0')) -- return -1; -- -- mem_elem = strtok_s(NULL, delim, &next_token); -- count++; - } - mem_size *= 1024LL; - mem_size *= 1024LL; -- if (mem_size > (UINT64_MAX / 1024LL / 1024LL)) { -+ if (mem_size > (UINT64_MAX / 1024LL / 1024LL) || count > UINT8_MAX) { - return -1; - } - sec_attach_arg->socket_num = count; -@@ -663,7 +619,6 @@ free_dpdk_args: - GAZELLE_FREE(g_config_params.dpdk_argv); - return -EINVAL; - } --#endif - - static int32_t parse_low_power_mode(void) - { -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 1a59c6c..48b7e44 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_NET_CFG_H --#define LIBOS_NET_CFG_H -+#ifndef _GAZELLE_NET_CFG_H_ -+#define _GAZELLE_NET_CFG_H_ - #include - - #include -@@ -53,7 +53,7 @@ - struct secondary_attach_arg { - uint8_t socket_num; - uint64_t socket_size; -- uint64_t socket_per_size[GAZELLE_MAX_NUMA_NODES]; -+ uint32_t socket_per_size[GAZELLE_MAX_NUMA_NODES]; - uintptr_t base_virtaddr; - char file_prefix[PATH_MAX]; - }; -@@ -64,9 +64,9 @@ struct cfg_params { - ip4_addr_t gateway_addr; - struct rte_ether_addr ethdev; - uint16_t num_cpu; -- uint16_t cpus[CFG_MAX_CPUS]; -+ uint32_t cpus[CFG_MAX_CPUS]; - uint16_t num_wakeup; -- uint16_t weakup[CFG_MAX_CPUS]; -+ uint32_t weakup[CFG_MAX_CPUS]; - uint8_t num_ports; - uint16_t ports[CFG_MAX_PORTS]; - char log_file[PATH_MAX]; -@@ -78,9 +78,7 @@ struct cfg_params { - bool kni_switch; - int dpdk_argc; - char **dpdk_argv; --#ifdef USE_LIBOS_MEM - struct secondary_attach_arg sec_attach_arg; --#endif - }; - - struct cfg_params *get_global_cfg_params(void); -@@ -98,4 +96,4 @@ int gazelle_copy_param(const char *param, bool is_double, - int match_host_addr(uint32_t ipv4); - int32_t init_stack_numa_cpuset(void); - --#endif /* LIBOS_NET_CFG_H */ -+#endif /* GAZELLE_NET_CFG_H */ -diff --git a/src/lstack/include/lstack_compiler.h b/src/lstack/include/lstack_compiler.h -index 1db27ae..c4880a5 100644 ---- a/src/lstack/include/lstack_compiler.h -+++ b/src/lstack/include/lstack_compiler.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_COMPILER_H --#define LIBOS_COMPILER_H -+#ifndef _GAZELLE_COMPILER_H_ -+#define _GAZELLE_COMPILER_H_ - - #ifdef __GNUC__ - -@@ -43,4 +43,4 @@ - #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) - #endif - --#endif /* LIBOS_COMPILER_H */ -+#endif /* GAZELLE_COMPILER_H */ -diff --git a/src/lstack/include/lstack_control_plane.h b/src/lstack/include/lstack_control_plane.h -index 7c267e2..0af891a 100644 ---- a/src/lstack/include/lstack_control_plane.h -+++ b/src/lstack/include/lstack_control_plane.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_CONTROL_PLANE_H --#define LIBOS_CONTROL_PLANE_H -+#ifndef _GAZELLE_CONTROL_PLANE_H_ -+#define _GAZELLE_CONTROL_PLANE_H_ - - #include "lstack_thread_rpc.h" - -@@ -33,4 +33,4 @@ bool get_register_state(void); - void thread_register_phase1(struct rpc_msg *msg); - void thread_register_phase2(struct rpc_msg *msg); - --#endif /* LIBOS_CONTROL_PLANE_H */ -+#endif /* GAZELLE_CONTROL_PLANE_H */ -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 7b623a7..e76a9a6 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -10,13 +10,11 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_DPDK_H --#define LIBOS_DPDK_H -+#ifndef _GAZELLE_DPDK_H_ -+#define _GAZELLE_DPDK_H_ - --#ifdef USE_LIBOS_MEM - #include - #include --#endif - - #include - #include "lstack_lockless_queue.h" -@@ -70,4 +68,4 @@ int dpdk_ethdev_start(void); - void dpdk_skip_nic_init(void); - int32_t dpdk_init_lstack_kni(void); - --#endif /* LIBOS_DPDK_H */ -+#endif /* GAZELLE_DPDK_H */ -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index 29e0c23..573a413 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_ETHDEV_H__ --#define __LIBOS_ETHDEV_H__ -+#ifndef __GAZELLE_ETHDEV_H__ -+#define __GAZELLE_ETHDEV_H__ - - #include - #include -@@ -34,4 +34,4 @@ int32_t eth_dev_poll(void); - uint32_t eth_get_flow_cnt(void); - void eth_dev_recv(struct rte_mbuf *mbuf); - --#endif /* __LIBOS_ETHDEV_H__ */ -+#endif /* __GAZELLE_ETHDEV_H__ */ -diff --git a/src/lstack/include/lstack_lockless_queue.h b/src/lstack/include/lstack_lockless_queue.h -index e015e93..c70b56a 100644 ---- a/src/lstack/include/lstack_lockless_queue.h -+++ b/src/lstack/include/lstack_lockless_queue.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_LOCKLESS_QUEUE_H__ --#define __LIBOS_LOCKLESS_QUEUE_H__ -+#ifndef __GAZELLE_LOCKLESS_QUEUE_H__ -+#define __GAZELLE_LOCKLESS_QUEUE_H__ - - typedef struct lockless_queue_node { - struct lockless_queue_node *volatile next; -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index cfd454d..285095a 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_LWIP_H__ --#define __LIBOS_LWIP_H__ -+#ifndef __GAZELLE_LWIP_H__ -+#define __GAZELLE_LWIP_H__ - - #include "lstack_thread_rpc.h" - #include "lwipsock.h" -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 5b95dc9..39052e1 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_PROTOCOL_STACK_H__ --#define __LIBOS_PROTOCOL_STACK_H__ -+#ifndef __GAZELLE_PROTOCOL_STACK_H__ -+#define __GAZELLE_PROTOCOL_STACK_H__ - - #include - #include -diff --git a/src/lstack/include/lstack_signal.h b/src/lstack/include/lstack_signal.h -index edc8de5..2541a37 100644 ---- a/src/lstack/include/lstack_signal.h -+++ b/src/lstack/include/lstack_signal.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef _LIBOS_SIGNAL_ --#define _LIBOS_SIGNAL_ -+#ifndef _GAZELLE_SIGNAL_ -+#define _GAZELLE_SIGNAL_ - - void lstack_signal_init(void); --#endif // _LIBOS_SIGNAL_ -+#endif // _GAZELLE_SIGNAL_ -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 76ba36a..20539d9 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_THREAD_RPC_H__ --#define __LIBOS_THREAD_RPC_H__ -+#ifndef __GAZELLE_THREAD_RPC_H__ -+#define __GAZELLE_THREAD_RPC_H__ - - #include - #include -diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h -index 19b97f1..916b1e2 100644 ---- a/src/lstack/include/lstack_vdev.h -+++ b/src/lstack/include/lstack_vdev.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_VDEV_H --#define LIBOS_VDEV_H -+#ifndef _GAZELLE_VDEV_H_ -+#define _GAZELLE_VDEV_H_ - - #include "lstack_ethdev.h" - #include "gazelle_reg_msg.h" -@@ -33,4 +33,4 @@ struct eth_dev_ops; - void vdev_dev_ops_init(struct eth_dev_ops **dev_ops); - int vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple); - --#endif /* LIBOS_VDEV_H */ -+#endif /* _GAZELLE_VDEV_H_ */ -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -index 4f6321e..b051b72 100644 ---- a/src/lstack/include/lstack_weakup.h -+++ b/src/lstack/include/lstack_weakup.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __LIBOS_WEAKUP_THREAD_H__ --#define __LIBOS_WEAKUP_THREAD_H__ -+#ifndef __GAZELLE_WEAKUP_THREAD_H__ -+#define __GAZELLE_WEAKUP_THREAD_H__ - - #include - #include "lstack_dpdk.h" -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index c97978f..2b3cff4 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_EPOLL_H --#define LIBOS_EPOLL_H -+#ifndef _GAZELLE_EPOLL_H_ -+#define _GAZELLE_EPOLL_H_ - - #ifdef __cplusplus - extern "C" { -@@ -26,4 +26,4 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout); - } - #endif - --#endif /* LIBOS_EPOLL_H */ -+#endif /* _GAZELLE_EPOLL_H_ */ -diff --git a/src/lstack/include/posix/lstack_fcntl.h b/src/lstack/include/posix/lstack_fcntl.h -index b3d6797..d1087a6 100644 ---- a/src/lstack/include/posix/lstack_fcntl.h -+++ b/src/lstack/include/posix/lstack_fcntl.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_FCNTL_H --#define LIBOS_FCNTL_H -+#ifndef _GAZELLE_FCNTL_H_ -+#define _GAZELLE_FCNTL_H_ - - #ifdef __cplusplus - extern "C" { -@@ -24,5 +24,5 @@ int lwip_ioctl(int s, int cmd, ...); - } - #endif - --#endif /* LIBOS_FCNTL_H */ -+#endif /* _GAZELLE_FCNTL_H_ */ - -diff --git a/src/lstack/include/posix/lstack_fork.h b/src/lstack/include/posix/lstack_fork.h -index 049903a..939534a 100644 ---- a/src/lstack/include/posix/lstack_fork.h -+++ b/src/lstack/include/posix/lstack_fork.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef _LIBOS_FORK_ --#define _LIBOS_FORK_ -+#ifndef _GAZELLE_FORK_ -+#define _GAZELLE_FORK_ - - pid_t lstack_fork(void); --#endif // _LIBOS_FORK_ -+#endif // _GAZELLE_FORK_ -diff --git a/src/lstack/include/posix/lstack_socket.h b/src/lstack/include/posix/lstack_socket.h -index 6a44d41..776a6ab 100644 ---- a/src/lstack/include/posix/lstack_socket.h -+++ b/src/lstack/include/posix/lstack_socket.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_SOCKET_H --#define LIBOS_SOCKET_H -+#ifndef _GAZELLE_SOCKET_H_ -+#define _GAZELLE_SOCKET_H_ - - #ifdef __cplusplus - extern "C" { -@@ -40,4 +40,4 @@ ssize_t lwip_recv(int s, void *mem, size_t len, int flags); - } - #endif - --#endif /* LIBOS_SOCKET_H */ -+#endif /* _GAZELLE_SOCKET_H_ */ -diff --git a/src/lstack/include/posix/lstack_unistd.h b/src/lstack/include/posix/lstack_unistd.h -index 8c57d3a..cdd46c9 100644 ---- a/src/lstack/include/posix/lstack_unistd.h -+++ b/src/lstack/include/posix/lstack_unistd.h -@@ -10,8 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef LIBOS_UNISTD_H --#define LIBOS_UNISTD_H -+#ifndef _GAZELLE_UNISTD_H_ -+#define _GAZELLE_UNISTD_H_ - - #include "lstack_fork.h" - #ifdef __cplusplus -@@ -24,4 +24,4 @@ int lstack_sigaction(int signum, const struct sigaction *act, struct sigaction * - } - #endif - --#endif /* LIBOS_UNISTD_H */ -+#endif /* _GAZELLE_UNISTD_H_ */ -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 026f545..c428bca 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -10,20 +10,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifdef USE_LIBOS_MEM - #include - #include --#else --/* in dpdk 19.11 there is the following inclusion relationship -- * >> rte_ethdev.h -- * >> rte_eth_ctrl.h -- * >> rte_flow.h -- * >> rte_ip.h -- * >> netinet/ip.h -- * avoid conflicts with netinet/ip.h -- */ --#include --#endif - - #include - #include -diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt -index 8662d7c..c21d88a 100644 ---- a/src/ltran/CMakeLists.txt -+++ b/src/ltran/CMakeLists.txt -@@ -23,7 +23,8 @@ endif($ENV{GAZELLE_COVERAGE_ENABLE}) - - add_executable(ltran main.c ltran_param.c ltran_config.c ltran_ethdev.c ltran_stat.c ltran_errno.c - ltran_monitor.c ltran_instance.c ltran_stack.c ltran_tcp_conn.c ltran_tcp_sock.c -- ltran_forward.c ltran_timer.c ${COMMON_DIR}/gazelle_dfx_msg.c ${COMMON_DIR}/dpdk_common.c) -+ ltran_forward.c ltran_timer.c ${COMMON_DIR}/gazelle_dfx_msg.c ${COMMON_DIR}/dpdk_common.c -+ ${COMMON_DIR}/gazelle_parse_config.c) - - target_include_directories(ltran PRIVATE ${COMMON_DIR} ${PROJECT_SOURCE_DIR}) - target_compile_options(ltran PRIVATE -march=native -fno-strict-aliasing -D__ARM_FEATURE_CRC32=1 -DRTE_MACHINE_CPUFLAG_NEON -diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h -index 0a284bc..4663257 100644 ---- a/src/ltran/ltran_base.h -+++ b/src/ltran/ltran_base.h -@@ -94,6 +94,6 @@ - - #define GAZELLE_INET_ADDRSTRLEN 16 - --#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/libos_cmd.sock" -+#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock" - - #endif /* ifndef __GAZELLE_BASE_H__ */ -diff --git a/src/ltran/ltran_config.c b/src/ltran/ltran_config.c -index 366f89c..d9c1bd7 100644 ---- a/src/ltran/ltran_config.c -+++ b/src/ltran/ltran_config.c -@@ -10,13 +10,14 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_config.h" -- -+#include - #include - #include - #include - #include -+ - #include "ltran_log.h" -+#include "ltran_config.h" - - #define NO_ARGS 0 - #define HAS_ARGS 1 -diff --git a/src/ltran/ltran_ethdev.h b/src/ltran/ltran_ethdev.h -index 2a72704..de7cfbb 100644 ---- a/src/ltran/ltran_ethdev.h -+++ b/src/ltran/ltran_ethdev.h -@@ -23,7 +23,7 @@ struct port_info { - }; - - uint32_t get_bond_num(void); --struct rte_kni* get_libos_kni(void); -+struct rte_kni* get_gazelle_kni(void); - void set_bond_num(const uint32_t bond_num); - struct port_info* get_port_info(void); - uint16_t* get_bond_port(void); -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index 44785bd..aafbeee 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -22,6 +22,7 @@ - #include - - #include "ltran_log.h" -+#include "gazelle_parse_config.h" - #include "gazelle_base_func.h" - - #define HEX_BASE 16 -@@ -310,7 +311,6 @@ static int32_t is_bond_port_prefix_valid(const char *port_str) - - static int32_t parse_bond_ports(const config_t *config, const char *key, struct ltran_config *ltran_config) - { -- const char *delim = ","; - const char *port_mask_str = NULL; - int32_t ret; - -@@ -334,32 +334,11 @@ static int32_t parse_bond_ports(const config_t *config, const char *key, struct - return GAZELLE_ERR; - } - -- char *end = NULL; -- char *tmp = NULL; -- unsigned long one_port_mask; -- char *token = strtok_s(port_str, delim, &tmp); -- while (token != NULL) { -- if (ltran_config->bond.port_num == GAZELLE_MAX_BOND_NUM) { -- free(port_str); -- gazelle_set_errno(GAZELLE_ERANGE); -- return GAZELLE_ERR; -- } -- -- one_port_mask = strtoul(token, &end, HEX_BASE); -- if ((end == NULL) || (*end != '\0')) { -- gazelle_set_errno(GAZELLE_ESTRTOUL); -- free(port_str); -- return GAZELLE_ERR; -- } -- if ((one_port_mask < GAZELLE_BOND_PORT_MASK_MIN) || (one_port_mask > GAZELLE_BOND_PORT_MASK_MAX)) { -- gazelle_set_errno(GAZELLE_ERANGE); -- free(port_str); -- return GAZELLE_ERR; -- } -- -- token = strtok_s(NULL, delim, &tmp); -- ltran_config->bond.portmask[ltran_config->bond.port_num] = (uint32_t)one_port_mask; -- ltran_config->bond.port_num++; -+ ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM); -+ if (ltran_config->bond.port_num >= GAZELLE_MAX_BOND_NUM) { -+ free(port_str); -+ gazelle_set_errno(GAZELLE_ERANGE); -+ return GAZELLE_ERR; - } - - free(port_str); --- -1.8.3.1 - diff --git a/0028-fix-lstack-show-latency.patch b/0028-fix-lstack-show-latency.patch deleted file mode 100644 index 7afb165..0000000 --- a/0028-fix-lstack-show-latency.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 53969ac0be85346d2abd776c66d4ff244c9f5da7 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Mon, 14 Mar 2022 22:41:57 +0800 -Subject: [PATCH 28/34] fix lstack show latency - ---- - src/lstack/core/lstack_init.c | 6 ++++++ - src/lstack/core/lstack_stack_stat.c | 5 +++++ - src/ltran/ltran_dfx.c | 2 -- - 3 files changed, 11 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index df60c4f..17195c8 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -190,6 +190,12 @@ __attribute__((constructor)) void gazelle_network_init(void) - LSTACK_EXIT(1, "pthread_getaffinity_np failed\n"); - } - -+ /* to prevent crash , just ignore SIGPIPE when socket is closed */ -+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno); -+ LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n"); -+ } -+ - /* - * Phase 6: Init control plane and dpdk init */ - pthread_t tid; -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 9a8fd08..1813906 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -190,6 +190,11 @@ int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode) - struct protocol_stack *stack = stack_group->stacks[i]; - get_stack_dfx_data(&dfx, stack, stat_mode); - -+ if (!use_ltran() && -+ (stat_mode == GAZELLE_STAT_LTRAN_START_LATENCY || stat_mode == GAZELLE_STAT_LTRAN_STOP_LATENCY)) { -+ continue; -+ } -+ - dfx.tid = stack->tid; - if (i == stack_group->stack_num - 1) { - dfx.eof = 1; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index a575c33..3baa017 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -1231,8 +1231,6 @@ int32_t main(int32_t argc, char *argv[]) - - if (!g_use_ltran) { - g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data); -- g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data); -- g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_STOP_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data); - ret = check_cmd_support(req_msg, req_msg_num); - if (ret < 0) { - return -1; --- -1.8.3.1 - diff --git a/0029-fix-code-check.patch b/0029-fix-code-check.patch deleted file mode 100644 index 4d2eebd..0000000 --- a/0029-fix-code-check.patch +++ /dev/null @@ -1,217 +0,0 @@ -From ce1cdc5e656596b1b70171481a8ce5d523c0b20f Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 17:30:25 +0800 -Subject: [PATCH 29/34] fix code check - ---- - src/common/dpdk_common.h | 1 - - src/lstack/core/lstack_cfg.c | 30 ++++++------------------------ - src/lstack/core/lstack_dpdk.c | 5 +++-- - src/lstack/core/lstack_lwip.c | 3 +-- - src/lstack/core/lstack_protocol_stack.c | 4 ++-- - src/lstack/netif/lstack_ethdev.c | 4 ++-- - src/lstack/netif/lstack_vdev.c | 2 +- - src/ltran/ltran_dfx.c | 4 ++-- - src/ltran/ltran_forward.c | 1 + - 9 files changed, 18 insertions(+), 36 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 6137bcb..595e85f 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -40,7 +40,6 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf - - uint8_t *dst_data = rte_pktmbuf_mtod(dst, void*); - uint8_t *src_data = rte_pktmbuf_mtod(src, void*); -- - rte_memcpy(dst_data, src_data, data_len); - - // copy private date. -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index ca25b58..53712a8 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -269,25 +269,7 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu - return -1; - } - -- int32_t count = 0; -- char *elem = strtok(strbuf, "-"); -- while (elem && count < num) { -- while (elem && isspace(*elem)) { -- elem++; -- } -- if (elem == NULL) { -- LSTACK_LOG(ERR, LSTACK, "parse %s failed\n", path); -- return -1; -- } -- cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal -- -- if (count % 2 == 0) { // 2 : even -- elem = strtok(NULL, "-"); -- } else { -- elem = strtok(NULL, ","); -- } -- } -- -+ int32_t count = separate_str_to_array(strbuf, cpulist, num); - return count; - } - -@@ -644,8 +626,6 @@ static int32_t parse_weakup_cpu_number(void) - const config_setting_t *cfg_args = NULL; - const char *args = NULL; - -- int32_t ret; -- - g_config_params.num_wakeup = 0; - - cfg_args = config_lookup(&g_config, "num_wakeup"); -@@ -658,11 +638,13 @@ static int32_t parse_weakup_cpu_number(void) - return 0; - } - -- ret = turn_str_to_array((char *)args, g_config_params.weakup, CFG_MAX_CPUS); -- if (ret <= 0) { -+ char *tmp_arg = strdup(args); -+ int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.weakup, CFG_MAX_CPUS); -+ free(tmp_arg); -+ if (cnt <= 0 || cnt > CFG_MAX_CPUS) { - return -EINVAL; - } -- g_config_params.num_wakeup = (uint16_t)ret; -+ g_config_params.num_wakeup = cnt; - - return 0; - } -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index fb0e988..430c6e5 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -223,6 +223,7 @@ int32_t create_shared_ring(struct protocol_stack *stack) - if (stack->send_idle_ring == NULL) { - return -1; - } -+ stack->in_replenish = 0; - - if (use_ltran()) { - stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); -@@ -255,7 +256,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui - while (remain > 0) { - batch = LWIP_MIN(remain, FREE_RX_QUEUE_SZ); - -- ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch); -+ ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %d ret=%d\n", (int32_t)batch, ret); - return -1; -@@ -339,7 +340,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { - #if CHECKSUM_CHECK_IP_HW - rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM; -- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n"); -+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n"); - #endif - } - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d35a217..636840f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -184,7 +184,6 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - return ret; - } - -- - for (uint32_t i = 0; i < num; i++) { - pbuf_custom = mbuf_to_pbuf(mbufs[i]); - pbuf_custom->custom_free_function = gazelle_free_pbuf; -@@ -216,7 +215,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack) - uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring); - - for (uint32_t i = 0; i < replenish_cnt; i++) { -- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM); -+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM); - if (pbuf == NULL) { - break; - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 4ba851a..e297f7e 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -686,8 +686,8 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - if (cur_stack == stack) { - continue; - } -- -- ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); -+ -+ ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); - if (ret != 0) { - return; - } -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index c428bca..9cb9cb0 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -45,7 +45,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - len = (uint16_t)rte_pktmbuf_pkt_len(m); - payload = rte_pktmbuf_mtod(m, void *); - pc = mbuf_to_pbuf(m); -- pc->custom_free_function = gazelle_free_pbuf; -+ pc->custom_free_function = gazelle_free_pbuf; - next = pbuf_alloced_custom(PBUF_RAW, (uint16_t)len, PBUF_RAM, pc, payload, (uint16_t)len); - if (next == NULL) { - stack->stats.rx_allocmbuf_fail++; -@@ -139,7 +139,7 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - stack->stats.tx += sent_pkts; - if (sent_pkts < 1) { - stack->stats.tx_drop++; -- rte_pktmbuf_free(mbuf); -+ rte_pktmbuf_free(mbuf); - return ERR_MEM; - } - -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index a2f89fa..57d3bce 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -47,7 +47,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk - stack->rx_ring_used += rcvd_pkts; - if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) { - uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, DPDK_PKT_BURST_SIZE); -- int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); -+ int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); - if (likely(ret == 0)) { - nr_pkts = rte_ring_en_enqueue_bulk(stack->rx_ring, (void **)free_buf, free_cnt); - stack->rx_ring_used -= nr_pkts; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 3baa017..8db5791 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -111,8 +111,8 @@ static pid_t ltran_process_exist(void) - char line[LINE]; - FILE *cmd = popen("pidof ltran", "r"); - -- if(fgets(line, LINE, cmd) == NULL) { -- return 0; -+ if (fgets(line, LINE, cmd) == NULL) { -+ return 0; - } - - pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE); -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index 9d1188e..b264ad3 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -82,6 +82,7 @@ static __rte_always_inline void flush_rx_mbuf(struct gazelle_stack *stack, struc - calculate_ltran_latency(stack, src); - } - rte_pktmbuf_free(src); -+ src = NULL; - } - - static __rte_always_inline void backup_bufs_enque_rx_ring(struct gazelle_stack *stack) --- -1.8.3.1 - diff --git a/0030-fix-accept-init-sock-faile.patch b/0030-fix-accept-init-sock-faile.patch deleted file mode 100644 index fcadcd5..0000000 --- a/0030-fix-accept-init-sock-faile.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 2da25e25b9553dfc014faaf9a3ebb869454615fd Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Tue, 15 Mar 2022 22:55:09 +0800 -Subject: [PATCH 30/34] fix accept init sock faile - ---- - src/lstack/core/lstack_lwip.c | 23 +++++++++++++++++++++-- - src/lstack/core/lstack_protocol_stack.c | 29 ++++++++++++++++++----------- - src/lstack/include/lstack_lwip.h | 1 + - 3 files changed, 40 insertions(+), 13 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 636840f..9766a87 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -657,19 +657,38 @@ static inline void clone_lwip_socket_opt(struct lwip_sock *dst_sock, struct lwip - dst_sock->conn->flags = src_sock->conn->flags; - } - -+int32_t gazelle_socket(int domain, int type, int protocol) -+{ -+ int32_t fd = lwip_socket(AF_INET, SOCK_STREAM, 0); -+ if (fd < 0) { -+ return fd; -+ } -+ -+ gazelle_init_sock(fd); -+ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL || sock->stack == NULL) { -+ lwip_close(fd); -+ gazelle_clean_sock(fd); -+ posix_api->close_fn(fd); -+ return -1; -+ } -+ -+ return fd; -+} -+ - void create_shadow_fd(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; - struct sockaddr *addr = msg->args[MSG_ARG_1].p; - socklen_t addr_len = msg->args[MSG_ARG_2].socklen; - -- int32_t clone_fd = lwip_socket(AF_INET, SOCK_STREAM, 0); -+ int32_t clone_fd = gazelle_socket(AF_INET, SOCK_STREAM, 0); - if (clone_fd < 0) { - LSTACK_LOG(ERR, LSTACK, "clone socket failed clone_fd=%d errno=%d\n", clone_fd, errno); - msg->result = clone_fd; - return; - } -- gazelle_init_sock(clone_fd); - - struct lwip_sock *sock = get_socket_by_fd(fd); - struct lwip_sock *clone_sock = get_socket_by_fd(clone_fd); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index e297f7e..3193eeb 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -426,14 +426,10 @@ void stack_arp(struct rpc_msg *msg) - - void stack_socket(struct rpc_msg *msg) - { -- int32_t fd = lwip_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); -- msg->result = fd; -- if (fd < 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %d socket failed\n", get_stack_tid(), fd); -- return; -+ msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); -+ if (msg->result < 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); - } -- -- gazelle_init_sock(fd); - } - - static inline bool is_real_close(int32_t fd) -@@ -589,11 +585,22 @@ void stack_accept(struct rpc_msg *msg) - } - fd = sock->attach_fd; - -- msg->result = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (msg->result <= 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, -- fd, msg->result); -+ int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -+ if (accept_fd > 0) { -+ sock = get_socket(accept_fd); -+ if (sock && sock->stack) { -+ msg->result = accept_fd; -+ return; -+ } -+ -+ lwip_close(accept_fd); -+ gazelle_clean_sock(accept_fd); -+ posix_api->close_fn(accept_fd); - } -+ -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %d\n", get_stack_tid(), msg->args[MSG_ARG_0].i, -+ fd, accept_fd); -+ msg->result = -1; - } - - void stack_connect(struct rpc_msg *msg) -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 285095a..ffd3b80 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -26,6 +26,7 @@ - void create_shadow_fd(struct rpc_msg *msg); - void listen_list_add_node(int32_t head_fd, int32_t add_fd); - void gazelle_init_sock(int32_t fd); -+int32_t gazelle_socket(int domain, int type, int protocol); - void gazelle_clean_sock(int32_t fd); - ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags); - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len); --- -1.8.3.1 - diff --git a/0031-fix-reuse-ip-listen-event-don-t-notice.patch b/0031-fix-reuse-ip-listen-event-don-t-notice.patch deleted file mode 100644 index 88ab038..0000000 --- a/0031-fix-reuse-ip-listen-event-don-t-notice.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 40ac9666796bbc0cee5d52acfb14d6cc88a196b2 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 16 Mar 2022 11:02:45 +0800 -Subject: [PATCH 31/34] fix reuse ip listen event don't notice - ---- - src/lstack/api/lstack_epoll.c | 61 +++++++++++++++++++++++-------------------- - 1 file changed, 33 insertions(+), 28 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 1f0aea8..e54d496 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -78,11 +78,6 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - event = EPOLLRDHUP | EPOLLIN | EPOLLERR; - } - -- /* shadow_fd event notice listen_fd */ -- if (sock->shadowed_sock) { -- sock = sock->shadowed_sock; -- } -- - if ((event & sock->epoll_events) == 0) { - return; - } -@@ -111,14 +106,9 @@ static void raise_pending_events(struct lwip_sock *sock) - return; - } - -- struct lwip_sock *attach_sock = NULL; -- if (sock->attach_fd > 0 && sock->attach_fd != conn->socket) { -- attach_sock = get_socket_by_fd(sock->attach_fd); -- if (attach_sock == NULL) { -- return; -- } -- } else { -- attach_sock = sock; -+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket_by_fd(sock->attach_fd) : sock; -+ if (attach_sock == NULL) { -+ return; - } - - conn = attach_sock->conn; -@@ -144,20 +134,20 @@ static void raise_pending_events(struct lwip_sock *sock) - } - } - -- if (sock->errevent > 0) { -+ if (attach_sock->errevent > 0) { - event |= POLLERR | POLLIN; - } - - if (event == 0) { - return; - } -- sock->events |= event; -+ attach_sock->events |= event; - if (rte_ring_mp_enqueue(wakeup->event_ring, (void *)sock) == 0 || - rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { - sem_post(&wakeup->event_sem); - stack->stats.epoll_pending++; - } else { -- rpc_call_addevent(stack, sock); -+ rpc_call_addevent(stack, attach_sock); - stack->stats.epoll_pending_call++; - } - } -@@ -260,13 +250,14 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - return 0; - } - --static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, struct lwip_sock *sock, int32_t event_num) -+static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, int32_t fd, uint32_t events) - { -+ int32_t event_num = 0; - for (uint32_t i = 0; i < maxevents; i++) { - /* fds[i].revents != 0, the events is kernel events */ -- if (fds[i].fd == sock->conn->socket && fds[i].revents == 0) { -- fds[i].revents = sock->events; -- event_num++; -+ if (fds[i].fd == fd && fds[i].revents == 0) { -+ fds[i].revents = events; -+ event_num = 1; - break; - } - } -@@ -274,7 +265,8 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st - return event_num; - } - --static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock) -+static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock, -+ struct lwip_sock *attach_sock) - { - /* remove duplicate event */ - for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) { -@@ -283,7 +275,7 @@ static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int - } - } - -- return !check_event_vaild(sock, sock->events); -+ return !check_event_vaild(attach_sock, attach_sock->events); - } - - static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t maxevents, enum POLL_TYPE etype) -@@ -302,25 +294,38 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m - rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock)) { - break; - } -- /* close sock */ -+ __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE); -+ -+ /* sock->stack == NULL mean close sock */ - if (sock->stack == NULL) { - continue; - } -- __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE); - -- if (remove_event(etype, weakup->sock_list, event_num, sock)) { -+ /* attach listen is empty, all event in attached listen. attached listen attach_fd is self */ -+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket(sock->attach_fd) : sock; -+ if (attach_sock == NULL) { -+ continue; -+ } -+ -+ if (remove_event(etype, weakup->sock_list, event_num, sock, attach_sock)) { - sock->stack->stats.remove_event++; - continue; - } - - if (etype == TYPE_EPOLL) { -- events[event_num].events = sock->events; -+ events[event_num].events = attach_sock->events; - events[event_num].data = sock->ep_data; - weakup->sock_list[event_num] = sock; - event_num++; - } else { -- /* save one event at a time */ -- event_num = save_poll_event(fds, maxevents, sock, event_num); -+ /* shadow_fd event notice listen_fd */ -+ if (attach_sock->shadowed_sock) { -+ attach_sock = attach_sock->shadowed_sock; -+ } -+ -+ if (sock->conn) { -+ event_num += save_poll_event(fds, maxevents, sock->conn->socket, attach_sock->events); -+ } - } - - sock->stack->stats.app_events++; --- -1.8.3.1 - diff --git a/0032-modify-readme-to-add-constraint.patch b/0032-modify-readme-to-add-constraint.patch deleted file mode 100644 index a9d100b..0000000 --- a/0032-modify-readme-to-add-constraint.patch +++ /dev/null @@ -1,24 +0,0 @@ -From cb29e0124945480fc8e017dfd426926ddfebd754 Mon Sep 17 00:00:00 2001 -From: jinag12 -Date: Wed, 16 Mar 2022 11:12:17 +0000 -Subject: [PATCH 32/34] modify readme to add constraint - ---- - README.md | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/README.md b/README.md -index f2a933c..e914b26 100644 ---- a/README.md -+++ b/README.md -@@ -252,6 +252,7 @@ Usage: gazellectl [-h | help] - - 虚拟机网卡不支持多队列。 - - 不使用ltran模式,kni网口只支持本地通讯使用,且需要启动前配置NetworkManager不管理kni网卡 - - 虚拟kni网口的ip及mac地址,需要与lstack配置文件保持一致 -+- gazelle运行过程中,不允许删除运行文件,如果删除,需要重启gazelle - - ## Security risk note - gazelle有如下安全风险,用户需要评估使用场景风险 --- -1.8.3.1 - diff --git a/0033-fix-accept-check-remain-conn.patch b/0033-fix-accept-check-remain-conn.patch deleted file mode 100644 index 39448c3..0000000 --- a/0033-fix-accept-check-remain-conn.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 40531107531c4891defa71f899cbe96d30db9c6e Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Wed, 16 Mar 2022 16:05:46 +0800 -Subject: [PATCH 33/34] fix accept check remain conn - ---- - src/lstack/core/lstack_protocol_stack.c | 27 +++++++++++++-------------- - 1 file changed, 13 insertions(+), 14 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 3193eeb..4a46044 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -577,17 +577,9 @@ void stack_accept(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; - -- /* listen sock attach_fd is self */ -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- msg->result = -1; -- return; -- } -- fd = sock->attach_fd; -- - int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); - if (accept_fd > 0) { -- sock = get_socket(accept_fd); -+ struct lwip_sock *sock = get_socket(accept_fd); - if (sock && sock->stack) { - msg->result = accept_fd; - return; -@@ -773,13 +765,19 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) - /* ergodic the protocol stack thread to find the connection, because all threads are listening */ - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) - { -- struct lwip_sock *min_sock = NULL; -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ errno = EINVAL; -+ return -1; -+ } -+ -+ fd = sock->attach_fd; - int32_t head_fd = fd; -- int32_t min_fd = fd; -- int32_t ret = -1; - -+ struct lwip_sock *min_sock = NULL; -+ int32_t min_fd = fd; - while (fd > 0) { -- struct lwip_sock *sock = get_socket(fd); -+ sock = get_socket(fd); - if (sock == NULL) { - GAZELLE_RETURN(EINVAL); - } -@@ -797,13 +795,14 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - fd = sock->nextfd; - } - -+ int32_t ret = -1; - if (min_sock) { - ret = rpc_call_accept(min_fd, addr, addrlen); - } - -- struct lwip_sock *sock = get_socket(head_fd); - if (have_accept_event(head_fd)) { - add_self_event(sock, EPOLLIN); -+ sock = get_socket(head_fd); - sock->stack->stats.accept_events++; - } - --- -1.8.3.1 - diff --git a/0034-fix-wakeup-list-dead-loop.patch b/0034-fix-wakeup-list-dead-loop.patch deleted file mode 100644 index 6e3d5e5..0000000 --- a/0034-fix-wakeup-list-dead-loop.patch +++ /dev/null @@ -1,59 +0,0 @@ -From e991d6a693af629e466f549cdd322ac11fc80f2e Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Mar 2022 21:40:01 +0800 -Subject: [PATCH 34/34] fix wakeup list dead loop - ---- - src/lstack/core/lstack_lwip.c | 1 - - src/lstack/core/lstack_protocol_stack.c | 3 ++- - src/lstack/include/lstack_weakup.h | 3 ++- - 3 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 9766a87..7bab92f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -130,7 +130,6 @@ void gazelle_clean_sock(int32_t fd) - list_del_node_init(&sock->attach_list); - list_del_node_init(&sock->listen_list); - list_del_node_init(&sock->event_list); -- list_del_node_init(&sock->wakeup_list); - list_del_node_init(&sock->send_list); - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 4a46044..1de546d 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -343,7 +343,8 @@ static void send_stack_list(struct protocol_stack *stack) - list_for_each_safe(node, temp, list) { - sock = container_of(node, struct lwip_sock, send_list); - -- if (sock->conn == NULL) { -+ if (sock->conn == NULL || sock->stack == NULL) { -+ list_del_node_init(&sock->send_list); - continue; - } - -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -index b051b72..77f3b9d 100644 ---- a/src/lstack/include/lstack_weakup.h -+++ b/src/lstack/include/lstack_weakup.h -@@ -37,12 +37,13 @@ static inline void wakeup_list_sock(struct list_node *wakeup_list) - struct weakup_poll *weakup = sock->weakup; - struct protocol_stack *stack = sock->stack; - if (weakup == NULL || stack == NULL) { -+ list_del_node_init(&sock->wakeup_list); - continue; - } - - int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); - if (ret == 0) { -- list_del_node_init(&sock->event_list); -+ list_del_node_init(&sock->wakeup_list); - sem_post(&weakup->event_sem); - stack->stats.lwip_events++; - } else { --- -1.8.3.1 - diff --git a/0035-add-check-for-stack-params.patch b/0035-add-check-for-stack-params.patch deleted file mode 100644 index 856954c..0000000 --- a/0035-add-check-for-stack-params.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 35c5052da432255f3756d5bdc46c67597545908a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 17 Mar 2022 16:10:51 +0800 -Subject: [PATCH] add check for stack params - ---- - src/lstack/core/lstack_thread_rpc.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index c95f2c0..2a67333 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -29,6 +29,10 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - int32_t ret; - struct rpc_msg *msg = NULL; - -+ if (stack == NULL) { -+ return NULL; -+ } -+ - ret = rte_mempool_get(stack->rpc_pool, (void **)&msg); - if (ret < 0) { - get_protocol_stack_group()->call_alloc_fail++; --- -1.8.3.1 - diff --git a/0036-the-sending-of-sock-last-data-is-triggered-by-lstack.patch b/0036-the-sending-of-sock-last-data-is-triggered-by-lstack.patch deleted file mode 100644 index 47e3d6d..0000000 --- a/0036-the-sending-of-sock-last-data-is-triggered-by-lstack.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 6b05f21de47d2e3a49e6d99ee8a6af773266f117 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Fri, 18 Mar 2022 14:54:37 +0800 -Subject: [PATCH] the sending of sock last data is triggered by lstack - ---- - src/lstack/core/lstack_lwip.c | 5 +++-- - src/lstack/core/lstack_protocol_stack.c | 3 ++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 7bab92f..b4d75d2 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -214,7 +214,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack) - uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring); - - for (uint32_t i = 0; i < replenish_cnt; i++) { -- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM); -+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); - if (pbuf == NULL) { - break; - } -@@ -361,7 +361,8 @@ void stack_send(struct rpc_msg *msg) - msg->result = write_lwip_data(sock, fd, flags); - __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); - -- if (msg->result >= 0 && rte_ring_count(sock->send_ring)) { -+ if (msg->result >= 0 && -+ (rte_ring_count(sock->send_ring) || sock->send_lastdata)) { - if (list_is_empty(&sock->send_list)) { - __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); - list_add_node(&stack->send_list, &sock->send_list); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 1de546d..e5761a4 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -350,7 +350,8 @@ static void send_stack_list(struct protocol_stack *stack) - - ssize_t ret = write_lwip_data(sock, sock->conn->socket, sock->send_flags); - __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); -- if (ret >= 0 && rte_ring_count(sock->send_ring)) { -+ if (ret >= 0 && -+ (rte_ring_count(sock->send_ring) || sock->send_lastdata)) { - __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); - } else { - list_del_node_init(&sock->send_list); --- -1.8.3.1 - diff --git a/0037-add-gazellectl-lstack-constraint.patch b/0037-add-gazellectl-lstack-constraint.patch deleted file mode 100644 index 7537c5f..0000000 --- a/0037-add-gazellectl-lstack-constraint.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0a62cc1547009c6e382c08d7e99c8727201dd56a Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Mon, 21 Mar 2022 09:50:49 +0800 -Subject: [PATCH] addd gazellectl lstack constraint - ---- - README.md | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/README.md b/README.md -index e914b26..eef6362 100644 ---- a/README.md -+++ b/README.md -@@ -199,7 +199,7 @@ redis-server redis.conf - liblstack.so编译进应用程序后wrap网络编程标准接口,应用程序无需修改代码。 - - ### 9. gazellectl --- 不使用ltran模式时不支持gazellectl ltran xxx 命令 -+- 不使用ltran模式时不支持gazellectl ltran xxx命令,以及-r, rate命令 - ``` - Usage: gazellectl [-h | help] - or: gazellectl ltran {quit | show} [LTRAN_OPTIONS] [time] --- -1.8.3.1 - diff --git a/0038-refactor-event.patch b/0038-refactor-event.patch deleted file mode 100644 index 85d43d9..0000000 --- a/0038-refactor-event.patch +++ /dev/null @@ -1,3098 +0,0 @@ -From 9b4379914e97d4c0c267033559bf86d20c7381b6 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 30 Mar 2022 00:04:46 +0800 -Subject: [PATCH] refactor event - ---- - README.md | 3 +- - src/common/gazelle_dfx_msg.h | 18 +- - src/lstack/api/lstack_epoll.c | 509 +++++++++++++++-------------- - src/lstack/api/lstack_signal.c | 1 + - src/lstack/core/lstack_cfg.c | 27 +- - src/lstack/core/lstack_dpdk.c | 99 ++++-- - src/lstack/core/lstack_init.c | 13 +- - src/lstack/core/lstack_lwip.c | 352 +++++++++++--------- - src/lstack/core/lstack_protocol_stack.c | 345 +++++++++---------- - src/lstack/core/lstack_stack_stat.c | 6 - - src/lstack/core/lstack_thread_rpc.c | 106 +++--- - src/lstack/include/lstack_cfg.h | 2 +- - src/lstack/include/lstack_dpdk.h | 7 +- - src/lstack/include/lstack_log.h | 9 +- - src/lstack/include/lstack_lwip.h | 11 +- - src/lstack/include/lstack_protocol_stack.h | 35 +- - src/lstack/include/lstack_thread_rpc.h | 5 +- - src/lstack/include/lstack_vdev.h | 2 +- - src/lstack/include/posix/lstack_epoll.h | 2 + - src/lstack/lstack.conf | 1 - - src/lstack/netif/lstack_ethdev.c | 25 +- - src/lstack/netif/lstack_vdev.c | 2 +- - src/ltran/ltran_dfx.c | 31 +- - src/ltran/ltran_opt.h | 6 +- - 24 files changed, 822 insertions(+), 795 deletions(-) - -diff --git a/README.md b/README.md -index e914b26..24079c7 100644 ---- a/README.md -+++ b/README.md -@@ -236,7 +236,7 @@ Usage: gazellectl [-h | help] - - 提供的命令行、配置文件以及配置大页内存需要root权限执行或修改。非root用户使用,需先提权以及修改文件权限。 - - 若要把用户态网卡绑回内核驱动,必须先将Gazelle退出。 - - 不支持accept阻塞模式或者connect阻塞模式。 --- 最多只支持20000个链接(需要保证进程内,非网络连接的fd个数小于2000个)。 -+- 最多只支持1500个连接。 - - 协议栈当前只支持tcp、icmp、arp、ipv4。 - - 大页内存不支持在挂载点里创建子目录重新挂载。 - - 在对端ping时,要求指定报文长度小于等于14000。 -@@ -253,6 +253,7 @@ Usage: gazellectl [-h | help] - - 不使用ltran模式,kni网口只支持本地通讯使用,且需要启动前配置NetworkManager不管理kni网卡 - - 虚拟kni网口的ip及mac地址,需要与lstack配置文件保持一致 - - gazelle运行过程中,不允许删除运行文件,如果删除,需要重启gazelle -+- lstack配置的ip需要与应用程序的ip保持一致 - - ## Security risk note - gazelle有如下安全风险,用户需要评估使用场景风险 -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index de669f5..6db67ee 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -65,11 +65,9 @@ struct gazelle_stat_pkts { - uint64_t rx_allocmbuf_fail; - uint64_t tx_allocmbuf_fail; - uint64_t call_msg_cnt; -- uint16_t weakup_ring_cnt; - uint16_t conn_num; - uint16_t send_idle_ring_cnt; - uint64_t event_list; -- uint64_t wakeup_list; - uint64_t read_lwip_drop; - uint64_t read_lwip_cnt; - uint64_t write_lwip_drop; -@@ -79,22 +77,13 @@ struct gazelle_stat_pkts { - uint64_t app_write_idlefail; - uint64_t app_write_drop; - uint64_t recv_list; -- uint64_t lwip_events; -- uint64_t weakup_events; -+ uint64_t wakeup_events; - uint64_t app_events; - uint64_t call_alloc_fail; -- uint64_t read_events; -- uint64_t write_events; -- uint64_t accept_events; - uint64_t read_null; -- uint64_t remove_event; -- uint64_t send_self_rpc; - uint64_t call_null; - uint64_t arp_copy_fail; -- uint64_t epoll_pending; -- uint64_t epoll_pending_call; -- uint64_t epoll_self_call; -- uint64_t epoll_self_event; -+ uint64_t send_self_rpc; - uint64_t send_list; - }; - -@@ -169,8 +158,7 @@ struct gazelle_stat_lstack_conn_info { - uint32_t send_ring_cnt; - uint32_t recv_ring_cnt; - uint32_t tcp_sub_state; -- uint32_t event_ring_cnt; -- uint32_t self_ring_cnt; -+ int32_t sem_cnt; - }; - - struct gazelle_stat_lstack_conn { -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index e54d496..b8d53f6 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -21,6 +22,7 @@ - #include - #include - #include -+#include - - #include "lstack_compiler.h" - #include "lstack_ethdev.h" -@@ -28,127 +30,103 @@ - #include "lstack_cfg.h" - #include "lstack_log.h" - #include "gazelle_base_func.h" --#include "lstack_weakup.h" - #include "lstack_lwip.h" - #include "lstack_protocol_stack.h" - --#define EPOLL_INTERVAL_10MS 10000000 -+#define EPOLL_KERNEL_INTERVAL 10 /* ms */ -+#define EPOLL_NSEC_TO_SEC 1000000000 -+#define EPOLL_MAX_EVENTS 512 - --static PER_THREAD struct weakup_poll g_weakup_poll = {0}; -- --enum POLL_TYPE { -- TYPE_POLL, -- TYPE_EPOLL, --}; -- --static inline bool check_event_vaild(struct lwip_sock *sock, uint32_t event) --{ -- if ((event & EPOLLIN) && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) { -- event &= ~EPOLLIN; -- } -- -- if ((event & EPOLLOUT) && !NETCONN_IS_DATAOUT(sock)) { -- event &= ~EPOLLOUT; -- } -- -- return (event) ? true : false; --} -- --static inline bool report_events(struct lwip_sock *sock, uint32_t event) --{ -- /* error event */ -- if ((event & EPOLLERR) || (event & EPOLLHUP) || (event & EPOLLRDHUP)) { -- return true; -- } -- -- if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) { -- return false; -- } -- -- return check_event_vaild(sock, event); --} -+static PER_THREAD struct wakeup_poll g_wakeup_poll = {0}; -+static bool g_use_epoll = false; /* FIXME: when no epoll close prepare event for performance testing */ - - void add_epoll_event(struct netconn *conn, uint32_t event) - { - /* conn sock nerver null, because lwip call this func */ - struct lwip_sock *sock = get_socket(conn->socket); - -- /* close_wait event should be (EPOLLRDHUP | EPOLLIN), but lwip is EPOLLERR */ -- if (event == EPOLLERR && conn->pcb.tcp && conn->pcb.tcp->state == CLOSE_WAIT) { -- event = EPOLLRDHUP | EPOLLIN | EPOLLERR; -- } -- - if ((event & sock->epoll_events) == 0) { - return; - } -+ - sock->events |= event & sock->epoll_events; - -- if (!sock->weakup || !report_events(sock, event)) { -- return; -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -+ if (g_use_epoll && list_is_empty(&sock->event_list)) { -+ list_add_node(&sock->stack->event_list, &sock->event_list); - } -+#endif - -- if (weakup_enqueue(sock->stack->weakup_ring, sock)) { -- if (list_is_empty(&sock->event_list)) { -- list_add_node(&sock->stack->event_list, &sock->event_list); -+ if (sock->wakeup) { -+ sock->stack->stats.wakeup_events++; -+ if (get_protocol_stack_group()->wakeup_enable) { -+ rte_ring_sp_enqueue(sock->stack->wakeup_ring, &sock->wakeup->event_sem); -+ } else { -+ sem_post(&sock->wakeup->event_sem); - } -- } else { -- __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); -- sock->stack->stats.weakup_events++; - } - } - --static void raise_pending_events(struct lwip_sock *sock) -+static inline uint32_t update_events(struct lwip_sock *sock) - { -- struct weakup_poll *wakeup = sock->weakup; -- struct protocol_stack *stack = sock->stack; -- struct netconn *conn = sock->conn; -- if (wakeup == NULL || stack == NULL || conn == NULL) { -- return; -+ uint32_t event = 0; -+ -+ if (sock->epoll_events & EPOLLIN) { -+ if (sock->attach_fd > 0 && NETCONN_IS_ACCEPTIN(sock)) { -+ event |= EPOLLIN; -+ } -+ -+ if (sock->attach_fd < 0 && NETCONN_IS_DATAIN(sock)) { -+ event |= EPOLLIN; -+ } - } - -- struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket_by_fd(sock->attach_fd) : sock; -- if (attach_sock == NULL) { -- return; -+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -+ event |= EPOLLOUT; - } - -- conn = attach_sock->conn; -- if (conn == NULL) { -- return; -+ if ((sock->epoll_events & EPOLLERR) && (sock->events & EPOLLERR)) { -+ event |= EPOLLERR | EPOLLIN; - } -- struct tcp_pcb *tcp = conn->pcb.tcp; -- if ((tcp == NULL) || (tcp->state < ESTABLISHED)) { -+ -+ return event; -+} -+ -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -+void update_stack_events(struct protocol_stack *stack) -+{ -+ if (!g_use_epoll) { - return; - } - -- uint32_t event = 0; -- if (sock->epoll_events & EPOLLIN) { -- if (attach_sock->recv_lastdata || rte_ring_count(attach_sock->recv_ring) || NETCONN_IS_ACCEPTIN(attach_sock)) { -- event |= EPOLLIN; -- } -- } -+ struct list_node *node, *temp; -+ list_for_each_safe(node, temp, &stack->event_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); - -- if (sock->epoll_events & EPOLLOUT) { -- if ((attach_sock->sendevent > 0) || -- ((tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) && (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT))) { -- event |= EPOLLOUT; -+ sock->events = update_events(sock); -+ if (sock->events != 0) { -+ continue; - } -- } - -- if (attach_sock->errevent > 0) { -- event |= POLLERR | POLLIN; -+ if (pthread_spin_trylock(&stack->event_lock)) { -+ continue; -+ } -+ list_del_node_init(&sock->event_list); -+ pthread_spin_unlock(&stack->event_lock); - } -+} -+#endif - -- if (event == 0) { -+static void raise_pending_events(struct lwip_sock *sock) -+{ -+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket_by_fd(sock->attach_fd) : sock; -+ if (attach_sock == NULL) { - return; - } -- attach_sock->events |= event; -- if (rte_ring_mp_enqueue(wakeup->event_ring, (void *)sock) == 0 || -- rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { -- sem_post(&wakeup->event_sem); -- stack->stats.epoll_pending++; -- } else { -- rpc_call_addevent(stack, attach_sock); -- stack->stats.epoll_pending_call++; -+ -+ attach_sock->events = update_events(attach_sock); -+ if (attach_sock->events & attach_sock->epoll_events) { -+ rpc_call_addevent(attach_sock->stack, attach_sock); - } - } - -@@ -166,34 +144,35 @@ int32_t lstack_epoll_create(int32_t size) - GAZELLE_RETURN(EINVAL); - } - -- struct weakup_poll *weakup = malloc(sizeof(struct weakup_poll)); -- if (weakup == NULL) { -+ struct wakeup_poll *wakeup = malloc(sizeof(struct wakeup_poll)); -+ if (wakeup == NULL) { - posix_api->close_fn(fd); - GAZELLE_RETURN(EINVAL); - } - -- memset_s(weakup, sizeof(struct weakup_poll), 0, sizeof(struct weakup_poll)); -- sem_init(&weakup->event_sem, 0, 0); -- -- weakup->event_ring = create_ring("RING_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, fd); -- if (weakup->event_ring == NULL) { -- posix_api->close_fn(fd); -- GAZELLE_RETURN(ENOMEM); -- } -- -- weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, fd); -- if (weakup->self_ring == NULL) { -- posix_api->close_fn(fd); -- GAZELLE_RETURN(ENOMEM); -- } -+ memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)); -+ sem_init(&wakeup->event_sem, 0, 0); - -- sock->weakup = weakup; -+ sock->wakeup = wakeup; -+ init_list_node(&wakeup->event_list); - -+ g_use_epoll = true; - return fd; - } - - int32_t lstack_epoll_close(int32_t fd) - { -+ struct lwip_sock *sock = get_socket_by_fd(fd); -+ if (sock == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "fd=%d sock is NULL errno=%d\n", fd, errno); -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ if (sock->wakeup) { -+ free(sock->wakeup); -+ } -+ sock->wakeup = NULL; -+ - return 0; - } - -@@ -219,7 +198,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - } - - struct lwip_sock *epoll_sock = get_socket_by_fd(epfd); -- if (epoll_sock == NULL || epoll_sock->weakup == NULL) { -+ if (epoll_sock == NULL || epoll_sock->wakeup == NULL) { - LSTACK_LOG(ERR, LSTACK, "epfd=%d\n", fd); - GAZELLE_RETURN(EINVAL); - } -@@ -228,7 +207,10 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - do { - switch (op) { - case EPOLL_CTL_ADD: -- sock->weakup = epoll_sock->weakup; -+ sock->wakeup = epoll_sock->wakeup; -+ if (list_is_empty(&sock->event_list)) { -+ list_add_node(&sock->wakeup->event_list, &sock->event_list); -+ } - /* fall through */ - case EPOLL_CTL_MOD: - sock->epoll_events = events; -@@ -238,6 +220,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - } - break; - case EPOLL_CTL_DEL: -+ list_del_node_init(&sock->event_list); - sock->epoll_events = 0; - break; - default: -@@ -250,176 +233,234 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - return 0; - } - --static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, int32_t fd, uint32_t events) -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -+static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) - { - int32_t event_num = 0; -- for (uint32_t i = 0; i < maxevents; i++) { -- /* fds[i].revents != 0, the events is kernel events */ -- if (fds[i].fd == fd && fds[i].revents == 0) { -- fds[i].revents = events; -- event_num = 1; -- break; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents); -+ for (uint32_t i = 0; i < stack_group->stack_num && event_num < maxevents; i++) { -+ struct protocol_stack *stack = stack_group->stacks[i]; -+ int32_t start_event_num = event_num; -+ -+ if (pthread_spin_trylock(&stack->event_lock)) { -+ continue; -+ } -+ -+ struct list_node *node, *temp; -+ list_for_each_safe(node, temp, &stack->event_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -+ -+ uint32_t event = sock->events & sock->epoll_events; -+ if (event == 0 || sock->wait_close) { -+ continue; -+ } -+ -+ events[event_num].events = event; -+ events[event_num].data = sock->ep_data; -+ event_num++; -+ -+ if (event_num >= maxevents) { -+ break; -+ } - } -+ -+ pthread_spin_unlock(&stack->event_lock); -+ -+ __sync_fetch_and_add(&stack->stats.app_events, event_num - start_event_num); - } - - return event_num; - } -- --static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock, -- struct lwip_sock *attach_sock) -+#else -+static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) - { -- /* remove duplicate event */ -- for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) { -- if (sock_list[i] == sock) { -- return true; -+ int32_t event_num = 0; -+ struct list_node *node, *temp; -+ list_for_each_safe(node, temp, &wakeup->event_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -+ if (sock->conn == NULL) { -+ list_del_node_init(&sock->event_list); -+ continue; - } -+ -+ struct lwip_sock *temp_sock = sock; -+ do { -+ struct lwip_sock *attach_sock = (temp_sock->attach_fd > 0) ? get_socket(temp_sock->attach_fd) : temp_sock; -+ if (attach_sock == NULL || temp_sock->wait_close) { -+ temp_sock = (temp_sock->nextfd > 0) ? get_socket(temp_sock->nextfd) : NULL; -+ continue; -+ } -+ -+ uint32_t event = update_events(attach_sock); -+ if (event != 0) { -+ events[event_num].events = event; -+ events[event_num].data = temp_sock->ep_data; -+ event_num++; -+ if (event_num >= maxevents) { -+ break; -+ } -+ } -+ -+ temp_sock = (temp_sock->nextfd > 0) ? get_socket(temp_sock->nextfd) : NULL; -+ } while (temp_sock); - } - -- return !check_event_vaild(attach_sock, attach_sock->events); -+ return event_num; - } -+#endif - --static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t maxevents, enum POLL_TYPE etype) -+static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - { -- struct epoll_event *events = (struct epoll_event *)out; -- struct pollfd *fds = (struct pollfd *)out; -- -- if (etype == TYPE_EPOLL) { -- maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents); -- } - int32_t event_num = 0; -- struct lwip_sock *sock = NULL; - -- while (event_num < maxevents) { -- if (rte_ring_sc_dequeue(weakup->self_ring, (void **)&sock) && -- rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock)) { -- break; -- } -- __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE); -+ for (uint32_t i = 0; i < nfds; i++) { -+ /* listenfd nextfd pointerto next stack listen, others nextfd=-1 */ -+ int32_t fd = fds[i].fd; -+ while (fd > 0) { -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ break; -+ } - -- /* sock->stack == NULL mean close sock */ -- if (sock->stack == NULL) { -- continue; -- } -+ /* attach listen is empty, all event in attached listen. attached listen attach_fd is self */ -+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket(sock->attach_fd) : sock; -+ if (attach_sock == NULL || sock->wait_close) { -+ fd = sock->nextfd; -+ continue; -+ } - -- /* attach listen is empty, all event in attached listen. attached listen attach_fd is self */ -- struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket(sock->attach_fd) : sock; -- if (attach_sock == NULL) { -- continue; -- } -+ uint32_t events = update_events(attach_sock); -+ if (events) { -+ fds[i].revents = events; -+ __sync_fetch_and_add(&sock->stack->stats.app_events, 1); -+ event_num++; -+ break; -+ } - -- if (remove_event(etype, weakup->sock_list, event_num, sock, attach_sock)) { -- sock->stack->stats.remove_event++; -- continue; -+ fd = sock->nextfd; - } -+ } - -- if (etype == TYPE_EPOLL) { -- events[event_num].events = attach_sock->events; -- events[event_num].data = sock->ep_data; -- weakup->sock_list[event_num] = sock; -- event_num++; -- } else { -- /* shadow_fd event notice listen_fd */ -- if (attach_sock->shadowed_sock) { -- attach_sock = attach_sock->shadowed_sock; -- } -+ return event_num; -+} - -- if (sock->conn) { -- event_num += save_poll_event(fds, maxevents, sock->conn->socket, attach_sock->events); -- } -+static inline bool have_kernel_fd(int32_t epfd, struct pollfd *fds, nfds_t nfds) -+{ -+ /* when epfd > 0 is epoll type */ -+ for (uint32_t i = 0; i < nfds && epfd < 0; i++) { -+ if (get_socket(fds[i].fd) == NULL) { -+ return true; - } -- -- sock->stack->stats.app_events++; -- sem_trywait(&weakup->event_sem); /* each event post sem, so every read down sem */ - } - -- return event_num; -+ return false; - } - --static inline int32_t remove_kernel_invaild_events(struct pollfd *fds, int32_t nfds, int32_t event_count) -+static inline int32_t poll_kernel_event(struct pollfd *fds, nfds_t nfds) - { -- int32_t real_count = 0; -+ int32_t event_num = 0; - -- for (int i = 0; i < nfds && real_count < event_count; i++) { -- if (fds[i].fd < 0 || fds[i].revents == 0) { -+ for (uint32_t i = 0; i < nfds; i++) { -+ /* lwip event */ -+ if (get_socket(fds[i].fd) != NULL || fds[i].fd < 0) { - continue; - } - -- struct lwip_sock *sock = get_socket(fds[i].fd); -- if (sock && CONN_TYPE_IS_LIBOS(sock->conn)) { -- fds[i].revents = 0; -+ int32_t ret = posix_api->poll_fn(&fds[i], 1, 0); -+ if (ret < 0) { -+ if (errno != EINTR) { -+ return ret; -+ } - } else { -- real_count++; -+ event_num += ret; - } - } - -- return real_count; -+ return event_num; - } - --static int32_t poll_event(struct weakup_poll *weakup, int32_t epfd, void *out, int32_t maxevents, int32_t timeout) -+static int32_t get_event(struct wakeup_poll *wakeup, int32_t epfd, void *out, int32_t maxevents, int32_t timeout) - { -- struct epoll_event *events = (struct epoll_event *)out; - struct pollfd *fds = (struct pollfd *)out; -+ struct epoll_event *events = (struct epoll_event *)out; -+ bool have_kernel = have_kernel_fd(epfd, fds, maxevents); - int32_t event_num = 0; -- int32_t event_kernel_num = 0; -- struct timespec epoll_interval = { -- .tv_sec = 0, -- .tv_nsec = EPOLL_INTERVAL_10MS, -- }; -- uint32_t start_time = sys_now(); -+ int32_t poll_time = 0; -+ int32_t ret; - -+ /* when epfd > 0 is epoll type */ - do { -- /* epoll_wait type */ -- if (epfd > 0) { -- event_num += get_lwip_events(weakup, &events[event_num], maxevents - event_num, TYPE_EPOLL); -- if (event_num >= maxevents) { -- break; -- } -+ event_num += (epfd > 0) ? epoll_lwip_event(wakeup, &events[event_num], maxevents - event_num) : -+ poll_lwip_event(fds, maxevents); - -- event_kernel_num = posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0); -+ if (have_kernel) { -+ int32_t event_kernel_num = (epfd > 0) ? -+ posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0) : -+ poll_kernel_event(fds, maxevents); - if (event_kernel_num < 0) { -- break; -+ return event_kernel_num; - } - event_num += event_kernel_num; -- } else { -- /* for poll events, we need to distiguish kernel events and gazelle events */ -- event_kernel_num = posix_api->poll_fn(fds, maxevents, 0); -- if (event_kernel_num < 0) { -+ if (timeout >= 0 && poll_time >= timeout) { - break; - } -- event_kernel_num = remove_kernel_invaild_events(fds, maxevents, event_kernel_num); -- event_num += event_kernel_num; -- -- event_num += get_lwip_events(weakup, fds, maxevents, TYPE_POLL); -+ poll_time += EPOLL_KERNEL_INTERVAL; - } - - if (event_num > 0) { - break; - } - -- sem_timedwait(&weakup->event_sem, &epoll_interval); -- if (timeout > 0) { -- timeout = update_timeout(timeout, start_time); -+ int32_t interval = (have_kernel) ? EPOLL_KERNEL_INTERVAL : timeout; -+ struct timespec epoll_interval; -+ clock_gettime(CLOCK_REALTIME, &epoll_interval); -+ epoll_interval.tv_sec += interval / 1000; -+ epoll_interval.tv_nsec += (interval % 1000) * 1000000; -+ epoll_interval.tv_sec += epoll_interval.tv_nsec / 1000000000; -+ epoll_interval.tv_nsec = epoll_interval.tv_nsec % 1000000000; -+ -+ if (timeout < 0 && !have_kernel) { -+ ret = sem_wait(&wakeup->event_sem); -+ } else { -+ ret = sem_timedwait(&wakeup->event_sem, &epoll_interval); -+ } -+ -+ if (!have_kernel && ret < 0) { -+ break; - } -- } while (timeout != 0); -+ } while (event_num <= maxevents); - -- return (event_kernel_num < 0) ? event_kernel_num : event_num; -+ return event_num; - } - --static int32_t poll_init(struct pollfd *fds, nfds_t nfds, struct weakup_poll *weakup) -+int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { -- int32_t stack_id = 0; -- int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ /* avoid the starvation of epoll events from both netstack */ -+ maxevents = LWIP_MIN(LWIP_EPOOL_MAX_EVENTS, maxevents); - -- if (weakup->event_ring == NULL) { -- weakup->event_ring = create_ring("POLL_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, rte_gettid()); -- if (weakup->event_ring == NULL) { -- GAZELLE_RETURN(ENOMEM); -- } -+ struct lwip_sock *sock = get_socket_by_fd(epfd); -+ if (sock == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } - -- weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, rte_gettid()); -- if (weakup->self_ring == NULL) { -- GAZELLE_RETURN(ENOMEM); -- } -+ if (sock->wakeup == NULL) { -+ return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); -+ } -+ -+ return get_event(sock->wakeup, epfd, events, maxevents, timeout); -+} -+ -+static void poll_init(struct pollfd *fds, nfds_t nfds, struct wakeup_poll *wakeup) -+{ -+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ -+ if (!wakeup->init) { -+ wakeup->init = true; -+ sem_init(&wakeup->event_sem, 0, 0); -+ } else { -+ while (sem_trywait(&wakeup->event_sem) == 0) {} - } - - for (uint32_t i = 0; i < nfds; i++) { -@@ -432,51 +473,33 @@ static int32_t poll_init(struct pollfd *fds, nfds_t nfds, struct weakup_poll *we - break; - } - sock->epoll_events = fds[i].events | POLLERR; -- sock->weakup = weakup; -- -- raise_pending_events(sock); -- -- stack_count[sock->stack->queue_id]++; -+ sock->wakeup = wakeup; - - /* listenfd list */ - fd = sock->nextfd; -+ stack_count[sock->stack->queue_id]++; - } while (fd > 0); - } - -- for (uint32_t i = 0; i < get_protocol_stack_group()->stack_num; i++) { -- if (stack_count[i] > stack_count[stack_id]) { -- stack_id = i; -- } -- } -- -- bind_to_stack_numa(stack_id); -- -- return 0; --} -- --int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) --{ -- /* avoid the starvation of epoll events from both netstack */ -- maxevents = LWIP_MIN(LWIP_EPOOL_MAX_EVENTS, maxevents); -- -- struct lwip_sock *sock = get_socket_by_fd(epfd); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -+ if (wakeup->bind_stack) { -+ return; - } - -- if (sock->weakup == NULL) { -- return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ uint32_t bind_id = 0; -+ for (uint32_t i = 0; i < stack_group->stack_num; i++) { -+ if (stack_count[i] > stack_count[bind_id]) { -+ bind_id = i; -+ } - } - -- return poll_event(sock->weakup, epfd, events, maxevents, timeout); -+ bind_to_stack_numa(stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; - } - - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - { -- int32_t ret = poll_init(fds, nfds, &g_weakup_poll); -- if (ret != 0) { -- return -1; -- } -+ poll_init(fds, nfds, &g_wakeup_poll); - -- return poll_event(&g_weakup_poll, -1, fds, nfds, timeout); -+ return get_event(&g_wakeup_poll, -1, fds, nfds, timeout); - } -diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c -index 5e4af56..f4763e8 100644 ---- a/src/lstack/api/lstack_signal.c -+++ b/src/lstack/api/lstack_signal.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include "lstack_log.h" - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 53712a8..13086a3 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -33,14 +33,14 @@ - #include "gazelle_reg_msg.h" - #include "lstack_log.h" - #include "gazelle_base_func.h" --#include "gazelle_parse_config.h" - #include "lstack_protocol_stack.h" -+#include "gazelle_parse_config.h" - - #define DEFAULT_CONF_FILE "/etc/gazelle/lstack.conf" - #define LSTACK_CONF_ENV "LSTACK_CONF_PATH" - #define NUMA_CPULIST_PATH "/sys/devices/system/node/node%u/cpulist" - #define DEV_MAC_LEN 17 --#define CPUS_RANGE_NUM 32 -+#define CPUS_MAX_NUM 256 - - static struct cfg_params g_config_params; - -@@ -50,7 +50,7 @@ static int32_t parse_host_addr(void); - static int32_t parse_low_power_mode(void); - static int32_t parse_stack_cpu_number(void); - static int32_t parse_use_ltran(void); --static int32_t parse_weakup_cpu_number(void); -+static int32_t parse_wakeup_cpu_number(void); - static int32_t parse_mask_addr(void); - static int32_t parse_devices(void); - static int32_t parse_dpdk_args(void); -@@ -70,7 +70,7 @@ static struct config_vector_t g_config_tbl[] = { - { "devices", parse_devices }, - { "dpdk_args", parse_dpdk_args }, - { "num_cpus", parse_stack_cpu_number }, -- { "num_wakeup", parse_weakup_cpu_number }, -+ { "num_wakeup", parse_wakeup_cpu_number }, - { "low_power_mode", parse_low_power_mode }, - { "kni_switch", parse_kni_switch }, - { NULL, NULL } -@@ -240,7 +240,6 @@ static int32_t parse_stack_cpu_number(void) - } - - g_config_params.num_cpu = cnt; -- get_protocol_stack_group()->stack_num = g_config_params.num_cpu; - - return 0; - } -@@ -275,10 +274,10 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu - - static int32_t stack_idle_cpuset(struct protocol_stack *stack, cpu_set_t *exclude) - { -- uint32_t cpulist[CPUS_RANGE_NUM]; -+ uint32_t cpulist[CPUS_MAX_NUM]; - -- int32_t cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_RANGE_NUM); -- if (cpunum <= 0 ) { -+ int32_t cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_MAX_NUM); -+ if (cpunum <= 0) { - LSTACK_LOG(ERR, LSTACK, "numa_to_cpusnum failed\n"); - return -1; - } -@@ -308,7 +307,7 @@ int32_t init_stack_numa_cpuset(void) - CPU_SET(cfg->cpus[idx], &stack_cpuset); - } - for (int32_t idx = 0; idx < cfg->num_wakeup; ++idx) { -- CPU_SET(cfg->weakup[idx], &stack_cpuset); -+ CPU_SET(cfg->wakeup[idx], &stack_cpuset); - } - - for (int32_t idx = 0; idx < stack_group->stack_num; ++idx) { -@@ -621,7 +620,7 @@ static int32_t parse_low_power_mode(void) - return 0; - } - --static int32_t parse_weakup_cpu_number(void) -+static int32_t parse_wakeup_cpu_number(void) - { - const config_setting_t *cfg_args = NULL; - const char *args = NULL; -@@ -639,13 +638,19 @@ static int32_t parse_weakup_cpu_number(void) - } - - char *tmp_arg = strdup(args); -- int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.weakup, CFG_MAX_CPUS); -+ int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.wakeup, CFG_MAX_CPUS); - free(tmp_arg); - if (cnt <= 0 || cnt > CFG_MAX_CPUS) { - return -EINVAL; - } - g_config_params.num_wakeup = cnt; - -+ if (g_config_params.num_wakeup < g_config_params.num_cpu) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "num_wakeup=%d less than num_stack_cpu=%d.\n", g_config_params.num_wakeup, -+ g_config_params.num_cpu); -+ return -EINVAL; -+ } -+ - return 0; - } - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 430c6e5..3f446ea 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - - #include "lstack_log.h" - #include "dpdk_common.h" -@@ -109,35 +110,39 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - char pool_name[PATH_MAX]; - struct rte_mempool *pool; - -- ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%d", name, queue_id); -+ ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%hu", name, queue_id); - if (ret < 0) { - return NULL; - } - - /* time stamp before pbuf_custom as priv_data */ -+ pthread_mutex_lock(get_mem_mutex()); - pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, - sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id()); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } -+ pthread_mutex_unlock(get_mem_mutex()); - return pool; - } - --static struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id) -+struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id) - { - char pool_name[PATH_MAX]; - struct rte_mempool *pool; - int32_t ret; - -- ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%d", name, queue_id); -+ ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%hu", name, queue_id); - if (ret < 0) { - return NULL; - } -+ pthread_mutex_lock(get_mem_mutex()); - pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL, - NULL, rte_socket_id(), 0); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } -+ pthread_mutex_unlock(get_mem_mutex()); - return pool; - } - -@@ -147,7 +152,7 @@ static struct reg_ring_msg *create_reg_mempool(const char *name, uint16_t queue_ - char pool_name[PATH_MAX]; - struct reg_ring_msg *reg_buf; - -- ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%d", name, queue_id); -+ ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%hu", name, queue_id); - if (ret < 0) { - return NULL; - } -@@ -167,21 +172,18 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, 0, stack->queue_id); -+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ, -+ stack->queue_id); - if (stack->rx_pktmbuf_pool == NULL) { - return -1; - } - -- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, 0, stack->queue_id); -+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ, -+ stack->queue_id); - if (stack->tx_pktmbuf_pool == NULL) { - return -1; - } - -- stack->rpc_pool = create_rpc_mempool("rpc_msg", stack->queue_id); -- if (stack->rpc_pool == NULL) { -- return -1; -- } -- - if (use_ltran()) { - stack->reg_buf = create_reg_mempool("reg_ring_msg", stack->queue_id); - if (stack->reg_buf == NULL) { -@@ -214,16 +216,12 @@ int32_t create_shared_ring(struct protocol_stack *stack) - { - lockless_queue_init(&stack->rpc_queue); - -- stack->weakup_ring = create_ring("SHARED_WEAKUP_RING", VDEV_WEAKUP_QUEUE_SZ, 0, stack->queue_id); -- if (stack->weakup_ring == NULL) { -- return -1; -- } -- -- stack->send_idle_ring = create_ring("SEND_IDLE_RING", VDEV_IDLE_QUEUE_SZ, 0, stack->queue_id); -- if (stack->send_idle_ring == NULL) { -- return -1; -+ if (get_protocol_stack_group()->wakeup_enable) { -+ stack->wakeup_ring = create_ring("WAKEUP_RING", VDEV_WAKEUP_QUEUE_SZ, 0, stack->queue_id); -+ if (stack->wakeup_ring == NULL) { -+ return -1; -+ } - } -- stack->in_replenish = 0; - - if (use_ltran()) { - stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); -@@ -328,8 +326,19 @@ static struct eth_params *alloc_eth_params(uint16_t port_id, uint16_t nb_queues) - return eth_params; - } - -+uint64_t get_eth_params_rx_ol(void) -+{ -+ return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.rxmode.offloads; -+} -+ -+uint64_t get_eth_params_tx_ol(void) -+{ -+ return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.txmode.offloads; -+} -+ - static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info) - { -+#if CHECKSUM_OFFLOAD_ALL - uint64_t rx_ol = 0; - uint64_t tx_ol = 0; - -@@ -337,43 +346,48 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf - uint64_t tx_ol_capa = dev_info->tx_offload_capa; - - // rx ip -- if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { - #if CHECKSUM_CHECK_IP_HW -+ if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { - rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM; - LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n"); --#endif - } -+#endif - - // rx tcp -- if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { - #if CHECKSUM_CHECK_TCP_HW -+ if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { - rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM; - LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_TCP_CKSUM\n"); --#endif - } -+#endif - - // tx ip -- if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) { - #if CHECKSUM_GEN_IP_HW -+ if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) { - tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM; - LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_IPV4_CKSUM\n"); --#endif - } -+#endif - - // tx tcp -- if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) { - #if CHECKSUM_GEN_TCP_HW -+ if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) { - tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM; - LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_TCP_CKSUM\n"); -+ } - #endif -+ if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) { -+ rx_ol = 0; -+ } -+ if (!(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) || !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) { -+ tx_ol = 0; - } - - conf->rxmode.offloads = rx_ol; - conf->txmode.offloads = tx_ol; - --#if CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW || CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW - LSTACK_LOG(INFO, LSTACK, "set checksum offloads\n"); --#endif -+#endif /* CHECKSUM_OFFLOAD_ALL */ - - return 0; - } -@@ -580,3 +594,30 @@ void dpdk_skip_nic_init(void) - } - } - -+int32_t init_dpdk_ethdev(void) -+{ -+ int32_t ret; -+ -+ ret = dpdk_ethdev_init(); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_init failed\n"); -+ return -1; -+ } -+ -+ ret = dpdk_ethdev_start(); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n"); -+ return -1; -+ } -+ -+ if (get_global_cfg_params()->kni_switch) { -+ ret = dpdk_init_lstack_kni(); -+ if (ret < 0) { -+ return -1; -+ } -+ } -+ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ sem_post(&stack_group->ethdev_init); -+ return 0; -+} -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 17195c8..774d0f3 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - - #include "lstack_cfg.h" - #include "lstack_control_plane.h" -@@ -225,16 +226,18 @@ __attribute__((constructor)) void gazelle_network_init(void) - - lstack_log_level_init(); - -- /* -- * Phase 8: memory and nic */ - ret = init_protocol_stack(); - if (ret != 0) { - LSTACK_EXIT(1, "init_protocol_stack failed\n"); - } - -- ret = create_stack_thread(); -- if (ret != 0) { -- LSTACK_EXIT(1, "create_stack_thread failed\n"); -+ /* -+ * Phase 8: nic */ -+ if (!use_ltran()) { -+ ret = init_dpdk_ethdev(); -+ if (ret != 0) { -+ LSTACK_EXIT(1, "init_dpdk_ethdev failed\n"); -+ } - } - - /* -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index b4d75d2..887464d 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -25,7 +26,6 @@ - #include "lstack_ethdev.h" - #include "lstack_protocol_stack.h" - #include "lstack_log.h" --#include "lstack_weakup.h" - #include "lstack_dpdk.h" - #include "lstack_stack_stat.h" - #include "lstack_lwip.h" -@@ -49,37 +49,82 @@ void listen_list_add_node(int32_t head_fd, int32_t add_fd) - sock->nextfd = add_fd; - } - -+static void free_ring_pbuf(struct rte_ring *ring) -+{ -+ while (1) { -+ struct pbuf *pbuf = NULL; -+ int32_t ret = rte_ring_sc_dequeue(ring, (void **)&pbuf); -+ if (ret != 0) { -+ break; -+ } -+ -+ pbuf_free(pbuf); -+ } -+} -+ - static void reset_sock_data(struct lwip_sock *sock) - { - /* check null pointer in ring_free func */ - if (sock->recv_ring) { -+ free_ring_pbuf(sock->recv_ring); - rte_ring_free(sock->recv_ring); - } - sock->recv_ring = NULL; - -+ if (sock->recv_wait_free) { -+ free_ring_pbuf(sock->recv_wait_free); -+ rte_ring_free(sock->recv_wait_free); -+ } -+ sock->recv_wait_free = NULL; -+ - if (sock->send_ring) { -+ free_ring_pbuf(sock->send_ring); - rte_ring_free(sock->send_ring); - } - sock->send_ring = NULL; - -+ if (sock->send_idle_ring) { -+ free_ring_pbuf(sock->send_idle_ring); -+ rte_ring_free(sock->send_idle_ring); -+ } -+ sock->send_idle_ring = NULL; -+ - sock->stack = NULL; -- sock->weakup = NULL; -+ sock->wakeup = NULL; - sock->events = 0; - sock->nextfd = -1; - sock->attach_fd = -1; - sock->wait_close = false; -- sock->have_event = false; -- sock->have_rpc_send = false; - sock->shadowed_sock = NULL; -+ sock->epoll_events = 0; -+ sock->events = 0; - - if (sock->recv_lastdata) { - pbuf_free(sock->recv_lastdata); -- sock->recv_lastdata = NULL; - } -+ sock->recv_lastdata = NULL; - - if (sock->send_lastdata) { - pbuf_free(sock->send_lastdata); -- sock->send_lastdata = NULL; -+ } -+ sock->send_lastdata = NULL; -+} -+ -+static void replenish_send_idlembuf(struct rte_ring *ring) -+{ -+ uint32_t replenish_cnt = rte_ring_free_count(ring); -+ -+ for (uint32_t i = 0; i < replenish_cnt; i++) { -+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); -+ if (pbuf == NULL) { -+ break; -+ } -+ -+ int32_t ret = rte_ring_sp_enqueue(ring, (void *)pbuf); -+ if (ret < 0) { -+ pbuf_free(pbuf); -+ break; -+ } - } - } - -@@ -99,19 +144,31 @@ void gazelle_init_sock(int32_t fd) - return; - } - -+ sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, name_tick++); -+ if (sock->recv_wait_free == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno); -+ return; -+ } -+ - sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, name_tick++); - if (sock->send_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } - -+ sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, name_tick++); -+ if (sock->send_idle_ring == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "idle_send create failed. errno: %d.\n", rte_errno); -+ return; -+ } -+ replenish_send_idlembuf(sock->send_idle_ring); -+ - sock->stack = get_protocol_stack(); - sock->stack->conn_num++; - init_list_node(&sock->recv_list); - init_list_node(&sock->attach_list); - init_list_node(&sock->listen_list); - init_list_node(&sock->event_list); -- init_list_node(&sock->wakeup_list); - init_list_node(&sock->send_list); - } - -@@ -129,7 +186,9 @@ void gazelle_clean_sock(int32_t fd) - list_del_node_init(&sock->recv_list); - list_del_node_init(&sock->attach_list); - list_del_node_init(&sock->listen_list); -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK - list_del_node_init(&sock->event_list); -+#endif - list_del_node_init(&sock->send_list); - } - -@@ -206,101 +265,60 @@ struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) - void *data = rte_pktmbuf_mtod(mbuf, void *); - struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); - -- return pbuf; --} -- --void stack_replenish_send_idlembuf(struct protocol_stack *stack) --{ -- uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring); -- -- for (uint32_t i = 0; i < replenish_cnt; i++) { -- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); -- if (pbuf == NULL) { -- break; -- } -- -- int32_t ret = rte_ring_sp_enqueue(stack->send_idle_ring, (void *)pbuf); -- if (ret < 0) { -- gazelle_free_pbuf(pbuf); -- break; -- } -+#if CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW -+ if (pbuf) { -+ pbuf->ol_flags = 0; -+ pbuf->l2_len = 0; -+ pbuf->l3_len = 0; - } -+#endif -+ -+ return pbuf; - } - --ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags) -+struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags) - { - struct pbuf *pbuf = NULL; -- ssize_t send_ret = 0; -- ssize_t send_len = 0; - -- do { -- if (sock->send_lastdata) { -- pbuf = sock->send_lastdata; -- sock->send_lastdata = NULL; -- } else { -- int32_t ret = rte_ring_sc_dequeue(sock->send_ring, (void **)&pbuf); -- if (ret != 0) { -- break; -- } -- } -- -- if (sock->conn == NULL || sock->conn->pcb.tcp == NULL) { -- GAZELLE_RETURN(ENOENT); -- } -- -- uint16_t available = tcp_sndbuf(sock->conn->pcb.tcp); -- if (available < pbuf->tot_len) { -- sock->send_lastdata = pbuf; -- break; -- } -- -- ssize_t pbuf_len = pbuf->tot_len; -- send_ret = lwip_send(fd, pbuf, pbuf->tot_len, flags); -- if (send_ret > 0) { -- send_len += send_ret; -- } -- if (send_ret != pbuf_len) { -- sock->stack->stats.write_lwip_drop++; -- break; -+ if (sock->send_lastdata) { -+ pbuf = sock->send_lastdata; -+ sock->send_lastdata = NULL; -+ } else { -+ int32_t ret = rte_ring_sc_dequeue(sock->send_ring, (void **)&pbuf); -+ if (ret != 0) { -+ *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ return NULL; - } -+ } - -- sock->stack->stats.write_lwip_cnt++; -- } while (1); -- -- return (send_ret < 0) ? send_ret : send_len; --} -- --void add_self_event(struct lwip_sock *sock, uint32_t events) --{ -- struct weakup_poll *wakeup = sock->weakup; -- struct protocol_stack *stack = sock->stack; -- if (wakeup == NULL || stack == NULL) { -- return; -+ if (pbuf->tot_len >= remain_size) { -+ sock->send_lastdata = pbuf; -+ *apiflags |= TCP_WRITE_FLAG_MORE; /* set TCP_PSH flag */ -+ return NULL; - } - -- sock->events |= events; -+ replenish_send_idlembuf(sock->send_idle_ring); - -- if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) { -- return; -+ if ((sock->epoll_events & EPOLLOUT) && rte_ring_free_count(sock->send_ring)) { -+ add_epoll_event(sock->conn, EPOLLOUT); - } - -- if (rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) { -- __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); -- sem_post(&sock->weakup->event_sem); -- stack->stats.epoll_self_event++; -- } else { -- rpc_call_addevent(stack, sock); -- stack->stats.epoll_self_call++; -- } -+ sock->stack->stats.write_lwip_cnt++; -+ return pbuf; - } - - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - { -+ if (sock->events & EPOLLERR) { -+ return 0; -+ } -+ - uint32_t free_count = rte_ring_free_count(sock->send_ring); - if (free_count == 0) { -- GAZELLE_RETURN(EAGAIN); -+ return -1; - } -- uint32_t avaible_cont = rte_ring_count(sock->stack->send_idle_ring); -+ -+ uint32_t avaible_cont = rte_ring_count(sock->send_idle_ring); - avaible_cont = LWIP_MIN(free_count, avaible_cont); - - struct pbuf *pbuf = NULL; -@@ -309,7 +327,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - uint32_t send_pkt = 0; - - while (send_len < len && send_pkt < avaible_cont) { -- int32_t ret = rte_ring_sc_dequeue(sock->stack->send_idle_ring, (void **)&pbuf); -+ int32_t ret = rte_ring_sc_dequeue(sock->send_idle_ring, (void **)&pbuf); - if (ret < 0) { - sock->stack->stats.app_write_idlefail++; - break; -@@ -322,28 +340,16 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - ret = rte_ring_sp_enqueue(sock->send_ring, pbuf); - if (ret != 0) { - sock->stack->stats.app_write_drop++; -- gazelle_free_pbuf(pbuf); -+ pbuf_free(pbuf); - break; - } - -- sock->stack->stats.app_write_cnt++; - send_len += copy_len; - send_pkt++; - } -+ __sync_fetch_and_add(&sock->stack->stats.app_write_cnt, send_pkt); - -- if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) { -- add_self_event(sock, EPOLLOUT); -- sock->stack->stats.write_events++; -- } else { -- sock->events &= ~EPOLLOUT; -- } -- -- if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) { -- sock->stack->in_replenish = true; -- rpc_call_replenish_idlembuf(sock->stack); -- } -- -- return send_len; -+ return (send_len <= 0) ? -1 : send_len; - } - - void stack_send(struct rpc_msg *msg) -@@ -351,27 +357,62 @@ void stack_send(struct rpc_msg *msg) - int32_t fd = msg->args[MSG_ARG_0].i; - int32_t flags = msg->args[MSG_ARG_2].i; - -- struct protocol_stack *stack = get_protocol_stack(); - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - msg->result = -1; - return; - } - -- msg->result = write_lwip_data(sock, fd, flags); -- __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); -+ if (!NETCONN_IS_DATAOUT(sock)) { -+ return; -+ } - -- if (msg->result >= 0 && -- (rte_ring_count(sock->send_ring) || sock->send_lastdata)) { -+ /* send all send_ring, so len set lwip send max. */ -+ ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -+ if (len == 0) { -+ /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -+ add_epoll_event(sock->conn, EPOLLERR); -+ } -+ -+ /* have remain data add sendlist */ -+ if (NETCONN_IS_DATAOUT(sock)) { - if (list_is_empty(&sock->send_list)) { -- __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -- list_add_node(&stack->send_list, &sock->send_list); -- sock->stack->stats.send_self_rpc++; -+ sock->send_flags = flags; -+ list_add_node(&sock->stack->send_list, &sock->send_list); - } -+ sock->stack->stats.send_self_rpc++; - } -+} - -- if (rte_ring_free_count(sock->send_ring)) { -- add_epoll_event(sock->conn, EPOLLOUT); -+void send_stack_list(struct protocol_stack *stack, uint32_t send_max) -+{ -+ struct list_node *node, *temp; -+ struct lwip_sock *sock; -+ uint32_t read_num = 0; -+ -+ list_for_each_safe(node, temp, &stack->send_list) { -+ sock = container_of(node, struct lwip_sock, send_list); -+ -+ if (sock->conn == NULL || !NETCONN_IS_DATAOUT(sock)) { -+ list_del_node_init(&sock->send_list); -+ continue; -+ } -+ -+ /* send all send_ring, so len set lwip send max. */ -+ ssize_t len = lwip_send(sock->conn->socket, sock, UINT16_MAX, sock->send_flags); -+ if (len == 0) { -+ /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -+ add_epoll_event(sock->conn, EPOLLERR); -+ list_del_node_init(&sock->send_list); -+ } -+ -+ if (!NETCONN_IS_DATAOUT(sock)) { -+ list_del_node_init(&sock->send_list); -+ } -+ -+ if (++read_num >= send_max) { -+ break; -+ } - } - } - -@@ -381,6 +422,10 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - return 0; - } - -+ if (rte_ring_count(sock->recv_wait_free)) { -+ free_ring_pbuf(sock->recv_wait_free); -+ } -+ - uint32_t free_count = rte_ring_free_count(sock->recv_ring); - uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); - uint32_t read_max = LWIP_MIN(free_count, data_count); -@@ -411,6 +456,10 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - read_count++; - } - -+ if (get_protocol_stack_group()->latency_start) { -+ calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_LWIP); -+ } -+ - recv_len += pbuf->len; - - /* once we have some data to return, only add more if we don't need to wait */ -@@ -425,6 +474,10 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - add_epoll_event(sock->conn, EPOLLIN); - } - sock->stack->stats.read_lwip_cnt += read_count; -+ -+ if (recv_len == 0) { -+ GAZELLE_RETURN(EAGAIN); -+ } - return recv_len; - } - -@@ -440,7 +493,7 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) - if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || - ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || - ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -- GAZELLE_RETURN(EINVAL); -+ GAZELLE_RETURN(EINVAL); - } - buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); - } -@@ -479,16 +532,14 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - - sock->send_flags = flags; - ssize_t send = write_stack_data(sock, buf, len); -- -- ssize_t ret = 0; -- if (!__atomic_load_n(&sock->have_rpc_send, __ATOMIC_ACQUIRE)) { -- __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -- ret = rpc_call_send(fd, buf, len, flags); -- } -- -- if (send <= 0 || ret < 0) { -+ if (send < 0) { - GAZELLE_RETURN(EAGAIN); -+ } else if (send == 0) { -+ return 0; - } -+ rte_smp_mb(); -+ -+ rpc_call_send(fd, NULL, send, flags); - return send; - } - -@@ -505,7 +556,7 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || - ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || - ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -- GAZELLE_RETURN(EINVAL); -+ GAZELLE_RETURN(EINVAL); - } - buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); - } -@@ -513,7 +564,7 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - for (i = 0; i < message->msg_iovlen; i++) { - ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); - if (ret < 0) { -- return buflen == 0 ? ret : buflen; -+ return buflen == 0 ? ret : buflen; - } - buflen += ret; - } -@@ -536,6 +587,10 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - sock->recv_flags = flags; - -+ if ((sock->events & EPOLLERR) && !NETCONN_IS_DATAIN(sock)) { -+ return 0; -+ } -+ - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; -@@ -556,22 +611,18 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - if (pbuf->tot_len > copy_len) { - sock->recv_lastdata = pbuf_free_header(pbuf, copy_len); - } else { -- pbuf_free(pbuf); -- sock->recv_lastdata = NULL; -- sock->stack->stats.app_read_cnt++; - if (get_protocol_stack_group()->latency_start) { - calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_READ); - } -+ ret = rte_ring_sp_enqueue(sock->recv_wait_free, pbuf); -+ if (ret != 0) { -+ pbuf_free(pbuf); -+ } -+ sock->recv_lastdata = NULL; -+ __sync_fetch_and_add(&sock->stack->stats.app_read_cnt, 1); - } - } - -- if ((sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) { -- add_self_event(sock, EPOLLIN); -- sock->stack->stats.read_events++; -- } else { -- sock->events &= ~EPOLLIN; -- } -- - if (recvd == 0) { - sock->stack->stats.read_null++; - GAZELLE_RETURN(EAGAIN); -@@ -588,30 +639,32 @@ void add_recv_list(int32_t fd) - } - } - --void read_recv_list(void) -+void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - { -- struct protocol_stack *stack = get_protocol_stack(); - struct list_node *list = &(stack->recv_list); - struct list_node *node, *temp; - struct lwip_sock *sock; -- struct lwip_sock *first_sock = NULL; -+ uint32_t read_num = 0; - - list_for_each_safe(node, temp, list) { - sock = container_of(node, struct lwip_sock, recv_list); - -- /* when read_lwip_data have data wait to read, add sock into recv_list. read_recv_list read this sock again. -- this is dead loop. so every sock just read one time */ -- if (sock == first_sock) { -- break; -- } -- if (first_sock == NULL) { -- first_sock = sock; -+ if (sock->conn == NULL || sock->recv_ring == NULL || sock->send_ring == NULL || sock->conn->pcb.tcp == NULL) { -+ list_del_node_init(&sock->recv_list); -+ continue; - } - -- /* recv_ring and send_ring maybe create fail, so check here */ -- if (sock->conn && sock->recv_ring && sock->send_ring && rte_ring_free_count(sock->recv_ring)) { -+ if (rte_ring_free_count(sock->recv_ring)) { - list_del_node_init(&sock->recv_list); -- lwip_recv(sock->conn->socket, NULL, 0, sock->recv_flags); -+ ssize_t len = lwip_recv(sock->conn->socket, NULL, 0, sock->recv_flags); -+ if (len == 0) { -+ /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -+ add_epoll_event(sock->conn, EPOLLERR); -+ } -+ } -+ -+ if (++read_num >= max_num) { -+ break; - } - } - } -@@ -633,11 +686,13 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - struct lwip_sock *sock = get_socket(netconn->socket); - if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { - conn->recv_ring_cnt = rte_ring_count(sock->recv_ring); -+ conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; -+ - conn->send_ring_cnt = rte_ring_count(sock->send_ring); -- struct weakup_poll *weakup = sock->weakup; -- if (weakup) { -- conn->event_ring_cnt = rte_ring_count(weakup->event_ring); -- conn->self_ring_cnt = rte_ring_count(weakup->self_ring); -+ conn->send_ring_cnt += (sock->send_lastdata) ? 1 : 0; -+ -+ if (sock->wakeup) { -+ sem_getvalue(&sock->wakeup->event_sem, &conn->sem_cnt); - } - } - } -@@ -786,11 +841,6 @@ static uint32_t get_list_count(struct list_node *list) - return count; - } - --void stack_wakeuplist_count(struct rpc_msg *msg) --{ -- msg->result = get_list_count(get_protocol_stack()->wakeup_list); --} -- - void stack_eventlist_count(struct rpc_msg *msg) - { - msg->result = get_list_count(&get_protocol_stack()->event_list); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index e5761a4..da320e2 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -28,29 +29,34 @@ - #include "lstack_lwip.h" - #include "lstack_protocol_stack.h" - #include "lstack_cfg.h" --#include "lstack_weakup.h" - #include "lstack_control_plane.h" - #include "lstack_stack_stat.h" - -+#define READ_LIST_MAX 32 -+#define SEND_LIST_MAX 32 -+#define HANDLE_RPC_MSG_MAX 32 -+ - static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; - static struct protocol_stack_group g_stack_group = {0}; - static PER_THREAD long g_stack_tid = 0; -+static pthread_mutex_t g_mem_mutex = PTHREAD_MUTEX_INITIALIZER; - - typedef void *(*stack_thread_func)(void *arg); - --int32_t bind_to_stack_numa(int32_t stack_id) -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -+void update_stack_events(struct protocol_stack *stack); -+#endif -+ -+pthread_mutex_t *get_mem_mutex(void) - { -- static PER_THREAD int32_t last_stack_id = -1; -+ return &g_mem_mutex; -+} - -+int32_t bind_to_stack_numa(struct protocol_stack *stack) -+{ - int32_t ret; -- struct protocol_stack *stack = get_protocol_stack_group()->stacks[stack_id]; - pthread_t tid = pthread_self(); - -- if (last_stack_id == stack_id) { -- return 0; -- } -- last_stack_id = stack_id; -- - ret = pthread_setaffinity_np(tid, sizeof(stack->idle_cpuset), &stack->idle_cpuset); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %d failed\n", rte_gettid(), stack->queue_id); -@@ -159,88 +165,27 @@ void lstack_low_power_idling(void) - } - } - --int32_t init_protocol_stack(void) -+static int32_t create_thread(uint16_t queue_id, char *thread_name, stack_thread_func func) - { -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- struct protocol_stack *stack = NULL; -+ /* thread may run slow, if arg is temp var maybe have relese */ -+ static uint16_t queue[PROTOCOL_STACK_MAX]; -+ char name[PATH_MAX]; -+ pthread_t tid; - int32_t ret; - -- for (uint32_t i = 0; i < stack_group->stack_num; i++) { -- stack = malloc(sizeof(*stack)); -- if (stack == NULL) { -- return -ENOMEM; -- } -- memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); -- -- stack->queue_id = i; -- stack->port_id = stack_group->port_id; -- stack->cpu_id = get_global_cfg_params()->cpus[i]; -- stack->socket_id = numa_node_of_cpu(stack->cpu_id); -- if (stack->socket_id < 0) { -- LSTACK_LOG(ERR, PORT, "numa_node_of_cpu failed\n"); -- return -EINVAL; -- } -- -- ret = pktmbuf_pool_init(stack, stack_group->stack_num); -- if (ret != 0) { -- return ret; -- } -- -- ret = create_shared_ring(stack); -- if (ret != 0) { -- return ret; -- } -- -- init_list_node(&stack->recv_list); -- init_list_node(&stack->listen_list); -- init_list_node(&stack->event_list); -- init_list_node(&stack->send_list); -- -- stack_group->stacks[i] = stack; -- } -- -- ret = init_stack_numa_cpuset(); -- if (ret < 0) { -+ if (queue_id >= PROTOCOL_STACK_MAX) { -+ LSTACK_LOG(ERR, LSTACK, "queue_id is %d exceed max=%d\n", queue_id, PROTOCOL_STACK_MAX); - return -1; - } -+ queue[queue_id] = queue_id; - -- if (!use_ltran()) { -- ret = dpdk_ethdev_init(); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_init failed\n"); -- return -1; -- } -- -- ret = dpdk_ethdev_start(); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n"); -- return -1; -- } -- -- if (get_global_cfg_params()->kni_switch) { -- ret = dpdk_init_lstack_kni(); -- if (ret < 0) { -- return -1; -- } -- } -- } -- -- return 0; --} -- --static int32_t create_thread(struct protocol_stack *stack, char *thread_name, stack_thread_func func) --{ -- char name[PATH_MAX]; -- pthread_t tid; -- int32_t ret; -- -- ret = sprintf_s(name, sizeof(name), "%s%02d", thread_name, stack->queue_id); -+ ret = sprintf_s(name, sizeof(name), "%s%02d", thread_name, queue[queue_id]); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "set name failed\n"); - return -1; - } - -- ret = pthread_create(&tid, NULL, func, stack); -+ ret = pthread_create(&tid, NULL, func, &queue[queue_id]); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "pthread_create ret=%d\n", ret); - return -1; -@@ -257,148 +202,185 @@ static int32_t create_thread(struct protocol_stack *stack, char *thread_name, st - - static void* gazelle_weakup_thread(void *arg) - { -- struct protocol_stack *stack = (struct protocol_stack *)arg; -- int32_t lcore_id = get_global_cfg_params()->weakup[stack->queue_id]; -+ uint16_t queue_id = *(uint16_t *)arg; -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - -+ int32_t lcore_id = get_global_cfg_params()->wakeup[stack->queue_id]; - thread_affinity_init(lcore_id); -- LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - -- struct list_node wakeup_list; -- init_list_node(&wakeup_list); -- stack->wakeup_list = &wakeup_list; -+ LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - - for (;;) { -- wakeup_list_sock(&wakeup_list); -+ sem_t *event_sem; -+ if (rte_ring_sc_dequeue(stack->wakeup_ring, (void **)&event_sem)) { -+ continue; -+ } - -- weakup_thread(stack->weakup_ring, &wakeup_list); -+ sem_post(event_sem); - } - - return NULL; - } - --static void stack_thread_init(struct protocol_stack *stack) -+static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - { -- uint16_t queue_id = stack->queue_id; -- int32_t ret; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); - - set_stack_idx(queue_id); - stack->tid = gettid(); -+ stack->queue_id = queue_id; -+ stack->port_id = stack_group->port_id; -+ stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; - stack->lwip_stats = &lwip_stats; -- RTE_PER_LCORE(_lcore_id) = stack->cpu_id; - -- thread_affinity_init(stack->cpu_id); -+ init_list_node(&stack->recv_list); -+ init_list_node(&stack->listen_list); -+ init_list_node(&stack->event_list); -+ init_list_node(&stack->send_list); -+ -+ pthread_spin_init(&stack->event_lock, PTHREAD_PROCESS_SHARED); - - sys_calibrate_tsc(); -+ stack_stat_init(); - -- hugepage_init(); -+ stack_group->stacks[queue_id] = stack; -+} - -- stack_replenish_send_idlembuf(stack); -+static struct protocol_stack * stack_thread_init(uint16_t queue_id) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- tcpip_init(NULL, NULL); -+ struct protocol_stack *stack = malloc(sizeof(*stack)); -+ if (stack == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); -+ return NULL; -+ } -+ init_stack_value(stack, queue_id); - -- if (use_ltran()) { -- ret = client_reg_thrd_ring(); -- if (ret != 0) { -- LSTACK_EXIT(1, "failed reg thread ret=%d\n", ret); -- } -+ cpu_set_t cpuset; -+ CPU_ZERO(&cpuset); -+ CPU_SET(stack->cpu_id, &cpuset); -+ if (rte_thread_set_affinity(&cpuset) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -+ free(stack); -+ return NULL; - } -+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id; - -- ret = ethdev_init(stack); -+ stack->socket_id = numa_node_of_cpu(stack->cpu_id); -+ if (stack->socket_id < 0) { -+ LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n"); -+ free(stack); -+ return NULL; -+ } -+ -+ int32_t ret = pktmbuf_pool_init(stack, stack_group->stack_num); - if (ret != 0) { -- LSTACK_EXIT(1, "failed reg thread ret=%d\n", ret); -+ free(stack); -+ return NULL; - } - -- stack_stat_init(); -+ ret = create_shared_ring(stack); -+ if (ret != 0) { -+ free(stack); -+ return NULL; -+ } - -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- sem_post(&stack_group->thread_inited); -- LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); --} -+ thread_affinity_init(stack->cpu_id); - --static void report_stack_event(struct protocol_stack *stack) --{ -- struct list_node *list = &(stack->event_list); -- struct list_node *node, *temp; -- struct lwip_sock *sock; -+ hugepage_init(); - -- list_for_each_safe(node, temp, list) { -- sock = container_of(node, struct lwip_sock, event_list); -+ tcpip_init(NULL, NULL); - -- if (weakup_enqueue(stack->weakup_ring, sock) == 0) { -- __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE); -- list_del_node_init(&sock->event_list); -- stack->stats.weakup_events++; -- } else { -- break; -+ if (use_ltran()) { -+ ret = client_reg_thrd_ring(); -+ if (ret != 0) { -+ free(stack); -+ return NULL; - } - } --} -- --static void send_stack_list(struct protocol_stack *stack) --{ -- struct list_node *list = &(stack->send_list); -- struct list_node *node, *temp; -- struct lwip_sock *sock; - -- list_for_each_safe(node, temp, list) { -- sock = container_of(node, struct lwip_sock, send_list); -+ sem_post(&stack_group->thread_phase1); - -- if (sock->conn == NULL || sock->stack == NULL) { -- list_del_node_init(&sock->send_list); -- continue; -- } -+ int32_t sem_val; -+ do { -+ sem_getvalue(&stack_group->ethdev_init, &sem_val); -+ } while (!sem_val && !use_ltran()); - -- ssize_t ret = write_lwip_data(sock, sock->conn->socket, sock->send_flags); -- __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE); -- if (ret >= 0 && -- (rte_ring_count(sock->send_ring) || sock->send_lastdata)) { -- __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE); -- } else { -- list_del_node_init(&sock->send_list); -- } -+ ret = ethdev_init(stack); -+ if (ret != 0) { -+ free(stack); -+ return NULL; -+ } - -- if (rte_ring_free_count(sock->send_ring)) { -- add_epoll_event(sock->conn, EPOLLOUT); -+ if (stack_group->wakeup_enable) { -+ ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); -+ if (ret != 0) { -+ free(stack); -+ return NULL; - } - } -+ -+ return stack; - } - - static void* gazelle_stack_thread(void *arg) - { -- struct protocol_stack *stack = (struct protocol_stack *)arg; -+ uint16_t queue_id = *(uint16_t *)arg; - -- stack_thread_init(stack); -+ struct protocol_stack *stack = stack_thread_init(queue_id); -+ if (stack == NULL) { -+ pthread_mutex_lock(&g_mem_mutex); -+ LSTACK_EXIT(1, "stack_thread_init failed\n"); -+ pthread_mutex_unlock(&g_mem_mutex); -+ } -+ LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); - - for (;;) { -- poll_rpc_msg(stack); -+ poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); - - eth_dev_poll(); - -- read_recv_list(); -+ read_recv_list(stack, READ_LIST_MAX); - -- sys_timer_run(); -+ send_stack_list(stack, SEND_LIST_MAX); - -- report_stack_event(stack); -+ sys_timer_run(); - -- send_stack_list(stack); -+#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -+ update_stack_events(stack); -+#endif - } - - return NULL; - } - --int32_t create_stack_thread(void) -+int32_t init_protocol_stack(void) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - int32_t ret; - -- ret = sem_init(&stack_group->thread_inited, 0, 0); -+ stack_group->stack_num = get_global_cfg_params()->num_cpu; -+ stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ -+ if (!use_ltran()) { -+ ret = sem_init(&stack_group->ethdev_init, 0, 0); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, PORT, "sem_init failed\n"); -+ return -1; -+ } -+ } -+ -+ ret = sem_init(&stack_group->thread_phase1, 0, 0); - if (ret < 0) { - LSTACK_LOG(ERR, PORT, "sem_init failed\n"); - return -1; - } - - for (uint32_t i = 0; i < stack_group->stack_num; i++) { -- ret = create_thread(stack_group->stacks[i], "gazellestack", gazelle_stack_thread); -+ ret = create_thread(i, "gazellestack", gazelle_stack_thread); - if (ret != 0) { - return ret; - } -@@ -406,14 +388,12 @@ int32_t create_stack_thread(void) - - int32_t thread_inited_num; - do { -- sem_getvalue(&stack_group->thread_inited, &thread_inited_num); -+ sem_getvalue(&stack_group->thread_phase1, &thread_inited_num); - } while (thread_inited_num < stack_group->stack_num); - -- for (uint32_t i = 0; i < stack_group->stack_num; i++) { -- ret = create_thread(stack_group->stacks[i], "gazelleweakup", gazelle_weakup_thread); -- if (ret != 0) { -- return ret; -- } -+ ret = init_stack_numa_cpuset(); -+ if (ret < 0) { -+ return -1; - } - - return 0; -@@ -440,7 +420,6 @@ static inline bool is_real_close(int32_t fd) - - /* last sock */ - if (list_is_empty(&sock->attach_list)) { -- list_del_node_init(&sock->attach_list); - return true; - } - -@@ -557,24 +536,6 @@ void stack_listen(struct rpc_msg *msg) - } - } - --static bool have_accept_event(int32_t fd) --{ -- do { -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- break; -- } -- -- if (NETCONN_IS_ACCEPTIN(sock)) { -- return true; -- } -- -- fd = sock->nextfd; -- } while (fd > 0); -- -- return false; --} -- - void stack_accept(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; -@@ -593,7 +554,7 @@ void stack_accept(struct rpc_msg *msg) - } - - LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %d\n", get_stack_tid(), msg->args[MSG_ARG_0].i, -- fd, accept_fd); -+ fd, accept_fd); - msg->result = -1; - } - -@@ -768,13 +729,11 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) - { - struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -+ if (sock == NULL || sock->attach_fd < 0) { - errno = EINVAL; - return -1; - } -- - fd = sock->attach_fd; -- int32_t head_fd = fd; - - struct lwip_sock *min_sock = NULL; - int32_t min_fd = fd; -@@ -783,15 +742,19 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - if (sock == NULL) { - GAZELLE_RETURN(EINVAL); - } -+ struct lwip_sock *attach_sock = get_socket(sock->attach_fd); -+ if (attach_sock == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } - -- if (!NETCONN_IS_ACCEPTIN(sock)) { -+ if (!NETCONN_IS_ACCEPTIN(attach_sock)) { - fd = sock->nextfd; - continue; - } - -- if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) { -- min_sock = sock; -- min_fd = fd; -+ if (min_sock == NULL || min_sock->stack->conn_num > attach_sock->stack->conn_num) { -+ min_sock = attach_sock; -+ min_fd = sock->attach_fd; - } - - fd = sock->nextfd; -@@ -802,13 +765,7 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - ret = rpc_call_accept(min_fd, addr, addrlen); - } - -- if (have_accept_event(head_fd)) { -- add_self_event(sock, EPOLLIN); -- sock = get_socket(head_fd); -- sock->stack->stats.accept_events++; -- } -- -- if(ret < 0) { -+ if (ret < 0) { - errno = EAGAIN; - } - return ret; -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 1813906..743857f 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -105,8 +105,6 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - lstack_get_low_power_info(&dfx->low_power_info); - memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; -- dfx->data.pkts.weakup_ring_cnt = rte_ring_count(stack->weakup_ring); -- dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring); - - int32_t rpc_call_result = rpc_call_msgcnt(stack); - dfx->data.pkts.call_msg_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; -@@ -120,10 +118,6 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - rpc_call_result = rpc_call_sendlistcnt(stack); - dfx->data.pkts.send_list = (rpc_call_result < 0) ? 0 : rpc_call_result; - -- if (stack->wakeup_list) { -- rpc_call_result = rpc_call_eventlistcnt(stack); -- dfx->data.pkts.wakeup_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -- } - dfx->data.pkts.conn_num = stack->conn_num; - } - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 2a67333..26725f7 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -19,9 +19,10 @@ - #include "lstack_protocol_stack.h" - #include "lstack_control_plane.h" - #include "gazelle_base_func.h" -+#include "lstack_dpdk.h" - #include "lstack_thread_rpc.h" - --#define HANDLE_RPC_MSG_MAX (8) -+static PER_THREAD struct rte_mempool *rpc_pool = NULL; - - static inline __attribute__((always_inline)) - struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) -@@ -33,11 +34,20 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - return NULL; - } - -- ret = rte_mempool_get(stack->rpc_pool, (void **)&msg); -+ static uint16_t pool_index = 0; -+ if (rpc_pool == NULL) { -+ rpc_pool = create_rpc_mempool("rpc_msg", pool_index++); -+ if (rpc_pool == NULL) { -+ return NULL; -+ } -+ } -+ -+ ret = rte_mempool_get(rpc_pool, (void **)&msg); - if (ret < 0) { - get_protocol_stack_group()->call_alloc_fail++; - return NULL; - } -+ msg->pool = rpc_pool; - - pthread_spin_init(&msg->lock, PTHREAD_PROCESS_SHARED); - msg->func = func; -@@ -47,13 +57,13 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - } - - static inline __attribute__((always_inline)) --void rpc_msg_free(struct rte_mempool *pool, struct rpc_msg *msg) -+void rpc_msg_free(struct rpc_msg *msg) - { - pthread_spin_destroy(&msg->lock); - - msg->self_release = 0; - msg->func = NULL; -- rte_mempool_put(pool, (void *)msg); -+ rte_mempool_put(msg->pool, (void *)msg); - } - - static inline __attribute__((always_inline)) -@@ -64,7 +74,7 @@ void rpc_call(lockless_queue *queue, struct rpc_msg *msg) - } - - static inline __attribute__((always_inline)) --int32_t rpc_sync_call(lockless_queue *queue, struct rte_mempool *pool, struct rpc_msg *msg) -+int32_t rpc_sync_call(lockless_queue *queue, struct rpc_msg *msg) - { - int32_t ret; - -@@ -74,20 +84,20 @@ int32_t rpc_sync_call(lockless_queue *queue, struct rte_mempool *pool, struct rp - pthread_spin_lock(&msg->lock); - - ret = msg->result; -- rpc_msg_free(pool, msg); -+ rpc_msg_free(msg); - return ret; - } - --void poll_rpc_msg(struct protocol_stack *stack) -+void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num) - { -- int32_t num; -+ uint32_t num; - struct rpc_msg *msg = NULL; - - num = 0; -- while (num++ < HANDLE_RPC_MSG_MAX) { -+ while (num++ < max_num) { - lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue); - if (node == NULL) { -- return; -+ break; - } - - msg = container_of(node, struct rpc_msg, queue_node); -@@ -103,7 +113,7 @@ void poll_rpc_msg(struct protocol_stack *stack) - if (msg->self_release) { - pthread_spin_unlock(&msg->lock); - } else { -- rpc_msg_free(stack->rpc_pool, msg); -+ rpc_msg_free(msg); - } - } - } -@@ -118,7 +128,7 @@ int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint3 - msg->args[MSG_ARG_0].p = conn_table; - msg->args[MSG_ARG_1].u = max_conn; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_connnum(struct protocol_stack *stack) -@@ -128,7 +138,7 @@ int32_t rpc_call_connnum(struct protocol_stack *stack) - return -1; - } - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen) -@@ -142,7 +152,7 @@ int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struc - msg->args[MSG_ARG_1].cp = addr; - msg->args[MSG_ARG_2].socklen = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - static void rpc_msgcnt(struct rpc_msg *msg) -@@ -158,7 +168,7 @@ int32_t rpc_call_msgcnt(struct protocol_stack *stack) - return -1; - } - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn) -@@ -168,7 +178,7 @@ int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn) - return -1; - } - msg->args[MSG_ARG_0].p = conn; -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) -@@ -178,17 +188,7 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - return -1; - } - msg->args[MSG_ARG_0].p = conn; -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); --} -- --int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack) --{ -- struct rpc_msg *msg = rpc_msg_alloc(stack, stack_wakeuplist_count); -- if (msg == NULL) { -- return -1; -- } -- -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_eventlistcnt(struct protocol_stack *stack) -@@ -198,7 +198,7 @@ int32_t rpc_call_eventlistcnt(struct protocol_stack *stack) - return -1; - } - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) -@@ -208,7 +208,7 @@ int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) - return -1; - } - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) -@@ -218,7 +218,7 @@ int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - return -1; - } - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - void add_epoll_event(struct netconn *conn, uint32_t event); -@@ -243,24 +243,6 @@ void rpc_call_addevent(struct protocol_stack *stack, void *sock) - rpc_call(&stack->rpc_queue, msg); - } - --static void rpc_replenish_idlembuf(struct rpc_msg *msg) --{ -- struct protocol_stack *stack = get_protocol_stack(); -- stack_replenish_send_idlembuf(stack); -- stack->in_replenish = 0; --} -- --void rpc_call_replenish_idlembuf(struct protocol_stack *stack) --{ -- struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_replenish_idlembuf); -- if (msg == NULL) { -- return; -- } -- -- msg->self_release = 0; -- rpc_call(&stack->rpc_queue, msg); --} -- - int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_arp); -@@ -287,7 +269,7 @@ int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol) - msg->args[MSG_ARG_1].i = type; - msg->args[MSG_ARG_2].i = protocol; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_close(int fd) -@@ -300,7 +282,7 @@ int32_t rpc_call_close(int fd) - - msg->args[MSG_ARG_0].i = fd; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen) -@@ -315,7 +297,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen - msg->args[MSG_ARG_1].cp = addr; - msg->args[MSG_ARG_2].socklen = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_listen(int s, int backlog) -@@ -329,7 +311,7 @@ int32_t rpc_call_listen(int s, int backlog) - msg->args[MSG_ARG_0].i = s; - msg->args[MSG_ARG_1].i = backlog; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) -@@ -344,7 +326,7 @@ int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) - msg->args[MSG_ARG_1].p = addr; - msg->args[MSG_ARG_2].p = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen) -@@ -359,7 +341,7 @@ int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen) - msg->args[MSG_ARG_1].cp = addr; - msg->args[MSG_ARG_2].socklen = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen) -@@ -374,7 +356,7 @@ int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen) - msg->args[MSG_ARG_1].p = addr; - msg->args[MSG_ARG_2].p = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen) -@@ -389,7 +371,7 @@ int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen) - msg->args[MSG_ARG_1].p = addr; - msg->args[MSG_ARG_2].p = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen) -@@ -406,7 +388,7 @@ int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, sockle - msg->args[MSG_ARG_3].p = optval; - msg->args[MSG_ARG_4].p = optlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen) -@@ -423,7 +405,7 @@ int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, - msg->args[MSG_ARG_3].cp = optval; - msg->args[MSG_ARG_4].socklen = optlen; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_fcntl(int fd, int cmd, long val) -@@ -438,7 +420,7 @@ int32_t rpc_call_fcntl(int fd, int cmd, long val) - msg->args[MSG_ARG_1].i = cmd; - msg->args[MSG_ARG_2].l = val; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_ioctl(int fd, long cmd, void *argp) -@@ -453,7 +435,7 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - msg->args[MSG_ARG_1].l = cmd; - msg->args[MSG_ARG_2].p = argp; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) -@@ -486,7 +468,7 @@ int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) - msg->args[MSG_ARG_1].cp = msghdr; - msg->args[MSG_ARG_2].i = flags; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } - - int32_t rpc_call_recvmsg(int fd, struct msghdr *msghdr, int flags) -@@ -501,5 +483,5 @@ int32_t rpc_call_recvmsg(int fd, struct msghdr *msghdr, int flags) - msg->args[MSG_ARG_1].p = msghdr; - msg->args[MSG_ARG_2].i = flags; - -- return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg); -+ return rpc_sync_call(&stack->rpc_queue, msg); - } -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 48b7e44..345a373 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -66,7 +66,7 @@ struct cfg_params { - uint16_t num_cpu; - uint32_t cpus[CFG_MAX_CPUS]; - uint16_t num_wakeup; -- uint32_t weakup[CFG_MAX_CPUS]; -+ uint32_t wakeup[CFG_MAX_CPUS]; - uint8_t num_ports; - uint16_t ports[CFG_MAX_PORTS]; - char log_file[PATH_MAX]; -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index e76a9a6..e8080e1 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -37,10 +37,10 @@ struct protocol_stack; - - #define MBUF_SZ (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM) - --#define MAX_CORE_NUM 256 -+#define MAX_CORE_NUM 256 - #define CALL_MSG_RING_SIZE (unsigned long long)32 --#define CALL_CACHE_SZ 64 --#define CALL_POOL_SZ ((VDEV_CALL_QUEUE_SZ << 1) + (2 * CALL_CACHE_SZ * MAX_CORE_NUM)) -+#define CALL_CACHE_SZ 0 -+#define CALL_POOL_SZ 128 - - /* Layout: - * | rte_mbuf | pbuf | custom_free_function | payload | -@@ -62,6 +62,7 @@ void dpdk_eal_init(void); - int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num); - struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id); - int32_t create_shared_ring(struct protocol_stack *stack); -+struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id); - void lstack_log_level_init(void); - int dpdk_ethdev_init(void); - int dpdk_ethdev_start(void); -diff --git a/src/lstack/include/lstack_log.h b/src/lstack/include/lstack_log.h -index 383495d..8b4209a 100644 ---- a/src/lstack/include/lstack_log.h -+++ b/src/lstack/include/lstack_log.h -@@ -15,17 +15,14 @@ - - #include - #include -- - #include - --#include "lwipopts.h" -- --#define RTE_LOGTYPE_LSTACK RTE_LOGTYPE_USER1 -+#define RTE_LOGTYPE_LSTACK RTE_LOGTYPE_USER1 - #define LSTACK_EXIT(a, fmt, ...) rte_exit(a, "%s:%d "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__) - #define LSTACK_LOG(a, b, fmt, ...) (void)RTE_LOG(a, b, "%s:%d "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__) - --#define LSTACK_INFO LOG_INFO --#define LSTACK_ERR LOG_ERR -+#define LSTACK_INFO LOG_INFO -+#define LSTACK_ERR LOG_ERR - - /* before rte_eal_init */ - #define LSTACK_PRE_LOG(level, fmt, ...) \ -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index ffd3b80..c73e3a7 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -21,32 +21,31 @@ - - #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) - #define NETCONN_IS_DATAIN(sock) ((rte_ring_count((sock)->recv_ring) || (sock)->recv_lastdata)) --#define NETCONN_IS_DATAOUT(sock) rte_ring_free_count((sock)->send_ring) -+#define NETCONN_IS_DATAOUT(sock) ((rte_ring_count((sock)->send_ring) || (sock)->send_lastdata)) -+#define NETCONN_IS_OUTIDLE(sock) rte_ring_free_count((sock)->send_ring) - - void create_shadow_fd(struct rpc_msg *msg); - void listen_list_add_node(int32_t head_fd, int32_t add_fd); - void gazelle_init_sock(int32_t fd); - int32_t gazelle_socket(int domain, int type, int protocol); - void gazelle_clean_sock(int32_t fd); --ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags); -+struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags); - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len); - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags); --void read_recv_list(void); -+void read_recv_list(struct protocol_stack *stack, uint32_t max_num); -+void send_stack_list(struct protocol_stack *stack, uint32_t send_max); - void add_recv_list(int32_t fd); - void stack_sendlist_count(struct rpc_msg *msg); - void stack_eventlist_count(struct rpc_msg *msg); --void stack_wakeuplist_count(struct rpc_msg *msg); - void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); - void stack_send(struct rpc_msg *msg); --void stack_replenish_send_idlembuf(struct protocol_stack *stack); - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); - void gazelle_free_pbuf(struct pbuf *pbuf); - ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags); - ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags); - ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags); --void add_self_event(struct lwip_sock *sock, uint32_t events); - - #endif -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 39052e1..9753385 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -14,6 +14,7 @@ - #define __GAZELLE_PROTOCOL_STACK_H__ - - #include -+#include - #include - #include - #include "dpdk_common.h" -@@ -28,38 +29,32 @@ struct protocol_stack { - uint16_t socket_id; - uint16_t cpu_id; - volatile uint16_t conn_num; -- volatile bool in_replenish; -- -- // for dispatcher thread -- cpu_set_t idle_cpuset; -+ cpu_set_t idle_cpuset; /* idle cpu in numa of stack, app thread bind to it */ - - lockless_queue rpc_queue; -- struct rte_ring *weakup_ring; -- - struct rte_mempool *rx_pktmbuf_pool; - struct rte_mempool *tx_pktmbuf_pool; -- struct rte_mempool *rpc_pool; - struct rte_ring *rx_ring; - struct rte_ring *tx_ring; - struct rte_ring *reg_ring; -- struct rte_ring *send_idle_ring; -+ struct rte_ring *wakeup_ring; -+ - struct reg_ring_msg *reg_buf; - - struct netif netif; - uint32_t rx_ring_used; - uint32_t tx_ring_used; -+ struct eth_dev_ops *dev_ops; - - struct list_node recv_list; - struct list_node listen_list; -- struct list_node event_list; - struct list_node send_list; -- struct list_node *wakeup_list; -+ struct list_node event_list; -+ pthread_spinlock_t event_lock; - - struct gazelle_stat_pkts stats; - struct gazelle_stack_latency latency; - struct stats_ *lwip_stats; -- -- struct eth_dev_ops *dev_ops; - }; - - struct eth_params; -@@ -67,25 +62,35 @@ struct eth_params; - struct protocol_stack_group { - uint16_t stack_num; - uint16_t port_id; -- sem_t thread_inited; -+ sem_t thread_phase1; -+ sem_t ethdev_init; - struct rte_mempool *kni_pktmbuf_pool; - struct eth_params *eth_params; - struct protocol_stack *stacks[PROTOCOL_STACK_MAX]; -+ bool wakeup_enable; - - /* dfx stats */ - bool latency_start; - uint64_t call_alloc_fail; - }; - -+struct wakeup_poll { -+ bool init; -+ struct protocol_stack *bind_stack; -+ struct list_node event_list; /* epoll temp use poll */ -+ sem_t event_sem; -+}; -+ - long get_stack_tid(void); -+pthread_mutex_t *get_mem_mutex(void); - struct protocol_stack *get_protocol_stack(void); - struct protocol_stack *get_protocol_stack_by_fd(int32_t fd); - struct protocol_stack *get_minconn_protocol_stack(void); - struct protocol_stack_group *get_protocol_stack_group(void); - - int32_t init_protocol_stack(void); --int32_t create_stack_thread(void); --int bind_to_stack_numa(int stack_id); -+int32_t bind_to_stack_numa(struct protocol_stack *stack); -+int32_t init_dpdk_ethdev(void); - - /* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */ - void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack); -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 20539d9..61bcd38 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -42,21 +42,20 @@ struct rpc_msg { - int32_t self_release; /* 0:msg handler release msg 1:msg sender release msg */ - int64_t result; /* func return val */ - lockless_queue_node queue_node; -+ struct rte_mempool *pool; - - rpc_msg_func func; /* msg handle func hook */ - union rpc_msg_arg args[RPM_MSG_ARG_SIZE]; /* resolve by type */ - }; - - struct protocol_stack; --void poll_rpc_msg(struct protocol_stack *stack); --void rpc_call_replenish_idlembuf(struct protocol_stack *stack); -+void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num); - void rpc_call_addevent(struct protocol_stack *stack, void *sock); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack); - int32_t rpc_call_eventlistcnt(struct protocol_stack *stack); - int32_t rpc_call_sendlistcnt(struct protocol_stack *stack); --int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack); - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn); - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn); - int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint32_t max_conn); -diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h -index 916b1e2..31a997d 100644 ---- a/src/lstack/include/lstack_vdev.h -+++ b/src/lstack/include/lstack_vdev.h -@@ -23,7 +23,7 @@ - #define VDEV_EVENT_QUEUE_SZ (DEFAULT_RING_SIZE) - #define VDEV_REG_QUEUE_SZ (DEFAULT_RING_SIZE) - #define VDEV_CALL_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_WEAKUP_QUEUE_SZ (DEFAULT_RING_SIZE) -+#define VDEV_WAKEUP_QUEUE_SZ (DEFAULT_RING_SIZE) - #define VDEV_IDLE_QUEUE_SZ (DEFAULT_RING_SIZE) - - #define VDEV_TX_QUEUE_SZ (DEFAULT_RING_SIZE) -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index 2b3cff4..cac640b 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -17,6 +17,8 @@ - extern "C" { - #endif - -+#include -+ - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event *events, int32_t maxevents, int32_t timeout); -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index fdca602..696dfb9 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -16,7 +16,6 @@ kni_switch=0 - low_power_mode=0 - - num_cpus="2" --num_wakeup="3" - - host_addr="192.168.1.10" - mask_addr="255.255.255.0" -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 8b2193f..ae39403 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -51,6 +51,9 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - stack->stats.rx_allocmbuf_fail++; - break; - } -+#if CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW -+ next->ol_flags = m->ol_flags; -+#endif - - if (head == NULL) { - head = next; -@@ -73,18 +76,19 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - } - } - -+#define READ_PKTS_MAX 32 - int32_t eth_dev_poll(void) - { - uint32_t nr_pkts; -- struct rte_mbuf *pkts[DPDK_PKT_BURST_SIZE]; -+ struct rte_mbuf *pkts[READ_PKTS_MAX]; - struct protocol_stack *stack = get_protocol_stack(); - -- nr_pkts = stack->dev_ops->rx_poll(stack, pkts, DPDK_PKT_BURST_SIZE); -+ nr_pkts = stack->dev_ops->rx_poll(stack, pkts, READ_PKTS_MAX); - if (nr_pkts == 0) { - return nr_pkts; - } - -- if (get_protocol_stack_group()->latency_start) { -+ if (!use_ltran() && get_protocol_stack_group()->latency_start) { - uint64_t time_stamp = get_current_time(); - time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); - } -@@ -146,19 +150,6 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - return ERR_OK; - } - --static err_t eth_dev_input(struct pbuf *p, struct netif *netif) --{ -- err_t ret = ethernet_input(p, netif); -- if (ret != ERR_OK) { -- return ret; -- } -- -- if (get_protocol_stack_group()->latency_start) { -- calculate_lstack_latency(&get_protocol_stack()->latency, p, GAZELLE_LATENCY_LWIP); -- } -- return ret; --} -- - static err_t eth_dev_init(struct netif *netif) - { - struct cfg_params *cfg = get_global_cfg_params(); -@@ -200,7 +191,7 @@ int32_t ethdev_init(struct protocol_stack *stack) - netif_set_default(&stack->netif); - - struct netif *netif = netif_add(&stack->netif, &cfg->host_addr, &cfg->netmask, &cfg->gateway_addr, NULL, -- eth_dev_init, eth_dev_input); -+ eth_dev_init, ethernet_input); - if (netif == NULL) { - LSTACK_LOG(ERR, LSTACK, "netif_add failed\n"); - return ERR_IF; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 57d3bce..5a4e86a 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -91,7 +91,7 @@ static uint32_t vdev_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkt - uint32_t sent_pkts = 0; - - do { -- sent_pkts += rte_eth_tx_burst(stack->port_id, stack->queue_id, &pkts[sent_pkts], nr_pkts); -+ sent_pkts += rte_eth_tx_burst(stack->port_id, stack->queue_id, &pkts[sent_pkts], nr_pkts - sent_pkts); - } while (sent_pkts < nr_pkts); - - return sent_pkts; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 8db5791..8d71966 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -561,27 +561,16 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop); - printf("write_lwip_drop: %-12"PRIu64" ", lstack_stat->data.pkts.write_lwip_drop); - printf("app_write_idlebuf: %-10"PRIu16" \n", lstack_stat->data.pkts.send_idle_ring_cnt); -+ printf("event_list: %-17"PRIu64" ", lstack_stat->data.pkts.event_list); - printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list); -- printf("weakup_ring_cnt: %-12"PRIu16" ", lstack_stat->data.pkts.weakup_ring_cnt); - printf("conn_num: %-19"PRIu16" \n", lstack_stat->data.pkts.conn_num); -- printf("weakup_events: %-14"PRIu64" ", lstack_stat->data.pkts.weakup_events); -- printf("lwip_events: %-16"PRIu64" ", lstack_stat->data.pkts.lwip_events); -- printf("app_events: %-17"PRIu64"\n", lstack_stat->data.pkts.app_events); -- printf("epoll_pending: %-14"PRIu64" ", lstack_stat->data.pkts.epoll_pending); -- printf("epoll_self_event: %-11"PRIu64" ", lstack_stat->data.pkts.epoll_self_event); -- printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event); -- printf("read_events: %-16"PRIu64" ", lstack_stat->data.pkts.read_events); -- printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events); -- printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events); -- printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null); -- printf("wakeup_list: %-16"PRIu64" ", lstack_stat->data.pkts.wakeup_list); -- printf("event_list: %-17"PRIu64" \n", lstack_stat->data.pkts.event_list); -- printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); -- printf("epoll_pending_call: %-9"PRIu64" ", lstack_stat->data.pkts.epoll_pending_call); -- printf("epoll_self_call: %-12"PRIu64" \n", lstack_stat->data.pkts.epoll_self_call); -+ printf("wakeup_events: %-14"PRIu64" ", lstack_stat->data.pkts.wakeup_events); -+ printf("app_events: %-17"PRIu64" ", lstack_stat->data.pkts.app_events); -+ printf("read_null: %-18"PRIu64" \n", lstack_stat->data.pkts.read_null); - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); -+ printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); - printf("send_list: %-18"PRIu64" \n", lstack_stat->data.pkts.send_list); - } - -@@ -884,7 +873,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - printf("Active Internet connections (servers and established)\n"); - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); -- printf("No. Proto recv_cnt recv_ring in_send send_ring event self_event Local Address" -+ printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt Local Address " - " Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; -@@ -894,13 +883,13 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%-7u%-12u%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt, -- conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->event_ring_cnt, -- conn_info->self_ring_cnt, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt, -+ conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt, -+ inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-60u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-50u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", -diff --git a/src/ltran/ltran_opt.h b/src/ltran/ltran_opt.h -index e4e085d..1117898 100644 ---- a/src/ltran/ltran_opt.h -+++ b/src/ltran/ltran_opt.h -@@ -34,12 +34,12 @@ - #define GAZELLE_KNI_ETHERNET_HEADER_SIZE 14 - #define GAZELLE_KNI_ETHERNET_FCS_SIZE 4 - --#define GAZELLE_PKT_MBUF_RX_POOL_NAME_FMT "rx_pool%d" --#define GAZELLE_PKT_MBUF_TX_POOL_NAME_FMT "tx_pool%d" -+#define GAZELLE_PKT_MBUF_RX_POOL_NAME_FMT "rx_pool%u" -+#define GAZELLE_PKT_MBUF_TX_POOL_NAME_FMT "tx_pool%u" - #define GAZELLE_PKT_MBUF_POOL_NAME_LENGTH 64 - - #define GAZELLE_BOND_NAME_LENGTH 64 --#define GAZELLE_BOND_DEV_NAME_FMT "net_bonding%d" -+#define GAZELLE_BOND_DEV_NAME_FMT "net_bonding%hu" - #define GAZELLE_BOND_QUEUE_MIN 1 - #define GAZELLE_BOND_QUEUE_MAX 64 - --- -1.8.3.1 - diff --git a/0039-update-license-lockless-queue.patch b/0039-update-license-lockless-queue.patch deleted file mode 100644 index 9454c97..0000000 --- a/0039-update-license-lockless-queue.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 5c3c268268e30ca494c6ceb154dbc67b3df2dce5 Mon Sep 17 00:00:00 2001 -From: colordev -Date: Thu, 19 May 2022 12:30:12 +0800 -Subject: [PATCH] update license lockless queue - ---- - ...Third_Party_Open_Source_Software_Notice.md | 36 ++++++++++++++++--- - src/lstack/include/lstack_lockless_queue.h | 10 +----- - 2 files changed, 32 insertions(+), 14 deletions(-) - -diff --git a/License/Third_Party_Open_Source_Software_Notice.md b/License/Third_Party_Open_Source_Software_Notice.md -index 8812524..325cdbe 100644 ---- a/License/Third_Party_Open_Source_Software_Notice.md -+++ b/License/Third_Party_Open_Source_Software_Notice.md -@@ -129,7 +129,7 @@ lwIP is freely available under a BSD license. - * - */ - -- **Software:** libpcap 1.9.1 -+**Software:** libpcap 1.9.1 - - **Copyright notice:** - -@@ -153,9 +153,9 @@ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -- **Software:** libconfig 1.7.2 -+**Software:** libconfig 1.7.2 - -- **Copyright notice:** -+**Copyright notice:** - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 -@@ -681,5 +681,31 @@ Author: Andi Kleen, SUSE Labs - - Version 2.0.0 by Cliff Wickman (cpw@sgi.com), Christoph Lameter (clameter@sgi.com) and Lee Schermerhorn (lee.schermerhorn@hp.com). - -- **Copyright notice:** -- Please see above. -+**Copyright notice:** -+Please see above. -+ -+**Software:** lockless queue -+ -+**License:** -+Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -+ -+ 1. Redistributions of source code must retain the above copyright notice, this list of -+ -+ conditions and the following disclaimer. -+ -+ 2. Redistributions in binary form must reproduce the above copyright notice, this list -+ -+ of conditions and the following disclaimer in the documentation and/or other materials -+ -+ provided with the distribution. -+ -+THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Dmitry Vyukov. -+ -+If not stated otherwise, all non-source-code text and images on this site are provided under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. Source code is covered by the Simplified BSD License and by Apache License, Version 2.0. The opinions expressed on this site are my own and do not necessarily reflect the views of Google. -+ -+**Copyright notice:** -+Please see above. -diff --git a/src/lstack/include/lstack_lockless_queue.h b/src/lstack/include/lstack_lockless_queue.h -index c70b56a..c00d3a2 100644 ---- a/src/lstack/include/lstack_lockless_queue.h -+++ b/src/lstack/include/lstack_lockless_queue.h -@@ -1,13 +1,5 @@ - /* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. -+* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. - */ - - #ifndef __GAZELLE_LOCKLESS_QUEUE_H__ --- -2.27.0 - diff --git a/0040-fix-sock-invalid-address.patch b/0040-fix-sock-invalid-address.patch deleted file mode 100644 index 5ca2825..0000000 --- a/0040-fix-sock-invalid-address.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 912ac954d0f462418bb09d2ad91e7092d5ad37be Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 19 Apr 2022 19:10:10 +0800 -Subject: [PATCH 01/18] fix sock invalid address - -sockets pointer is allocated memory in gazelle_network_init(). -if invoke select_path before sockets pointer be initialized, sock is invalid ---- - src/lstack/api/lstack_wrap.c | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 6ee5639..0164069 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -52,10 +52,15 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd) - } - return PATH_KERNEL; - } -+ -+ if (unlikely(posix_api->is_chld)) { -+ return PATH_KERNEL; -+ } -+ - struct lwip_sock *sock = posix_api->get_socket(fd); - - /* AF_UNIX case */ -- if (!sock || unlikely(posix_api->is_chld)) { -+ if (!sock) { - return PATH_KERNEL; - } - --- -2.23.0 - diff --git a/0041-exit-lstack-process-after-ltran-instance-logout.patch b/0041-exit-lstack-process-after-ltran-instance-logout.patch deleted file mode 100644 index 806c2a0..0000000 --- a/0041-exit-lstack-process-after-ltran-instance-logout.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 336703252c327d82f49d40f79b1d1e4e65a9281e Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 19 Apr 2022 19:49:06 +0800 -Subject: [PATCH 02/18] exit lstack process after ltran instance logout - -close fd is to notify ltran to execute the lstack instance logout. -200ms is an empirical value of instance logout. ---- - src/lstack/api/lstack_signal.c | 4 +++- - src/lstack/core/lstack_control_plane.c | 9 +++++++++ - src/lstack/include/lstack_control_plane.h | 1 + - 3 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c -index f4763e8..87cbdda 100644 ---- a/src/lstack/api/lstack_signal.c -+++ b/src/lstack/api/lstack_signal.c -@@ -19,8 +19,9 @@ - #include - - #include "lstack_log.h" -+#include "lstack_control_plane.h" - --static int g_hijack_signal[] = { SIGTERM, SIGINT, SIGSEGV, SIGBUS, SIGFPE, SIGILL }; -+static int g_hijack_signal[] = { SIGTERM, SIGINT, SIGSEGV, SIGBUS, SIGFPE, SIGILL, SIGKILL}; - #define HIJACK_SIGNAL_COUNT (sizeof(g_hijack_signal) / sizeof(g_hijack_signal[0])) - #define BACKTRACE_SIZE 64 - static void dump_stack(void) -@@ -54,6 +55,7 @@ static inline bool match_hijack_signal(int sig) - static void lstack_sig_default_handler(int sig) - { - LSTACK_LOG(ERR, LSTACK, "lstack dumped,caught signal:%d\n", sig); -+ control_fd_close(); - dump_stack(); - lwip_exit(); - (void)kill(getpid(), sig); -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index c782d51..01b2ff0 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -446,6 +446,15 @@ int32_t client_reg_thrd_ring(void) - return 0; - } - -+void control_fd_close(void) -+{ -+ if (g_data_fd != 0) { -+ close(g_data_fd); -+ /* 200ms: wait ltran instance logout */ -+ rte_delay_ms(200); -+ } -+} -+ - int32_t control_init_client(bool is_reconnect) - { - int32_t ret; -diff --git a/src/lstack/include/lstack_control_plane.h b/src/lstack/include/lstack_control_plane.h -index 0af891a..1fa84e6 100644 ---- a/src/lstack/include/lstack_control_plane.h -+++ b/src/lstack/include/lstack_control_plane.h -@@ -32,5 +32,6 @@ void control_server_thread(void *arg); - bool get_register_state(void); - void thread_register_phase1(struct rpc_msg *msg); - void thread_register_phase2(struct rpc_msg *msg); -+void control_fd_close(void); - - #endif /* GAZELLE_CONTROL_PLANE_H */ --- -2.23.0 - diff --git a/0042-use-atomic-variales-to-count.patch b/0042-use-atomic-variales-to-count.patch deleted file mode 100644 index 088aba2..0000000 --- a/0042-use-atomic-variales-to-count.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 900685bd99e25f832c4aeac202dfb7d5f5075833 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 19 Apr 2022 20:01:34 +0800 -Subject: [PATCH 03/18] use atomic variales to count - -name_tick and pool_index are shared by mutiple threads. -atomic variables are required. ---- - src/lstack/core/lstack_lwip.c | 9 +++++---- - src/lstack/core/lstack_thread_rpc.c | 3 ++- - 2 files changed, 7 insertions(+), 5 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 887464d..4143f2f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -11,6 +11,7 @@ - */ - - #include -+#include - #include - #include - #include -@@ -138,25 +139,25 @@ void gazelle_init_sock(int32_t fd) - - reset_sock_data(sock); - -- sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, name_tick++); -+ sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); - if (sock->recv_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno); - return; - } - -- sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, name_tick++); -+ sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1)); - if (sock->recv_wait_free == NULL) { - LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno); - return; - } - -- sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, name_tick++); -+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1)); - if (sock->send_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } - -- sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, name_tick++); -+ sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); - if (sock->send_idle_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "idle_send create failed. errno: %d.\n", rte_errno); - return; -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 26725f7..312e192 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -10,6 +10,7 @@ - * See the Mulan PSL v2 for more details. - */ - #include -+#include - #include - #include - #include -@@ -36,7 +37,7 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - - static uint16_t pool_index = 0; - if (rpc_pool == NULL) { -- rpc_pool = create_rpc_mempool("rpc_msg", pool_index++); -+ rpc_pool = create_rpc_mempool("rpc_msg", atomic_fetch_add(&pool_index, 1)); - if (rpc_pool == NULL) { - return NULL; - } --- -2.23.0 - diff --git a/0043-re-arrange-the-program-to-invoke-rte_eth_dev_start-b.patch b/0043-re-arrange-the-program-to-invoke-rte_eth_dev_start-b.patch deleted file mode 100644 index 10624e2..0000000 --- a/0043-re-arrange-the-program-to-invoke-rte_eth_dev_start-b.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 7f4143cd462cba5499cda0434fedd498c0967623 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 19 Apr 2022 21:28:00 +0800 -Subject: [PATCH 04/18] re-arrange the program to invoke rte_eth_dev_start - before rss_setup - -in rss_setup(), the program invokes rte_eth_dev_rss_reta_update(). -this API should be invoked after rte_eth_dev_start(). ---- - src/lstack/core/lstack_dpdk.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 3f446ea..a5b2ddc 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -495,6 +495,12 @@ int32_t dpdk_ethdev_init(void) - return ret; - } - -+ ret = dpdk_ethdev_start(); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n"); -+ return ret; -+ } -+ - if (rss_enable) { - rss_setup(port_id, nb_queues); - } -@@ -604,12 +610,6 @@ int32_t init_dpdk_ethdev(void) - return -1; - } - -- ret = dpdk_ethdev_start(); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n"); -- return -1; -- } -- - if (get_global_cfg_params()->kni_switch) { - ret = dpdk_init_lstack_kni(); - if (ret < 0) { --- -2.23.0 - diff --git a/0044-delete-redundant-file.patch b/0044-delete-redundant-file.patch deleted file mode 100644 index beaeaab..0000000 --- a/0044-delete-redundant-file.patch +++ /dev/null @@ -1,183 +0,0 @@ -From f3059a5a1e2fcf5b7bfa2ad50865598f79eccf16 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 21 Apr 2022 15:24:20 +0800 -Subject: [PATCH 05/18] delete redundant file - ---- - src/lstack/include/lstack_lstack.h | 32 -------- - src/lstack/include/lstack_weakup.h | 124 ----------------------------- - 2 files changed, 156 deletions(-) - delete mode 100644 src/lstack/include/lstack_lstack.h - delete mode 100644 src/lstack/include/lstack_weakup.h - -diff --git a/src/lstack/include/lstack_lstack.h b/src/lstack/include/lstack_lstack.h -deleted file mode 100644 -index c2e6733..0000000 ---- a/src/lstack/include/lstack_lstack.h -+++ /dev/null -@@ -1,32 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef _LSTACK_H --#define _LSTACK_H -- --#if defined __GNUC__ --#define LSTACK_EXPORT_SYMBOL __attribute__((visibility("default"))) -- --#elif defined(_MSC_VER) --#define LSTACK_EXPORT_SYMBOL extern __declspec(dllexport) -- --#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) --#define LSTACK_EXPORT_SYMBOL __global -- --#else --#define LSTACK_EXPORT_SYMBOL /* unknown compiler */ --#endif -- --/* Return string describing version of currently running lstack. */ --LSTACK_EXPORT_SYMBOL const char *get_lstack_version(void); -- --#endif /* lstack.h */ -diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h -deleted file mode 100644 -index 77f3b9d..0000000 ---- a/src/lstack/include/lstack_weakup.h -+++ /dev/null -@@ -1,124 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef __GAZELLE_WEAKUP_THREAD_H__ --#define __GAZELLE_WEAKUP_THREAD_H__ -- --#include --#include "lstack_dpdk.h" -- --#define EPOLL_MAX_EVENTS 512 -- --struct weakup_poll { -- sem_t event_sem; -- struct lwip_sock *sock_list[EPOLL_MAX_EVENTS]; -- struct rte_ring *event_ring; -- struct rte_ring *self_ring; --}; -- --#define WEAKUP_MAX (32) -- --static inline void wakeup_list_sock(struct list_node *wakeup_list) --{ -- struct list_node *node, *temp; -- -- list_for_each_safe(node, temp, wakeup_list) { -- struct lwip_sock *sock = container_of(node, struct lwip_sock, wakeup_list); -- -- struct weakup_poll *weakup = sock->weakup; -- struct protocol_stack *stack = sock->stack; -- if (weakup == NULL || stack == NULL) { -- list_del_node_init(&sock->wakeup_list); -- continue; -- } -- -- int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); -- if (ret == 0) { -- list_del_node_init(&sock->wakeup_list); -- sem_post(&weakup->event_sem); -- stack->stats.lwip_events++; -- } else { -- break; -- } -- } --} -- --static inline int32_t weakup_attach_sock(struct list_node *attach_list) --{ -- struct list_node *node, *temp; -- int32_t wakeuped = -1; -- -- list_for_each_safe(node, temp, attach_list) { -- struct lwip_sock *sock = container_of(node, struct lwip_sock, attach_list); -- -- struct weakup_poll *weakup = sock->weakup; -- struct protocol_stack *stack = sock->stack; -- if (weakup == NULL || stack == NULL) { -- continue; -- } -- -- int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); -- if (ret == 0) { -- sem_post(&weakup->event_sem); -- stack->stats.lwip_events++; -- wakeuped = 0; -- } -- } -- -- return wakeuped; --} -- --static inline void weakup_thread(struct rte_ring *weakup_ring, struct list_node *wakeup_list) --{ -- struct lwip_sock *sock; -- -- for (uint32_t i = 0; i < WEAKUP_MAX; ++i) { -- int32_t ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock); -- if (ret != 0) { -- break; -- } -- -- struct weakup_poll *weakup = sock->weakup; -- struct protocol_stack *stack = sock->stack; -- if (weakup == NULL || stack == NULL) { -- continue; -- } -- -- ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock); -- if (ret == 0) { -- sem_post(&weakup->event_sem); -- stack->stats.lwip_events++; -- } -- -- /* listen notice attach sock */ -- int32_t wakeuped = -1; -- if (!list_is_empty(&sock->attach_list)) { -- wakeuped = weakup_attach_sock(&sock->attach_list); -- } -- -- /* notice any epoll enough */ -- if (ret != 0 && wakeuped != 0) { -- if (list_is_empty(&sock->wakeup_list)) { -- list_add_node(wakeup_list, &sock->wakeup_list); -- } -- break; -- } -- } --} -- --static inline __attribute__((always_inline)) --int weakup_enqueue(struct rte_ring *weakup_ring, struct lwip_sock *sock) --{ -- return rte_ring_sp_enqueue(weakup_ring, (void *)sock); --} -- --#endif --- -2.23.0 - diff --git a/0045-lstack-all-exit-move-to-init.patch b/0045-lstack-all-exit-move-to-init.patch deleted file mode 100644 index 637d8dd..0000000 --- a/0045-lstack-all-exit-move-to-init.patch +++ /dev/null @@ -1,297 +0,0 @@ -From 625c01d808ffd9a21bcd5705b7237d00acd7ee66 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 21 Apr 2022 15:34:36 +0800 -Subject: [PATCH 06/18] lstack:all exit move to init - ---- - src/lstack/core/lstack_control_plane.c | 5 +-- - src/lstack/core/lstack_dpdk.c | 23 ++++++++------ - src/lstack/core/lstack_init.c | 20 +++++++++++- - src/lstack/core/lstack_lwip.c | 4 +-- - src/lstack/core/lstack_protocol_stack.c | 37 ++++++++++++---------- - src/lstack/include/lstack_dpdk.h | 2 +- - src/lstack/include/lstack_protocol_stack.h | 4 ++- - 7 files changed, 61 insertions(+), 34 deletions(-) - -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 01b2ff0..13a2ed3 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -699,12 +699,13 @@ void control_server_thread(void *arg) - { - int32_t listenfd = control_init_server(); - if (listenfd < 0) { -- LSTACK_EXIT(1, "control_init_server failed\n"); -+ LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n"); -+ return; - } - - int32_t epfd = init_epoll(listenfd); - if (epfd < 0) { -- LSTACK_EXIT(1, "init_epoll failed\n"); -+ LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n"); - return; - } - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index a5b2ddc..aa91201 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -86,21 +86,26 @@ int32_t thread_affinity_init(int32_t cpu_id) - return 0; - } - --void dpdk_eal_init(void) -+int32_t dpdk_eal_init(void) - { - int32_t ret; - struct cfg_params *global_params = get_global_cfg_params(); - - ret = rte_eal_init(global_params->dpdk_argc, global_params->dpdk_argv); - if (ret < 0) { -- if (rte_errno == EALREADY) -+ if (rte_errno == EALREADY) { - LSTACK_PRE_LOG(LSTACK_INFO, "rte_eal_init aleady init\n"); -- else -+ /* maybe other program inited, merge init param share init */ -+ ret = 0; -+ } -+ else { - LSTACK_PRE_LOG(LSTACK_ERR, "rte_eal_init failed init, rte_errno %d\n", rte_errno); -- -- LSTACK_EXIT(1, "pthread_getaffinity_np failed\n"); -+ } -+ } else { -+ LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n"); - } -- LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n"); -+ -+ return ret; - } - - static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_mbuf, -@@ -116,13 +121,11 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - } - - /* time stamp before pbuf_custom as priv_data */ -- pthread_mutex_lock(get_mem_mutex()); - pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, - sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id()); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } -- pthread_mutex_unlock(get_mem_mutex()); - return pool; - } - -@@ -136,13 +139,13 @@ struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id) - if (ret < 0) { - return NULL; - } -- pthread_mutex_lock(get_mem_mutex()); -+ - pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL, - NULL, rte_socket_id(), 0); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } -- pthread_mutex_unlock(get_mem_mutex()); -+ - return pool; - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 774d0f3..335d834 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -48,6 +48,13 @@ - #define LSTACK_PRELOAD_NAME_LEN PATH_MAX - #define LSTACK_PRELOAD_ENV_PROC "GAZELLE_BIND_PROCNAME" - -+static volatile int32_t g_init_fail = 0; -+ -+void set_init_fail(void) -+{ -+ g_init_fail = 1; -+} -+ - struct lstack_preload { - int32_t preload_switch; - char env_procname[LSTACK_PRELOAD_NAME_LEN]; -@@ -207,7 +214,11 @@ __attribute__((constructor)) void gazelle_network_init(void) - } - ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); - } else { -- dpdk_eal_init(); -+ ret = dpdk_eal_init(); -+ if (ret < 0) { -+ LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno); -+ } -+ - ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); - } - if (ret != 0) { -@@ -248,7 +259,14 @@ __attribute__((constructor)) void gazelle_network_init(void) - * Phase 10: register core sig handler func to dumped stack */ - lstack_signal_init(); - -+ /* wait stack thread and kernel_event thread init finish */ -+ wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num); -+ if (g_init_fail) { -+ LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n"); -+ } -+ - lstack_prelog_uninit(); - posix_api->is_chld = 0; - LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n"); -+ rte_smp_mb(); - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 4143f2f..00a82fb 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -145,13 +145,13 @@ void gazelle_init_sock(int32_t fd) - return; - } - -- sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1)); -+ sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); - if (sock->recv_wait_free == NULL) { - LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno); - return; - } - -- sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1)); -+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); - if (sock->send_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index da320e2..8f0b785 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -39,19 +39,14 @@ - static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; - static struct protocol_stack_group g_stack_group = {0}; - static PER_THREAD long g_stack_tid = 0; --static pthread_mutex_t g_mem_mutex = PTHREAD_MUTEX_INITIALIZER; - -+void set_init_fail(void); - typedef void *(*stack_thread_func)(void *arg); - - #ifdef GAZELLE_USE_EPOLL_EVENT_STACK - void update_stack_events(struct protocol_stack *stack); - #endif - --pthread_mutex_t *get_mem_mutex(void) --{ -- return &g_mem_mutex; --} -- - int32_t bind_to_stack_numa(struct protocol_stack *stack) - { - int32_t ret; -@@ -248,6 +243,14 @@ static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - stack_group->stacks[queue_id] = stack; - } - -+void wait_sem_value(sem_t *sem, int32_t wait_value) -+{ -+ int32_t sem_val; -+ do { -+ sem_getvalue(sem, &sem_val); -+ } while (sem_val < wait_value); -+} -+ - static struct protocol_stack * stack_thread_init(uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); -@@ -304,10 +307,10 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - - sem_post(&stack_group->thread_phase1); - -- int32_t sem_val; -- do { -- sem_getvalue(&stack_group->ethdev_init, &sem_val); -- } while (!sem_val && !use_ltran()); -+ if (!use_ltran()) { -+ wait_sem_value(&stack_group->ethdev_init, 1); -+ } -+ - - ret = ethdev_init(stack); - if (ret != 0) { -@@ -332,10 +335,13 @@ static void* gazelle_stack_thread(void *arg) - - struct protocol_stack *stack = stack_thread_init(queue_id); - if (stack == NULL) { -- pthread_mutex_lock(&g_mem_mutex); -- LSTACK_EXIT(1, "stack_thread_init failed\n"); -- pthread_mutex_unlock(&g_mem_mutex); -+ /* exit in main thread, avoid create mempool and exit at the same time */ -+ set_init_fail(); -+ sem_post(&get_protocol_stack_group()->all_init); -+ LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%d\n", queue_id); -+ return NULL; - } -+ sem_post(&get_protocol_stack_group()->all_init); - LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); - - for (;;) { -@@ -386,10 +392,7 @@ int32_t init_protocol_stack(void) - } - } - -- int32_t thread_inited_num; -- do { -- sem_getvalue(&stack_group->thread_phase1, &thread_inited_num); -- } while (thread_inited_num < stack_group->stack_num); -+ wait_sem_value(&stack_group->thread_phase1, stack_group->stack_num); - - ret = init_stack_numa_cpuset(); - if (ret < 0) { -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index e8080e1..4295f01 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -58,7 +58,7 @@ int thread_affinity_default(void); - int thread_affinity_init(int cpu_id); - - int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num); --void dpdk_eal_init(void); -+int32_t dpdk_eal_init(void); - int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num); - struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id); - int32_t create_shared_ring(struct protocol_stack *stack); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 9753385..9852878 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -64,6 +64,7 @@ struct protocol_stack_group { - uint16_t port_id; - sem_t thread_phase1; - sem_t ethdev_init; -+ sem_t all_init; - struct rte_mempool *kni_pktmbuf_pool; - struct eth_params *eth_params; - struct protocol_stack *stacks[PROTOCOL_STACK_MAX]; -@@ -82,7 +83,6 @@ struct wakeup_poll { - }; - - long get_stack_tid(void); --pthread_mutex_t *get_mem_mutex(void); - struct protocol_stack *get_protocol_stack(void); - struct protocol_stack *get_protocol_stack_by_fd(int32_t fd); - struct protocol_stack *get_minconn_protocol_stack(void); -@@ -92,6 +92,8 @@ int32_t init_protocol_stack(void); - int32_t bind_to_stack_numa(struct protocol_stack *stack); - int32_t init_dpdk_ethdev(void); - -+void wait_sem_value(sem_t *sem, int32_t wait_value); -+ - /* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */ - void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack); - --- -2.23.0 - diff --git a/0046-clean-code-fix-huge-func.patch b/0046-clean-code-fix-huge-func.patch deleted file mode 100644 index 77a0144..0000000 --- a/0046-clean-code-fix-huge-func.patch +++ /dev/null @@ -1,356 +0,0 @@ -From 77a8fb02a7c4352fee106d0aa83500d81c20d315 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 21 Apr 2022 16:42:01 +0800 -Subject: [PATCH 07/18] clean code:fix huge func - ---- - src/lstack/core/lstack_control_plane.c | 2 +- - src/lstack/core/lstack_init.c | 101 +++++++++++++----------- - src/lstack/core/lstack_protocol_stack.c | 89 +++++++++++---------- - 3 files changed, 105 insertions(+), 87 deletions(-) - -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 13a2ed3..26a1b1c 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -705,7 +705,7 @@ void control_server_thread(void *arg) - - int32_t epfd = init_epoll(listenfd); - if (epfd < 0) { -- LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n"); -+ LSTACK_LOG(ERR, LSTACK, "init_epoll failed\n"); - return; - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 335d834..037b8fd 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -155,12 +155,52 @@ __attribute__((destructor)) void gazelle_network_exit(void) - } - } - --__attribute__((constructor)) void gazelle_network_init(void) -+static void create_control_thread(void) - { - int32_t ret; - -+ pthread_t tid; -+ if (use_ltran()) { -+ dpdk_skip_nic_init(); -+ if (control_init_client(false) != 0) { -+ LSTACK_EXIT(1, "control_init_client failed\n"); -+ } -+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); -+ } else { -+ ret = dpdk_eal_init(); -+ if (ret < 0) { -+ LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno); -+ } -+ -+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); -+ } -+ if (ret != 0) { -+ LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno); -+ } -+ -+ if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno); -+ } -+ LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n"); -+} -+ -+static void gazelle_signal_init(void) -+{ -+ /* to prevent crash , just ignore SIGPIPE when socket is closed */ -+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno); -+ LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n"); -+ } -+ -+ /* -+ * register core sig handler func to dumped stack */ -+ lstack_signal_init(); -+} -+ -+__attribute__((constructor)) void gazelle_network_init(void) -+{ - /* -- * Phase 1: Init POSXI API and prelog */ -+ * Init POSXI API and prelog */ - lstack_prelog_init("LSTACK"); - if (posix_api_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); -@@ -168,7 +208,7 @@ __attribute__((constructor)) void gazelle_network_init(void) - } - - /* -- * Phase 2: Init LD_PRELOAD */ -+ * Init LD_PRELOAD */ - if (preload_info_init() < 0) { - return; - } -@@ -177,7 +217,7 @@ __attribute__((constructor)) void gazelle_network_init(void) - } - - /* -- * Phase 3: Read configure from lstack.cfg */ -+ * Read configure from lstack.cfg */ - if (cfg_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "cfg_init failed\n"); - LSTACK_EXIT(1, "cfg_init failed\n"); -@@ -185,87 +225,56 @@ __attribute__((constructor)) void gazelle_network_init(void) - LSTACK_PRE_LOG(LSTACK_INFO, "cfg_init success\n"); - - /* -- * Phase 4: check conflict */ -+ * check conflict */ - if (check_process_conflict() < 0) { - LSTACK_PRE_LOG(LSTACK_INFO, "Have another same primary process. WARNING: Posix API will use kernel mode!\n"); - return; - } - - /* -- * Phase 5: save initial affinity */ -+ * save initial affinity */ - if (thread_affinity_default() < 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "pthread_getaffinity_np failed\n"); - LSTACK_EXIT(1, "pthread_getaffinity_np failed\n"); - } - -- /* to prevent crash , just ignore SIGPIPE when socket is closed */ -- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { -- LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno); -- LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n"); -- } -+ gazelle_signal_init(); - - /* -- * Phase 6: Init control plane and dpdk init */ -- pthread_t tid; -- if (use_ltran()) { -- dpdk_skip_nic_init(); -- if (control_init_client(false) != 0) { -- LSTACK_EXIT(1, "control_init_client failed\n"); -- } -- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); -- } else { -- ret = dpdk_eal_init(); -- if (ret < 0) { -- LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno); -- } -- -- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); -- } -- if (ret != 0) { -- LSTACK_EXIT(1, "pthread_create failed errno=%d\n", errno); -- } -- if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) { -- LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno); -- } -- LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n"); -+ * Init control plane and dpdk init */ -+ create_control_thread(); - - /* -- * Phase 7: cancel the core binding from DPDK initialization */ -+ * cancel the core binding from DPDK initialization */ - if (thread_affinity_default() < 0) { - LSTACK_EXIT(1, "pthread_setaffinity_np failed\n"); - } - - lstack_log_level_init(); -+ lstack_prelog_uninit(); - -- ret = init_protocol_stack(); -- if (ret != 0) { -+ if (init_protocol_stack() != 0) { - LSTACK_EXIT(1, "init_protocol_stack failed\n"); - } - - /* -- * Phase 8: nic */ -+ * nic */ - if (!use_ltran()) { -- ret = init_dpdk_ethdev(); -- if (ret != 0) { -+ if (init_dpdk_ethdev() != 0) { - LSTACK_EXIT(1, "init_dpdk_ethdev failed\n"); - } - } - - /* -- * Phase 9: lwip initialization */ -+ * lwip initialization */ - lwip_sock_init(); - -- /* -- * Phase 10: register core sig handler func to dumped stack */ -- lstack_signal_init(); -- - /* wait stack thread and kernel_event thread init finish */ - wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num); - if (g_init_fail) { - LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n"); - } - -- lstack_prelog_uninit(); - posix_api->is_chld = 0; - LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n"); - rte_smp_mb(); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 8f0b785..565d19b 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -217,7 +217,7 @@ static void* gazelle_weakup_thread(void *arg) - return NULL; - } - --static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id) -+static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -@@ -241,6 +241,31 @@ static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - stack_stat_init(); - - stack_group->stacks[queue_id] = stack; -+ -+ cpu_set_t cpuset; -+ CPU_ZERO(&cpuset); -+ CPU_SET(stack->cpu_id, &cpuset); -+ if (rte_thread_set_affinity(&cpuset) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -+ return -1; -+ } -+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -+ -+ stack->socket_id = numa_node_of_cpu(stack->cpu_id); -+ if (stack->socket_id < 0) { -+ LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n"); -+ return -1; -+ } -+ -+ if (pktmbuf_pool_init(stack, stack_group->stack_num) != 0) { -+ return -1; -+ } -+ -+ if (create_shared_ring(stack) != 0) { -+ return -1; -+ } -+ -+ return 0; - } - - void wait_sem_value(sem_t *sem, int32_t wait_value) -@@ -260,33 +285,8 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); - return NULL; - } -- init_stack_value(stack, queue_id); -- -- cpu_set_t cpuset; -- CPU_ZERO(&cpuset); -- CPU_SET(stack->cpu_id, &cpuset); -- if (rte_thread_set_affinity(&cpuset) != 0) { -- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -- free(stack); -- return NULL; -- } -- RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -- -- stack->socket_id = numa_node_of_cpu(stack->cpu_id); -- if (stack->socket_id < 0) { -- LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n"); -- free(stack); -- return NULL; -- } - -- int32_t ret = pktmbuf_pool_init(stack, stack_group->stack_num); -- if (ret != 0) { -- free(stack); -- return NULL; -- } -- -- ret = create_shared_ring(stack); -- if (ret != 0) { -+ if (init_stack_value(stack, queue_id) != 0) { - free(stack); - return NULL; - } -@@ -298,8 +298,7 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - tcpip_init(NULL, NULL); - - if (use_ltran()) { -- ret = client_reg_thrd_ring(); -- if (ret != 0) { -+ if (client_reg_thrd_ring() != 0) { - free(stack); - return NULL; - } -@@ -311,15 +310,13 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - wait_sem_value(&stack_group->ethdev_init, 1); - } - -- -- ret = ethdev_init(stack); -- if (ret != 0) { -+ if (ethdev_init(stack) != 0) { - free(stack); - return NULL; - } - - if (stack_group->wakeup_enable) { -- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); -+ int32_t ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); - if (ret != 0) { - free(stack); - return NULL; -@@ -363,25 +360,37 @@ static void* gazelle_stack_thread(void *arg) - return NULL; - } - --int32_t init_protocol_stack(void) -+static int32_t init_protocol_sem(void) - { -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); - int32_t ret; -- -- stack_group->stack_num = get_global_cfg_params()->num_cpu; -- stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); - - if (!use_ltran()) { - ret = sem_init(&stack_group->ethdev_init, 0, 0); - if (ret < 0) { -- LSTACK_LOG(ERR, PORT, "sem_init failed\n"); -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); - return -1; - } - } - - ret = sem_init(&stack_group->thread_phase1, 0, 0); - if (ret < 0) { -- LSTACK_LOG(ERR, PORT, "sem_init failed\n"); -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+int32_t init_protocol_stack(void) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ int32_t ret; -+ -+ stack_group->stack_num = get_global_cfg_params()->num_cpu; -+ stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ -+ if (init_protocol_sem() != 0) { - return -1; - } - --- -2.23.0 - diff --git a/0047-add-kernel-path-in-epoll-funcs.patch b/0047-add-kernel-path-in-epoll-funcs.patch deleted file mode 100644 index 041e448..0000000 --- a/0047-add-kernel-path-in-epoll-funcs.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 17fa541e456acccae61669fcc403b44e4aabb2d5 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 21 Apr 2022 16:59:44 +0800 -Subject: [PATCH 08/18] add kernel path in epoll funcs - ---- - src/lstack/api/lstack_wrap.c | 21 ++++++++++++++++++--- - 1 file changed, 18 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 0164069..f623da3 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -77,6 +77,15 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd) - - static inline int32_t do_epoll_create(int32_t size) - { -+ if (posix_api == NULL) { -+ /* link liblstack.so using LD_PRELOAD mode will read liblstack.so, -+ poisx_api need to be initialized here */ -+ if (posix_api_init() != 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); -+ } -+ return posix_api->epoll_create_fn(size); -+ } -+ - if (unlikely(posix_api->is_chld)) { - return posix_api->epoll_create_fn(size); - } -@@ -90,16 +99,22 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - -+ struct lwip_sock *sock = get_socket_by_fd(epfd); -+ if (sock == NULL || sock->wakeup == NULL) { -+ return posix_api->epoll_ctl_fn(epfd, op, fd, event); -+ } -+ - return lstack_epoll_ctl(epfd, op, fd, event); - } - - static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { -- if (events == NULL || maxevents == 0) { -- GAZELLE_RETURN(EINVAL); -+ if (unlikely(posix_api->is_chld)) { -+ return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - -- if (unlikely(posix_api->is_chld)) { -+ struct lwip_sock *sock = get_socket_by_fd(epfd); -+ if (sock == NULL || sock->wakeup == NULL) { - return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - --- -2.23.0 - diff --git a/0048-refactor-kernel-event-poll-epoll.patch b/0048-refactor-kernel-event-poll-epoll.patch deleted file mode 100644 index 5580bef..0000000 --- a/0048-refactor-kernel-event-poll-epoll.patch +++ /dev/null @@ -1,836 +0,0 @@ -From a74d5b38b2021397d13b13aaa30f41f69be6f475 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 21 Apr 2022 17:21:59 +0800 -Subject: [PATCH 09/18] refactor kernel event poll/epoll - ---- - src/lstack/api/lstack_epoll.c | 343 +++++++++++++++------ - src/lstack/api/lstack_wrap.c | 21 +- - src/lstack/core/lstack_dpdk.c | 4 +- - src/lstack/core/lstack_init.c | 2 +- - src/lstack/core/lstack_lwip.c | 1 + - src/lstack/core/lstack_protocol_stack.c | 85 ++++- - src/lstack/include/lstack_cfg.h | 1 - - src/lstack/include/lstack_protocol_stack.h | 8 +- - src/lstack/include/posix/lstack_epoll.h | 24 ++ - 9 files changed, 350 insertions(+), 139 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index b8d53f6..cba67ea 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -32,10 +33,14 @@ - #include "gazelle_base_func.h" - #include "lstack_lwip.h" - #include "lstack_protocol_stack.h" -+#include "posix/lstack_epoll.h" - - #define EPOLL_KERNEL_INTERVAL 10 /* ms */ --#define EPOLL_NSEC_TO_SEC 1000000000 -+#define SEC_TO_NSEC 1000000000 -+#define SEC_TO_MSEC 1000 -+#define MSEC_TO_NSEC 1000000 - #define EPOLL_MAX_EVENTS 512 -+#define POLL_KERNEL_EVENTS 32 - - static PER_THREAD struct wakeup_poll g_wakeup_poll = {0}; - static bool g_use_epoll = false; /* FIXME: when no epoll close prepare event for performance testing */ -@@ -149,12 +154,12 @@ int32_t lstack_epoll_create(int32_t size) - posix_api->close_fn(fd); - GAZELLE_RETURN(EINVAL); - } -- - memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)); -- sem_init(&wakeup->event_sem, 0, 0); - -- sock->wakeup = wakeup; - init_list_node(&wakeup->event_list); -+ wakeup->epollfd = fd; -+ sem_init(&wakeup->event_sem, 0, 0); -+ sock->wakeup = wakeup; - - g_use_epoll = true; - return fd; -@@ -162,6 +167,8 @@ int32_t lstack_epoll_create(int32_t size) - - int32_t lstack_epoll_close(int32_t fd) - { -+ posix_api->close_fn(fd); -+ - struct lwip_sock *sock = get_socket_by_fd(fd); - if (sock == NULL) { - LSTACK_LOG(ERR, LSTACK, "fd=%d sock is NULL errno=%d\n", fd, errno); -@@ -176,6 +183,43 @@ int32_t lstack_epoll_close(int32_t fd) - return 0; - } - -+static uint16_t find_max_cnt_stack(int32_t *stack_count, uint16_t stack_num, struct protocol_stack *last_stack) -+{ -+ uint16_t max_index = 0; -+ bool all_same_cnt = true; -+ -+ for (uint16_t i = 1; i < stack_num; i++) { -+ if (stack_count[i] != stack_count[0]) { -+ all_same_cnt = false; -+ } -+ -+ if (stack_count[i] > stack_count[max_index]) { -+ max_index = i; -+ } -+ } -+ -+ /* all stack same, don't change */ -+ if (all_same_cnt && last_stack) { -+ return last_stack->queue_id; -+ } -+ -+ /* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0.*/ -+ static uint16_t tick = 0; -+ if (all_same_cnt && stack_num) { -+ max_index = atomic_fetch_add(&tick, 1) % stack_num; -+ } -+ -+ return max_index; -+} -+ -+static void update_epoll_max_stack(struct wakeup_poll *wakeup) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ uint16_t bind_id = find_max_cnt_stack(wakeup->stack_fd_cnt, stack_group->stack_num, wakeup->max_stack); -+ -+ wakeup->max_stack = stack_group->stacks[bind_id]; -+} -+ - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event) - { - LSTACK_LOG(DEBUG, LSTACK, "op=%d events: fd: %d\n", op, fd); -@@ -185,35 +229,38 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - GAZELLE_RETURN(EINVAL); - } - -+ struct lwip_sock *epoll_sock = get_socket_by_fd(epfd); -+ if (epoll_sock == NULL || epoll_sock->wakeup == NULL) { -+ return posix_api->epoll_ctl_fn(epfd, op, fd, event); -+ } -+ - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -+ epoll_sock->wakeup->have_kernel_fd = true; - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - - if (CONN_TYPE_HAS_HOST(sock->conn)) { -+ epoll_sock->wakeup->have_kernel_fd = true; - int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event); - if (ret < 0) { - return ret; - } - } - -- struct lwip_sock *epoll_sock = get_socket_by_fd(epfd); -- if (epoll_sock == NULL || epoll_sock->wakeup == NULL) { -- LSTACK_LOG(ERR, LSTACK, "epfd=%d\n", fd); -- GAZELLE_RETURN(EINVAL); -- } -- -- uint32_t events = event->events | EPOLLERR | EPOLLHUP; - do { - switch (op) { - case EPOLL_CTL_ADD: - sock->wakeup = epoll_sock->wakeup; -+ if (sock->stack) { -+ epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]++; -+ } - if (list_is_empty(&sock->event_list)) { - list_add_node(&sock->wakeup->event_list, &sock->event_list); - } - /* fall through */ - case EPOLL_CTL_MOD: -- sock->epoll_events = events; -+ sock->epoll_events = event->events | EPOLLERR | EPOLLHUP; - sock->ep_data = event->data; - if (sock->conn && NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - raise_pending_events(sock); -@@ -222,6 +269,9 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - case EPOLL_CTL_DEL: - list_del_node_init(&sock->event_list); - sock->epoll_events = 0; -+ if (sock->stack) { -+ epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]--; -+ } - break; - default: - GAZELLE_RETURN(EINVAL); -@@ -230,6 +280,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - sock = get_socket(fd); - } while (fd > 0 && sock != NULL); - -+ update_epoll_max_stack(epoll_sock->wakeup); - return 0; - } - -@@ -346,129 +397,196 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - return event_num; - } - --static inline bool have_kernel_fd(int32_t epfd, struct pollfd *fds, nfds_t nfds) -+static void ms_to_timespec(struct timespec *timespec, int32_t timeout) - { -- /* when epfd > 0 is epoll type */ -- for (uint32_t i = 0; i < nfds && epfd < 0; i++) { -- if (get_socket(fds[i].fd) == NULL) { -- return true; -+ clock_gettime(CLOCK_REALTIME, timespec); -+ timespec->tv_sec += timeout / SEC_TO_MSEC; -+ timespec->tv_nsec += (timeout % SEC_TO_MSEC) * MSEC_TO_NSEC; -+ timespec->tv_sec += timespec->tv_nsec / SEC_TO_NSEC; -+ timespec->tv_nsec = timespec->tv_nsec % SEC_TO_NSEC; -+} -+ -+static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack, -+ struct protocol_stack *new_stack) -+{ -+ if (old_stack) { -+ if (posix_api->epoll_ctl_fn(old_stack->epollfd, EPOLL_CTL_DEL, wakeup->epollfd, NULL) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); - } - } - -- return false; -+ /* avoid kernel thread post too much, use EPOLLET */ -+ struct epoll_event event; -+ event.data.ptr = &wakeup->event_sem; -+ event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET; -+ if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -+ } - } - --static inline int32_t poll_kernel_event(struct pollfd *fds, nfds_t nfds) -+static void epoll_bind_statck(struct wakeup_poll *wakeup) - { -- int32_t event_num = 0; -- -- for (uint32_t i = 0; i < nfds; i++) { -- /* lwip event */ -- if (get_socket(fds[i].fd) != NULL || fds[i].fd < 0) { -- continue; -- } -- -- int32_t ret = posix_api->poll_fn(&fds[i], 1, 0); -- if (ret < 0) { -- if (errno != EINTR) { -- return ret; -- } -- } else { -- event_num += ret; -- } -+ /* all fd is kernel, set rand stack */ -+ if (wakeup->bind_stack == NULL && wakeup->max_stack== NULL) { -+ update_epoll_max_stack(wakeup); - } - -- return event_num; -+ if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) { -+ bind_to_stack_numa(wakeup->max_stack); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ wakeup->bind_stack = wakeup->max_stack; -+ } - } - --static int32_t get_event(struct wakeup_poll *wakeup, int32_t epfd, void *out, int32_t maxevents, int32_t timeout) -+int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { -- struct pollfd *fds = (struct pollfd *)out; -- struct epoll_event *events = (struct epoll_event *)out; -- bool have_kernel = have_kernel_fd(epfd, fds, maxevents); -+ struct lwip_sock *sock = get_socket_by_fd(epfd); -+ if (sock == NULL || sock->wakeup == NULL) { -+ return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); -+ } -+ - int32_t event_num = 0; -- int32_t poll_time = 0; - int32_t ret; - -- /* when epfd > 0 is epoll type */ -+ struct timespec epoll_time; -+ if (timeout >= 0) { -+ ms_to_timespec(&epoll_time, timeout); -+ } -+ -+ epoll_bind_statck(sock->wakeup); -+ - do { -- event_num += (epfd > 0) ? epoll_lwip_event(wakeup, &events[event_num], maxevents - event_num) : -- poll_lwip_event(fds, maxevents); -- -- if (have_kernel) { -- int32_t event_kernel_num = (epfd > 0) ? -- posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0) : -- poll_kernel_event(fds, maxevents); -- if (event_kernel_num < 0) { -- return event_kernel_num; -- } -- event_num += event_kernel_num; -- if (timeout >= 0 && poll_time >= timeout) { -- break; -- } -- poll_time += EPOLL_KERNEL_INTERVAL; -+ event_num += epoll_lwip_event(sock->wakeup, &events[event_num], maxevents - event_num); -+ -+ if (sock->wakeup->have_kernel_fd) { -+ event_num += posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0); - } - - if (event_num > 0) { - break; - } - -- int32_t interval = (have_kernel) ? EPOLL_KERNEL_INTERVAL : timeout; -- struct timespec epoll_interval; -- clock_gettime(CLOCK_REALTIME, &epoll_interval); -- epoll_interval.tv_sec += interval / 1000; -- epoll_interval.tv_nsec += (interval % 1000) * 1000000; -- epoll_interval.tv_sec += epoll_interval.tv_nsec / 1000000000; -- epoll_interval.tv_nsec = epoll_interval.tv_nsec % 1000000000; -- -- if (timeout < 0 && !have_kernel) { -- ret = sem_wait(&wakeup->event_sem); -+ if (timeout < 0) { -+ ret = sem_wait(&sock->wakeup->event_sem); - } else { -- ret = sem_timedwait(&wakeup->event_sem, &epoll_interval); -+ ret = sem_timedwait(&sock->wakeup->event_sem, &epoll_time); - } -- -- if (!have_kernel && ret < 0) { -- break; -- } -- } while (event_num <= maxevents); -+ } while (ret == 0); - - return event_num; - } - --int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) -+static void init_poll_wakeup_data(struct wakeup_poll *wakeup) - { -- /* avoid the starvation of epoll events from both netstack */ -- maxevents = LWIP_MIN(LWIP_EPOOL_MAX_EVENTS, maxevents); -+ sem_init(&wakeup->event_sem, 0, 0); - -- struct lwip_sock *sock = get_socket_by_fd(epfd); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -+ wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd)); -+ if (wakeup->last_fds == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - -- if (sock->wakeup == NULL) { -- return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); -+ wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event)); -+ if (wakeup->events == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - -- return get_event(sock->wakeup, epfd, events, maxevents, timeout); -+ wakeup->last_max_nfds = POLL_KERNEL_EVENTS; -+ -+ wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS); -+ if (wakeup->epollfd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_create_fn errno=%d\n", errno); -+ } - } - --static void poll_init(struct pollfd *fds, nfds_t nfds, struct wakeup_poll *wakeup) -+static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds) - { -- int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ wakeup->last_fds = realloc(wakeup->last_fds, nfds * sizeof(struct pollfd)); -+ if (wakeup->last_fds == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -+ } -+ -+ wakeup->events = realloc(wakeup->events, nfds * sizeof(struct epoll_event)); -+ if (wakeup->events == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -+ } -+ -+ wakeup->last_max_nfds = nfds; -+ memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd)); -+} -+ -+static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -+ -+ if (wakeup->bind_stack && wakeup->bind_stack->queue_id == bind_id) { -+ return; -+ } - -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ bind_to_stack_numa(stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; -+} -+ -+static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struct pollfd *new_fd) -+{ -+ posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_DEL, wakeup->last_fds[index].fd, NULL); -+ -+ if (new_fd == NULL) { -+ return; -+ } -+ -+ struct epoll_event event; -+ event.data.u32 = index; -+ event.events = new_fd->events; -+ if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -+ } -+ -+ wakeup->last_fds[index].fd = new_fd->fd; -+ wakeup->last_fds[index].events = new_fd->events; -+ -+ wakeup->have_kernel_fd = true; -+} -+ -+static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds) -+{ - if (!wakeup->init) { - wakeup->init = true; -- sem_init(&wakeup->event_sem, 0, 0); -+ init_poll_wakeup_data(wakeup); - } else { - while (sem_trywait(&wakeup->event_sem) == 0) {} - } - -+ if (nfds > wakeup->last_max_nfds) { -+ resize_kernel_poll(wakeup, nfds); -+ } -+ -+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ int32_t poll_change = 0; -+ -+ /* poll fds num less, del old fd */ -+ for (uint32_t i = nfds; i < wakeup->last_nfds; i++) { -+ update_kernel_poll(wakeup, i, NULL); -+ poll_change = 1; -+ } -+ - for (uint32_t i = 0; i < nfds; i++) { -- int32_t fd = fds[i].fd; - fds[i].revents = 0; - -+ if (fds[i].fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) { -+ continue; -+ } -+ poll_change = 1; -+ -+ int32_t fd = fds[i].fd; -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL || CONN_TYPE_HAS_HOST(sock->conn)) { -+ update_kernel_poll(wakeup, i, fds + i); -+ } -+ - do { -- struct lwip_sock *sock = get_socket(fd); -+ sock = get_socket(fd); - if (sock == NULL || sock->conn == NULL) { - break; - } -@@ -481,25 +599,50 @@ static void poll_init(struct pollfd *fds, nfds_t nfds, struct wakeup_poll *wakeu - } while (fd > 0); - } - -- if (wakeup->bind_stack) { -+ wakeup->last_nfds = nfds; -+ if (poll_change == 0) { - return; - } - -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- uint32_t bind_id = 0; -- for (uint32_t i = 0; i < stack_group->stack_num; i++) { -- if (stack_count[i] > stack_count[bind_id]) { -- bind_id = i; -- } -- } -- -- bind_to_stack_numa(stack_group->stacks[bind_id]); -- wakeup->bind_stack = stack_group->stacks[bind_id]; -+ poll_bind_statck(wakeup, stack_count); - } - - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - { -- poll_init(fds, nfds, &g_wakeup_poll); -+ poll_init(&g_wakeup_poll, fds, nfds); - -- return get_event(&g_wakeup_poll, -1, fds, nfds, timeout); -+ int32_t event_num = 0; -+ int32_t ret; -+ -+ struct timespec poll_time; -+ if (timeout >= 0) { -+ ms_to_timespec(&poll_time, timeout); -+ } -+ -+ /* when epfd > 0 is epoll type */ -+ do { -+ event_num += poll_lwip_event(fds, nfds); -+ -+ /* reduce syscall epoll_wait */ -+ if (g_wakeup_poll.have_kernel_fd) { -+ int32_t kernel_num = posix_api->epoll_wait_fn(g_wakeup_poll.epollfd, g_wakeup_poll.events, nfds, 0); -+ for (int32_t i = 0; i < kernel_num; i++) { -+ uint32_t index = g_wakeup_poll.events[i].data.u32; -+ fds[index].revents = g_wakeup_poll.events[i].events; -+ } -+ event_num += kernel_num >= 0 ? kernel_num : 0; -+ } -+ -+ if (event_num > 0) { -+ break; -+ } -+ -+ if (timeout < 0) { -+ ret = sem_wait(&g_wakeup_poll.event_sem); -+ } else { -+ ret = sem_timedwait(&g_wakeup_poll.event_sem, &poll_time); -+ } -+ } while (ret == 0); -+ -+ return event_num; - } -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index f623da3..bf5dcb4 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -45,8 +45,7 @@ enum KERNEL_LWIP_PATH { - static inline enum KERNEL_LWIP_PATH select_path(int fd) - { - if (posix_api == NULL) { -- /* link liblstack.so using LD_PRELOAD mode will read liblstack.so, -- poisx_api need to be initialized here */ -+ /* posix api maybe call before gazelle init */ - if (posix_api_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); - } -@@ -78,8 +77,7 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd) - static inline int32_t do_epoll_create(int32_t size) - { - if (posix_api == NULL) { -- /* link liblstack.so using LD_PRELOAD mode will read liblstack.so, -- poisx_api need to be initialized here */ -+ /* posix api maybe call before gazelle init */ - if (posix_api_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); - } -@@ -99,11 +97,6 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - -- struct lwip_sock *sock = get_socket_by_fd(epfd); -- if (sock == NULL || sock->wakeup == NULL) { -- return posix_api->epoll_ctl_fn(epfd, op, fd, event); -- } -- - return lstack_epoll_ctl(epfd, op, fd, event); - } - -@@ -113,11 +106,6 @@ static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, in - return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - -- struct lwip_sock *sock = get_socket_by_fd(epfd); -- if (sock == NULL || sock->wakeup == NULL) { -- return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); -- } -- - if (epfd < 0) { - GAZELLE_RETURN(EBADF); - } -@@ -362,6 +350,11 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_ - - static inline int32_t do_close(int32_t s) - { -+ struct lwip_sock *sock = get_socket_by_fd(s); -+ if (sock && sock->wakeup && sock->wakeup->epollfd == s) { -+ return lstack_epoll_close(s); -+ } -+ - if (select_path(s) == PATH_KERNEL) { - return posix_api->close_fn(s); - } -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index aa91201..cdd2c05 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -95,8 +95,8 @@ int32_t dpdk_eal_init(void) - if (ret < 0) { - if (rte_errno == EALREADY) { - LSTACK_PRE_LOG(LSTACK_INFO, "rte_eal_init aleady init\n"); -- /* maybe other program inited, merge init param share init */ -- ret = 0; -+ /* maybe other program inited, merge init param share init */ -+ ret = 0; - } - else { - LSTACK_PRE_LOG(LSTACK_ERR, "rte_eal_init failed init, rte_errno %d\n", rte_errno); -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 037b8fd..f8e96bf 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -270,7 +270,7 @@ __attribute__((constructor)) void gazelle_network_init(void) - lwip_sock_init(); - - /* wait stack thread and kernel_event thread init finish */ -- wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num); -+ wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num * 2); - if (g_init_fail) { - LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n"); - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 00a82fb..8544ef7 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -29,6 +29,7 @@ - #include "lstack_log.h" - #include "lstack_dpdk.h" - #include "lstack_stack_stat.h" -+#include "posix/lstack_epoll.h" - #include "lstack_lwip.h" - - #define HALF_DIVISOR (2) -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 565d19b..eb975c0 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -35,6 +35,7 @@ - #define READ_LIST_MAX 32 - #define SEND_LIST_MAX 32 - #define HANDLE_RPC_MSG_MAX 32 -+#define KERNEL_EPOLL_MAX 256 - - static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; - static struct protocol_stack_group g_stack_group = {0}; -@@ -43,9 +44,6 @@ static PER_THREAD long g_stack_tid = 0; - void set_init_fail(void); - typedef void *(*stack_thread_func)(void *arg); - --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK --void update_stack_events(struct protocol_stack *stack); --#endif - - int32_t bind_to_stack_numa(struct protocol_stack *stack) - { -@@ -206,6 +204,10 @@ static void* gazelle_weakup_thread(void *arg) - LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - - for (;;) { -+ if (rte_ring_count(stack->wakeup_ring) == 0) { -+ continue; -+ } -+ - sem_t *event_sem; - if (rte_ring_sc_dequeue(stack->wakeup_ring, (void **)&event_sem)) { - continue; -@@ -268,6 +270,61 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - return 0; - } - -+static void* gazelle_kernel_event(void *arg) -+{ -+ uint16_t queue_id = *(uint16_t *)arg; -+ -+ int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); -+ if (epoll_fd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "queue_id=%d epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -+ /* exit in main thread, avoid create mempool and exit at the same time */ -+ set_init_fail(); -+ sem_post(&get_protocol_stack_group()->all_init); -+ return NULL; -+ } -+ -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -+ stack->epollfd = epoll_fd; -+ -+ sem_post(&get_protocol_stack_group()->all_init); -+ LSTACK_LOG(INFO, LSTACK, "kernel_event_%02d start\n", stack->queue_id); -+ -+ struct epoll_event events[KERNEL_EPOLL_MAX]; -+ for (;;) { -+ int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1); -+ if (event_num <= 0) { -+ continue; -+ } -+ -+ for (int32_t i = 0; i < event_num; i++) { -+ if (events[i].data.ptr) { -+ sem_post((sem_t *)events[i].data.ptr); -+ } -+ } -+ } -+ -+ return NULL; -+} -+ -+static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack) -+{ -+ int32_t ret; -+ -+ if (stack_group->wakeup_enable) { -+ ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); -+ return ret; -+ } -+ } -+ -+ ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -+ } -+ return ret; -+} -+ - void wait_sem_value(sem_t *sem, int32_t wait_value) - { - int32_t sem_val; -@@ -315,12 +372,9 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - return NULL; - } - -- if (stack_group->wakeup_enable) { -- int32_t ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); -- if (ret != 0) { -- free(stack); -- return NULL; -- } -+ if (create_companion_thread(stack_group, stack) != 0) { -+ free(stack); -+ return NULL; - } - - return stack; -@@ -338,6 +392,7 @@ static void* gazelle_stack_thread(void *arg) - LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%d\n", queue_id); - return NULL; - } -+ - sem_post(&get_protocol_stack_group()->all_init); - LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); - -@@ -351,10 +406,6 @@ static void* gazelle_stack_thread(void *arg) - send_stack_list(stack, SEND_LIST_MAX); - - sys_timer_run(); -- --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -- update_stack_events(stack); --#endif - } - - return NULL; -@@ -378,7 +429,13 @@ static int32_t init_protocol_sem(void) - LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); - return -1; - } -- -+ -+ ret = sem_init(&stack_group->all_init, 0, 0); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -+ return -1; -+ } -+ - return 0; - } - -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 345a373..987828d 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -33,7 +33,6 @@ - #define LOG_DIR_PATH PATH_MAX - #define LOG_LEVEL_LEN 16 - #define GAZELLE_MAX_NUMA_NODES 8 --#define LWIP_EPOOL_MAX_EVENTS 512 - - /* Default value of low power mode parameters */ - #define LSTACK_LPM_DETECT_MS_MIN (5 * 1000) -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 9852878..bc4e4bd 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -51,6 +51,7 @@ struct protocol_stack { - struct list_node send_list; - struct list_node event_list; - pthread_spinlock_t event_lock; -+ int32_t epollfd; /* kernel event thread epoll fd */ - - struct gazelle_stat_pkts stats; - struct gazelle_stack_latency latency; -@@ -75,13 +76,6 @@ struct protocol_stack_group { - uint64_t call_alloc_fail; - }; - --struct wakeup_poll { -- bool init; -- struct protocol_stack *bind_stack; -- struct list_node event_list; /* epoll temp use poll */ -- sem_t event_sem; --}; -- - long get_stack_tid(void); - struct protocol_stack *get_protocol_stack(void); - struct protocol_stack *get_protocol_stack_by_fd(int32_t fd); -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index cac640b..a83f41f 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -18,6 +18,30 @@ extern "C" { - #endif - - #include -+#include -+#include -+ -+#include "lstack_protocol_stack.h" -+ -+struct wakeup_poll { -+ bool init; -+ struct protocol_stack *bind_stack; -+ sem_t event_sem; -+ -+ int32_t epollfd; -+ bool have_kernel_fd; -+ -+ /* poll */ -+ struct pollfd *last_fds; -+ nfds_t last_nfds; -+ nfds_t last_max_nfds; -+ struct epoll_event *events; -+ -+ /* epoll */ -+ int32_t stack_fd_cnt[PROTOCOL_STACK_MAX]; -+ struct protocol_stack *max_stack; -+ struct list_node event_list; /* epoll temp use */ -+}; - - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); --- -2.23.0 - diff --git a/0049-post-thread_phase1-sem-to-avoid-block-main-thread-wh.patch b/0049-post-thread_phase1-sem-to-avoid-block-main-thread-wh.patch deleted file mode 100644 index cccd67d..0000000 --- a/0049-post-thread_phase1-sem-to-avoid-block-main-thread-wh.patch +++ /dev/null @@ -1,39 +0,0 @@ -From e0d26480fc3919affe10b55ccbb5837aa88c5c57 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 16 May 2022 18:34:55 +0800 -Subject: [PATCH 10/18] post thread_phase1 sem to avoid block main thread when - stack error - ---- - src/lstack/core/lstack_protocol_stack.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index eb975c0..88513ba 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -339,11 +339,13 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - - struct protocol_stack *stack = malloc(sizeof(*stack)); - if (stack == NULL) { -+ sem_post(&stack_group->thread_phase1); - LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); - return NULL; - } - - if (init_stack_value(stack, queue_id) != 0) { -+ sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } -@@ -356,6 +358,7 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - - if (use_ltran()) { - if (client_reg_thrd_ring() != 0) { -+ sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } --- -2.23.0 - diff --git a/0050-adjust-the-number-of-RX-TX-mbufs-of-each-stack-threa.patch b/0050-adjust-the-number-of-RX-TX-mbufs-of-each-stack-threa.patch deleted file mode 100644 index 7d111bb..0000000 --- a/0050-adjust-the-number-of-RX-TX-mbufs-of-each-stack-threa.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 98f76a2d2d512338d40cd435b4a75f6989aa13bf Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 16 May 2022 18:49:18 +0800 -Subject: [PATCH 11/18] adjust the number of RX/TX mbufs of each stack thread - ---- - src/lstack/core/lstack_dpdk.c | 4 ++-- - src/lstack/include/lstack_dpdk.h | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index cdd2c05..df0332b 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -175,13 +175,13 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ, -+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF, RX_MBUF_CACHE_SZ, - stack->queue_id); - if (stack->rx_pktmbuf_pool == NULL) { - return -1; - } - -- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ, -+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF, TX_MBUF_CACHE_SZ, - stack->queue_id); - if (stack->tx_pktmbuf_pool == NULL) { - return -1; -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 4295f01..bb9be21 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -23,7 +23,7 @@ - #include "dpdk_common.h" - struct protocol_stack; - --#define RX_NB_MBUF ((5 * MAX_CLIENTS) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) -+#define RX_NB_MBUF ((5 * (MAX_CLIENTS / 4)) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) - #define RX_MBUF_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define TX_NB_MBUF (128 * DEFAULT_RING_SIZE) - #define TX_MBUF_CACHE_SZ (DEFAULT_RING_SIZE) --- -2.23.0 - diff --git a/0051-modify-README.patch b/0051-modify-README.patch deleted file mode 100644 index 1eff3ba..0000000 --- a/0051-modify-README.patch +++ /dev/null @@ -1,365 +0,0 @@ -From 981a5ddaa7708b7e2c34fc52dae592b703fd64f2 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Fri, 20 May 2022 17:14:07 +0800 -Subject: [PATCH 2/6] modify readme - ---- - README.md | 262 ++++++++++++++++++++++++---------------------------- - 2 files changed, 121 insertions(+), 404 deletions(-) - delete mode 100644 Gazelle.md - -diff --git a/README.md b/README.md -index 5a99633..61f298c 100644 ---- a/README.md -+++ b/README.md -@@ -1,90 +1,75 @@ --gazelle -+# 用户态协议栈Gazelle用户指南 - --# gazelle -+## 简介 - --## Introduction --gazelle是高性能的用户态协议栈,通过dpdk在用户态直接读写网卡报文,共享大页内存传递报文,并使用轻量级lwip协议栈。能够大幅提高应用的网络IO吞吐能力. -+Gazelle是一款高性能用户态协议栈。它基于DPDK在用户态直接读写网卡报文,共享大页内存传递报文,使用轻量级LwIP协议栈。能够大幅提高应用的网络I/O吞吐能力。专注于数据库网络性能加速,如MySQL、redis等。 -+- 高性能 -+报文零拷贝,无锁,灵活scale-out,自适应调度。 -+- 通用性 -+完全兼容POSIX,零修改,适用不同类型的应用。 - --## Compile --- 编译依赖软件包 --cmake gcc-c++ lwip dpdk-devel(>=21.11-2) --numactl-devel libpcap-devel libconfig-devel libboundscheck rpm-build --- 编译 --``` sh --#创建目录 --mkdir -p ~/rpmbuild/SPECS --mkdir -p ~/rpmbuild/SOURCES -- --#创建压缩包 --mkdir gazelle-1.0.0 --mv build gazelle-1.0.0 --mv src gazelle-1.0.0 --tar zcvf gazelle-1.0.0.tar.gz gazelle-1.0.0/ -- --#编包 --mv gazelle-1.0.0.tar.gz ~/rpmbuild/SPECS --cp gazelle.spec ~/rpmbuild/SPECS --cd ~/rpmbuild/SPECS --rpmbuild -bb gazelle.spec -- --#编出的包 --ls ~/rpmbuild/RPMS --``` -+单进程且网卡支持多队列时,只需使用liblstack.so有更短的报文路径。其余场景使用ltran进程分发报文到各个线程。 - --## Install --``` sh -+## 安装 -+配置openEuler的yum源,直接使用yum命令安装 -+```sh - #dpdk >= 21.11-2 - yum install dpdk - yum install libconfig --yum install numacttl -+yum install numactl - yum install libboundscheck - yum install libpcap - yum install gazelle -- - ``` - --## Use --### 1. 安装ko模块 -+## 使用方法 -+配置运行环境,使用Gazelle加速应用程序步骤如下: -+### 1. 使用root权限安装ko -+根据实际情况选择使用ko,提供虚拟网口、绑定网卡到用户态功能。 -+若使用虚拟网口功能,则使用rte_kni.ko - ``` sh --modprobe uio --insmod /usr/lib/modules/5.10.0-54.0.0.27.oe1.x86_64/extra/dpdk/igb_uio.ko --insmod /usr/lib/modules/5.10.0-54.0.0.27.oe1.x86_64/extra/dpdk/rte_kni.ko carrier="on" -+modprobe rte_kni carrier="on" -+``` -+网卡从内核驱动绑为用户态驱动的ko,根据实际情况选择一种 -+``` sh -+#若IOMMU能使用 -+modprobe vfio-pci -+ -+#若IOMMU不能使用,且VFIO支持noiommu -+modprobe vfio enable_unsafe_noiommu_mode=1 -+modprobe vfio-pci -+ -+#其它情况 -+modprobe igb_uio - ``` - -+ - ### 2. dpdk绑定网卡 --- 对于虚拟网卡或一般物理网卡,绑定到驱动igb_uio -+将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。 - ``` sh -+#使用vfio-pci -+dpdk-devbind -b vfio-pci enp3s0 -+ -+#使用igb_uio - dpdk-devbind -b igb_uio enp3s0 - ``` --- 1822网卡绑定到驱动vfio-pci(由kernel提供) -+ -+### 3. 大页内存配置 -+Gazelle使用大页内存提高效率。使用root权限配置系统预留大页内存,可选用任意页大小。因每页内存都需要一个fd,使用内存较大时,建议使用1G的大页,避免占用过多fd。 -+根据实际情况,选择一种页大小,配置足够的大页内存即可。配置大页操作如下: - ``` sh --modprobe vfio-pci --dpdk-devbind -b vfio-pci enp3s0 --``` -+#配置2M大页内存:在node0上配置 2M * 1024 = 2G -+echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages - --### 3. 大页内存配置 --dpdk提供了高效的大页内存管理和共享机制,gazelle的报文数据、无锁队列等都使用了大页内存。大页内存需要root用户配置。2M或1G大页按实际需要配置,推荐使用2M大页内存,该内存是本机上ltran和所有lstack可以使用的总内存,具体方法如下: --- 2M大页配置 -- - 配置系统大页数量 -- ``` sh -- #示例:在node0上配置2M * 2000 = 4000M -- echo 2000 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages -- echo 0 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages -- echo 0 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages -- echo 0 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages -- # 查看配置结果 -- grep Huge /proc/meminfo -- ``` --- 1G大页配置 --1G大页配置方法与2M类似 -- - 配置系统大页数量 -- ``` sh -- #示例:在node0上配置1G * 5 = 5G -- echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages -- ``` -+#配置1G大页内存:在node0上配置1G * 5 = 5G -+echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages -+ -+#查看配置结果 -+grep Huge /proc/meminfo -+``` - - ### 4. 挂载大页内存 --创建两个目录,分别给lstack的进程、ltran进程使用。操作步骤如下: -+创建两个目录,分别给lstack的进程、ltran进程访问大页内存使用。操作步骤如下: - ``` sh - mkdir -p /mnt/hugepages - mkdir -p /mnt/hugepages-2M -@@ -94,34 +79,35 @@ mount -t hugetlbfs nodev /mnt/hugepages - mount -t hugetlbfs nodev /mnt/hugepages-2M - ``` - --### 5. 应用程序从内核协议栈切换至用户态协议栈 --+ 一种方式:重新编译程序 --修改应用的makefile文件,使其链接liblstack.so。示例如下: --``` makefile --#在makefile中添加 --ifdef USE_GAZELLE -- -include /etc/gazelle/lstack.Makefile --endif --gcc test.c -o test $(LSTACK_LIBS) -+### 5. 应用程序使用Gazelle -+有两种使能Gazelle方法,根据需要选择其一 -+- 重新编译应用程序,链接Gazelle的库 -+修改应用makefile文件链接liblstack.so,示例如下: - ``` -+#makefile中添加Gazelle的Makefile -+-include /etc/gazelle/lstack.Makefile - --+ 另一个方式:使用LD_PRELOAD -+#编译添加LSTACK_LIBS变量 -+gcc test.c -o test ${LSTACK_LIBS} - ``` --GAZELLE_BIND_PROCNAME=test(具体进程名) LD_PRELOAD=/usr/lib64/liblstack.so ./test -+ -+- 使用LD_PRELOAD加载Gazelle的库 -+GAZELLE_BIND_PROCNAME环境变量指定进程名,LD_PRELOAD指定Gazelle库路径 -+``` -+GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test - ``` - - ### 6. 配置文件 --- lstack.conf用于指定lstack的启动参数,Gazelle发布件会包括ltran.conf供用户参考,路径为/etc/gazelle/lstack.conf, 配置文件参数如下 -+- lstack.conf用于指定lstack的启动参数,默认路径为/etc/gazelle/lstack.conf, 配置文件参数如下 - - |选项|参数格式|说明| - |:---|:---|:---| - |dpdk_args|--socket-mem(必需)
--huge-dir(必需)
--proc-type(必需)
--legacy-mem
--map-perfect
等|dpdk初始化参数,参考dpdk说明| - |use_ltran| 0/1 | 是否使用ltran | --|num_cpus|"0,2,4 ..."|lstack线程绑定的cpu编号,编号的数量为lstack线程个数(小于等于网卡多队列数量),仅在use_ltran=0时生效,如果机器不支持网卡多队列,lstack线程数量应该为1| --|num_weakup|"1,3,5 ..."|weakup线程绑定的cpu编号,编号的数量为weakup线程个数,与lstack线程的数量保持一致| --|numa_bind|0/1|是否支持将用户线程绑定到与某lstack线程相同numa内| -+|num_cpus|"0,2,4 ..."|lstack线程绑定的cpu编号,编号的数量为lstack线程个数(小于等于网卡多队列数量)。可按NUMA选择cpu| -+|num_wakeup|"1,3,5 ..."|wakeup线程绑定的cpu编号,编号的数量为wakeup线程个数,与lstack线程的数量保持一致。与numcpus选择对应NUMA的cpu。不配置则为不使用唤醒线程| - |low_power_mode|0/1|是否开启低功耗模式,暂不支持| --|kni_swith|0/1|rte_kni开关,默认为0| -+|kni_swith|0/1|rte_kni开关,默认为0。只有不使用ltran时才能开启| - |host_addr|"192.168.xx.xx"|协议栈的IP地址,必须和redis-server配置
文件里的“bind”字段保存一致。| - |mask_addr|"255.255.xx.xx"|掩码地址| - |gateway_addr|"192.168.xx.1"|网关地址| -@@ -137,10 +123,8 @@ kni_switch=0 - - low_power_mode=0 - --num_cpus="2" --num_weakup="3" -- --numa_bind=1 -+num_cpus="2,22" -+num_wakeup="3,23" - - host_addr="192.168.1.10" - mask_addr="255.255.255.0" -@@ -148,7 +132,7 @@ gateway_addr="192.168.1.1" - devices="aa:bb:cc:dd:ee:ff" - ``` - --- ltran.conf用于指定ltran启动的参数,Gazelle发布件会包括ltran.conf供用户参考,路径为/etc/gazelle/ltran.conf,仅在lstack.conf内配置use_ltran=1时生效,配置文件格式如下 -+- ltran.conf用于指定ltran启动的参数,默认路径为/etc/gazelle/ltran.conf。使用ltran时,lstack.conf内配置use_ltran=1,配置参数如下: - - |功能分类|选项|参数格式|说明| - |:---|:---|:---|:---| -@@ -182,24 +166,26 @@ bond_macs="aa:bb:cc:dd:ee:ff" - bond_ports="0x1" - - tcp_conn_scan_interval=10 --``` --### 7. 启动 --- 不使用ltran模式(use_ltran=0)时,不需要启动ltran --- 启动ltran,如果不指定--config-file,则使用默认路径/etc/gazelle/ltran.conf -+``` -+### 7. 启动应用程序 -+- 启动ltran进程 -+单进程且网卡支持多队列,则直接使用网卡多队列分发报文到各线程,不启动ltran进程,lstack.conf的use_ltran配置为0. -+启动ltran时不使用-config-file指定配置文件,则使用默认路径/etc/gazelle/ltran.conf - ``` sh - ltran --config-file ./ltran.conf - ``` --- 启动redis,如果不指定环境变量LSTACK_CONF_PATH,则使用默认路径/etc/gazelle/lstack.conf -+- 启动应用程序 -+启动应用程序前不使用环境变量LSTACK_CONF_PATH指定配置文件,则使用默认路径/etc/gazelle/lstack.conf - ``` sh - export LSTACK_CONF_PATH=./lstack.conf --redis-server redis.conf -+LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server redis.conf - ``` - - ### 8. API --liblstack.so编译进应用程序后wrap网络编程标准接口,应用程序无需修改代码。 -+Gazelle wrap应用程序POSIX接口,应用程序无需修改代码。 - --### 9. gazellectl --- 不使用ltran模式时不支持gazellectl ltran xxx命令,以及-r, rate命令 -+### 9. 调测命令 -+- 不使用ltran模式时不支持gazellectl ltran xxx命令,以及lstack -r命令 - ``` - Usage: gazellectl [-h | help] - or: gazellectl ltran {quit | show} [LTRAN_OPTIONS] [time] -@@ -228,56 +214,50 @@ Usage: gazellectl [-h | help] - #### 1. dpdk配置文件的位置 - 如果是root用户,dpdk启动后的配置文件将会放到/var/run/dpdk目录下; - 如果是非root用户,dpdk配置文件的路径将由环境变量XDG_RUNTIME_DIR决定; --+ 如果XDG_RUNTIME_DIR为空,dpdk配置文件放到/tmp/dpdk目录下; --+ 如果XDG_RUNTIME_DIR不为空,dpdk配置文件放到变量XDG_RUNTIME_DIR下; --+ 注意有些机器会默认设置XDG_RUNTIME_DIR -+- 如果XDG_RUNTIME_DIR为空,dpdk配置文件放到/tmp/dpdk目录下; -+- 如果XDG_RUNTIME_DIR不为空,dpdk配置文件放到变量XDG_RUNTIME_DIR下; -+- 注意有些机器会默认设置XDG_RUNTIME_DIR -+ -+## 约束限制 - --## Constraints --- 提供的命令行、配置文件以及配置大页内存需要root权限执行或修改。非root用户使用,需先提权以及修改文件权限。 --- 若要把用户态网卡绑回内核驱动,必须先将Gazelle退出。 -+使用 Gazelle 存在一些约束限制: -+#### 功能约束 - - 不支持accept阻塞模式或者connect阻塞模式。 --- 最多只支持1500个连接。 --- 协议栈当前只支持tcp、icmp、arp、ipv4。 --- 大页内存不支持在挂载点里创建子目录重新挂载。 --- 在对端ping时,要求指定报文长度小于等于14000。 -+- 最多支持1500个TCP连接。 -+- 当前仅支持TCP、ICMP、ARP、IPv4 协议。 -+- 在对端ping Gazelle时,要求指定报文长度小于等于14000B。 - - 不支持使用透明大页。 --- 需要保证ltran的可用大页内存 >=1G --- 需要保证应用实例协议栈线程的可用大页内存 >=800M --- 不支持32位系统使用。 - - ltran不支持使用多种类型的网卡混合组bond。 - - ltran的bond1主备模式,只支持链路层故障主备切换(例如网线断开),不支持物理层故障主备切换(例如网卡下电、拔网卡)。 --- 构建X86版本使用-march=native选项,基于构建环境的CPU(Intel® Xeon® Gold 5118 CPU @ 2.30GHz)指令集进行优化。要求运行环境CPU支持SSE4.2、AVX、AVX2、AVX-512指令集。 --- 最大IP分片数为10(ping最大包长14790),TCP协议不使用IP分片。 --- sysctl配置网卡rp_filter参数为1,否则可能使用内核协议栈 --- 虚拟机网卡不支持多队列。 --- 不使用ltran模式,kni网口只支持本地通讯使用,且需要启动前配置NetworkManager不管理kni网卡 --- 虚拟kni网口的ip及mac地址,需要与lstack配置文件保持一致 --- gazelle运行过程中,不允许删除运行文件,如果删除,需要重启gazelle --- lstack配置的ip需要与应用程序的ip保持一致 -- --## Security risk note --gazelle有如下安全风险,用户需要评估使用场景风险 --1. 共享内存 -+- 虚拟机网卡不支持多队列。 -+#### 操作约束 -+- 提供的命令行、配置文件默认root权限。非root用户使用,需先提权以及修改文件所有者。 -+- 将用户态网卡绑回到内核驱动,必须先退出Gazelle。 -+- 大页内存不支持在挂载点里创建子目录重新挂载。 -+- ltran需要最低大页内存为1GB。 -+- 每个应用实例协议栈线程最低大页内存为800MB 。 -+- 仅支持64位系统。 -+- 构建x86版本的Gazelle使用了-march=native选项,基于构建环境的CPU(Intel® Xeon® Gold 5118 CPU @ 2.30GHz指令集进行优化。要求运行环境CPU支持 SSE4.2、AVX、AVX2、AVX-512 指令集。 -+- 最大IP分片数为10(ping 最大包长14790B),TCP协议不使用IP分片。 -+- sysctl配置网卡rp_filter参数为1,否则可能不按预期使用Gazelle协议栈,而是依然使用内核协议栈。 -+- 不使用ltran模式,KNI网口不可配置只支持本地通讯使用,且需要启动前配置NetworkManager不管理KNI网卡。 -+- 虚拟KNI网口的IP及mac地址,需要与lstack.conf配置文件保持一致 。 -+ -+## 风险提示 -+Gazelle可能存在如下安全风险,用户需要根据使用场景评估风险。 -+ -+**共享内存** - - 现状 --大页内存mount至/mnt/hugepages-2M目录,链接liblstack.so的进程初始化时在/mnt/hugepages-2M目录下创建文件,每个文件对应2M大页内存,并mmap这些文件。ltran在收到lstask的注册信息后,根据大页内存配置信息也mmap目录下文件,实现大页内存共享。 --ltran在/mnt/hugepages目录的大页内存同理。 --- 当前消减措施 --大页文件权限600,只有OWNER用户才能访问文件,默认root用户,支持配置成其它用户; --大页文件有dpdk文件锁,不能直接写或者mmap。 --- 风险点 --属于同一用户的恶意进程模仿DPDK实现逻辑,通过大页文件共享大页内存,写破坏大页内存,导致gazelle程序crash。建议用户下的进程属于同一信任域。 --2. 流量限制 --- 风险点 --gazelle没有做流量限制,用户有能力发送最大网卡线速流量的报文到网络。 --3. 进程仿冒 --- 风险点 --合法注册到ltran的两个lstack进程,进程A可仿冒进程B发送仿冒消息给ltran,修改ltran的转发控制信息,造成进程B通讯异常,进程B报文转发给进程A等问题。建议lstack进程都为可信任进程。 -- --## How to Contribute --We are happy to provide guidance for the new contributors. --Please sign the CLA before contributing. -- --## Licensing --gazelle is licensed under the Mulan PSL v2. -- -- -+ 大页内存 mount 至 /mnt/hugepages-2M 目录,链接 liblstack.so 的进程初始化时在 /mnt/hugepages-2M 目录下创建文件,每个文件对应 2M 大页内存,并 mmap 这些文件。ltran 在收到 lstask 的注册信息后,根据大页内存配置信息也 mmap 目录下文件,实现大页内存共享。 -+ ltran 在 /mnt/hugepages 目录的大页内存同理。 -+- 当前消减措施 -+ 大页文件权限 600,只有 OWNER 用户才能访问文件,默认 root 用户,支持配置成其它用户; -+ 大页文件有 DPDK 文件锁,不能直接写或者映射。 -+- 风险点 -+ 属于同一用户的恶意进程模仿DPDK实现逻辑,通过大页文件共享大页内存,写破坏大页内存,导致Gazelle程序crash。建议用户下的进程属于同一信任域。 -+ -+**流量限制** -+Gazelle没有做流量限制,用户有能力发送最大网卡线速流量的报文到网络,可能导致网络流量拥塞。 -+ -+**进程仿冒** -+合法注册到ltran的两个lstack进程,进程A可仿冒进程B发送仿冒消息给ltran,修改ltran的转发控制信息,造成进程B通讯异常,进程B报文转发给进程A信息泄露等问题。建议lstack进程都为可信任进程。 --- -2.23.0 - diff --git a/0052-bugfix-https-gitee.com-src-openeuler-gazelle-issues-.patch b/0052-bugfix-https-gitee.com-src-openeuler-gazelle-issues-.patch deleted file mode 100644 index e5ea239..0000000 --- a/0052-bugfix-https-gitee.com-src-openeuler-gazelle-issues-.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 94a5043e03d3d83b661af64c3723d5f775c10706 Mon Sep 17 00:00:00 2001 -From: zhangqiang -Date: Fri, 1 Jul 2022 01:26:09 +0800 -Subject: [PATCH 3/6] =?UTF-8?q?=20=E6=8C=89=E7=85=A7POSIX=E6=A0=87?= - =?UTF-8?q?=E5=87=86,sigaction=E5=87=BD=E6=95=B0act=3D=3DNULL,=E8=B0=83?= - =?UTF-8?q?=E7=94=A8=E8=80=85=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87oldact?= - =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B9=8B=E5=89=8D=E7=9A=84=E4=BF=A1=E5=8F=B7?= - =?UTF-8?q?action=20=E6=8C=89=E7=85=A7lstack=E7=9A=84=E7=90=86=E8=A7=A3,?= - =?UTF-8?q?=E5=AE=83HOOK=20sigaction=E5=87=BD=E6=95=B0,=E6=98=AF=E5=BD=93?= - =?UTF-8?q?=E8=B0=83=E7=94=A8=E8=80=85=E8=AE=BE=E7=BD=AE=E6=96=B0=E7=9A=84?= - =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E5=87=BD=E6=95=B0=E4=B8=BA=E7=BC=BA=E7=9C=81?= - =?UTF-8?q?=E5=A4=84=E7=BD=AE=E8=A1=8C=E4=B8=BA=E6=97=B6,=E5=AF=B9?= - =?UTF-8?q?=E6=8C=87=E5=AE=9A=E4=BF=A1=E5=8F=B7=E8=BF=9B=E8=A1=8C=E6=8B=A6?= - =?UTF-8?q?=E6=88=AA,=E8=AF=A5=E6=94=B9=E5=8A=A8=E4=B8=8D=E5=BD=B1?= - =?UTF-8?q?=E5=93=8D=E5=8E=9F=E5=8A=9F=E8=83=BD?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - src/lstack/api/lstack_signal.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c -index 87cbdda..4dba472 100644 ---- a/src/lstack/api/lstack_signal.c -+++ b/src/lstack/api/lstack_signal.c -@@ -78,7 +78,7 @@ int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigacti - { - struct sigaction new_action; - -- if ((match_hijack_signal(sig_num) != 0) && (action->sa_handler == SIG_DFL)) { -+ if ((match_hijack_signal(sig_num) != 0) && (action && action->sa_handler == SIG_DFL)) { - new_action = *action; - new_action.sa_flags |= SA_RESETHAND; - new_action.sa_handler = lstack_sig_default_handler; --- -2.23.0 - diff --git a/0053-update-README.md.patch b/0053-update-README.md.patch deleted file mode 100644 index 1067020..0000000 --- a/0053-update-README.md.patch +++ /dev/null @@ -1,332 +0,0 @@ -From 5249ab9e033d2f02ca78eca1b96db540f9990641 Mon Sep 17 00:00:00 2001 -From: xiusailong -Date: Wed, 29 Jun 2022 11:28:10 +0800 -Subject: [PATCH 4/6] update README.md - ---- - README.md | 10 +- - ...50\346\210\267\346\214\207\345\215\227.md" | 159 +++++++----------- - 2 files changed, 62 insertions(+), 107 deletions(-) - -diff --git a/README.md b/README.md -index 61f298c..3c1487c 100644 ---- a/README.md -+++ b/README.md -@@ -75,12 +75,12 @@ mkdir -p /mnt/hugepages - mkdir -p /mnt/hugepages-2M - chmod -R 700 /mnt/hugepages - chmod -R 700 /mnt/hugepages-2M --mount -t hugetlbfs nodev /mnt/hugepages --mount -t hugetlbfs nodev /mnt/hugepages-2M -+mount -t hugetlbfs nodev /mnt/hugepages -o pagesize=2M -+mount -t hugetlbfs nodev /mnt/hugepages-2M -o pagesize=2M - ``` - - ### 5. 应用程序使用Gazelle --有两种使能Gazelle方法,根据需要选择其一 -+有两种使用Gazelle方法,根据需要选择其一 - - 重新编译应用程序,链接Gazelle的库 - 修改应用makefile文件链接liblstack.so,示例如下: - ``` -@@ -256,8 +256,8 @@ Gazelle可能存在如下安全风险,用户需要根据使用场景评估风 - - 风险点 - 属于同一用户的恶意进程模仿DPDK实现逻辑,通过大页文件共享大页内存,写破坏大页内存,导致Gazelle程序crash。建议用户下的进程属于同一信任域。 - --**流量限制** -+**流量限制** - Gazelle没有做流量限制,用户有能力发送最大网卡线速流量的报文到网络,可能导致网络流量拥塞。 - --**进程仿冒** -+**进程仿冒** - 合法注册到ltran的两个lstack进程,进程A可仿冒进程B发送仿冒消息给ltran,修改ltran的转发控制信息,造成进程B通讯异常,进程B报文转发给进程A信息泄露等问题。建议lstack进程都为可信任进程。 -diff --git "a/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md" "b/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md" -index bfe0f7c..3f40bf1 100644 ---- "a/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md" -+++ "b/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md" -@@ -1,54 +1,52 @@ --[toc] -+# gazelle-用户指南 - --# 1 简介 -+## 1 简介 - - EulerOS提供了利用Gazelle runtime优化数据库服务性能的完整解决方案,Gazelle - runtime基于bypass内核的架构设计,能够提供更高性能运行环境,优化服务软件性 - 能,可以很好地满足产品的性能需求。 - 本文主要介绍Gazelle软件如何安装使用。 - --# 2 安装软件包,编译应用程序(以redis 为例) -+## 2 安装软件包,编译应用程序(以redis 为例) - --1. 在使用之前,需要安装Gazelle软件包。 -+在使用之前,需要安装Gazelle软件包。 - --#### 操作步骤 -+### 操作步骤 - -- Gazelle是高性能用户态协议栈软件包,使用如下命令安装Gazelle软件包: -+Gazelle是高性能用户态协议栈软件包,使用如下命令安装Gazelle软件包: - - ``` -- yum install gazelle -+yum install gazelle - ``` - --#### 安装正确性验证 -+### 安装正确性验证 - -- 1. 安装完成后,使用“rpm -qa | grep -E gazelle”命令确认是否已经正确安装。示例如下: -+1. 安装完成后,使用“rpm -qa | grep -E gazelle”命令确认是否已经正确安装。示例如下: - -- 如果已正确安装则结果显示如下: -+如果已正确安装则结果显示如下: - ``` -- gazelle-1.0.0-h1.eulerosv2r10.aarch64 -+gazelle-1.0.0-h1.eulerosv2r10.aarch64 - ``` - - 2. 确认以下dpdk组件是否存在: - ``` -- -- /lib/modules/4.19.90-vhulk2007.2.0.h188.eulerosv2r10.aarch64/extra/dpdk/igb_uio.ko -- /usr/share/dpdk -- /usr/share/dpdk/usertools/dpdk-devbind.py -+rpm -ql dpdk | grep igb_uio -+/usr/share/dpdk -+/usr/share/dpdk/usertools/dpdk-devbind.py - ``` - - 3. 确认以下Gazelle组件是否存在: -- --``` - -- /usr/bin/gazellectl -- /usr/bin/ltran -- /usr/lib64/liblstack.so -- /etc/gazelle/ltran.conf -- /etc/gazelle/lstack.conf -- /etc/gazelle/lstack.Makefile -+``` -+/usr/bin/gazellectl -+/usr/bin/ltran -+/usr/lib64/liblstack.so -+/etc/gazelle/ltran.conf -+/etc/gazelle/lstack.conf -+/etc/gazelle/lstack.Makefile - ``` - --#### 链接Gazelle编译redis-server -+### 链接Gazelle编译redis-server - - 1. 获取开源redis代码,更改redis/src/Makefile文件,使其链接lstack,示例如下: - -@@ -78,10 +76,10 @@ index 4b2a31c..92fa17d 100644 - - 2. 编译redis: - -- ``` -- localhost:/euler/zyk/serverless/lredis/src # make distclean -- localhost:/euler/zyk/serverless/lredis/src # make USE_GAZELLE=1 -j32 -- ``` -+ ``` -+ localhost:/euler/zyk/serverless/lredis/src # make distclean -+ localhost:/euler/zyk/serverless/lredis/src # make USE_GAZELLE=1 -j32 -+ ``` - - #### 注意 - -@@ -89,7 +87,7 @@ index 4b2a31c..92fa17d 100644 - - 支持LD_PRELOAD方式免编译使用gazelle,可跳过编译应用程序步骤。 - --#3 设置配置文件(以redis为例) -+## 3 设置配置文件(以redis为例) - - 安装完软件包后,运行Gazelle服务需要设置必要的配置文件。 - -@@ -168,13 +166,13 @@ tcp_conn_scan_interval=10 - - redis.conf为redis服务的配置文件,可以参考开源的配置文件,需要注意的是,redis.conf侦听的ip必须和其使用的lstack.conf里面的host_addr值保持一致。 - --# 4 环境初始化 -+## 4 环境初始化 - - 配置文件完成后,需要配置大页、插入igb_uio.ko、绑定dpdk网卡等环境初始化工作才可以运行Gazelle服务。 - - **说明:igb_uio.ko依赖于uio.ko,需要用户先确保已安装uio.ko模块。** - --#### 操作步骤 -+### 操作步骤 - - 1. **配置大页内存** - -@@ -203,68 +201,24 @@ tcp_conn_scan_interval=10 - 将需要通信的网卡绑定到dpdk,示例如下: - - ``` -- [root@ARM159server usertools]# ./dpdk-devbind.py --bind=igb_uio eth4 -+[root@ARM159server usertools]# dpdk-devbind.py --bind=igb_uio eth4 - ``` - - 如果是1822网卡,必须绑定vfio-pci驱动: --``` -- [root@ARM159server usertools]# ./dpdk-devbind.py --bind=vfio-pci eth4 --``` -- --4. **一键部署脚本使用** -- -- 提供gazelle_setup脚本,用于快速自动化部署gazelle运行环境。 -- -- 一键部署脚本执行示例: -- --``` -- gazelle_setup.sh –i/--nic eth0 –n/--numa 1024,1024 –d/--daemon 1/0 –k/--kni 1/0 –l/--lowpower 1/0 --ltrancore 0,1 --lstackcore 2-3 --``` -- -- 参数描述: -- -- -i/--nic:设置待绑定网卡,此参数必须配置,且网卡需要有ip、路由和网关等必须参数,否则会读取配置失败,必选。 -- -- -n/--numa:lstack大页内存(不包括ltran的,ltran默认为1024M,setup脚本不对其做修改),根据numa节点配置,并用","(英文的逗号)分离,这里需要根据系统环境内存配置对应的大小,默认为1024, 可选。 -- -- -d/--daemon:是否开启deamon模式,开启为1,关闭为0;默认为1,可选。 -- -- -k/--kni:是否开启kni,开启为1,关闭为0;默认为0,可选。 -- -- -l/--lowpower:是否开启低功耗模式,开启为1,关闭为0;默认为0,可选。 -- -- --ltrancore:ltran的绑核参数,参考dpdk的参数配置,此处不做参数校验;默认为0,1,可选。 -- -- --lstackcore:lstack的绑核参数,同--ltrancore,默认为2,可选。 -- -- **说明** -- -- 1. gazelle_setup.sh支持非root用户启动;(即执行脚本对应的用户及用户组)。 -- 2. 默认配置文件的目录为:/etc/gazelle。 -- 3. gazelle_setup.sh会按照启动参数生成lstack.conf;对于lstack多进程场景,若多进程要使用不同配置文件,则需要自己拷贝修改每个进程的lstack.conf。 -- 4. 部署脚本会启动ltran进程。 -- -- 一键退出脚本执行实例: - - ``` -- gazelle_exit.sh -+[root@ARM159server usertools]# dpdk-devbind.py --bind=vfio-pci eth4 - ``` - -- **说明** -- -- 若启动了ltran的守护任务(gazelle_setup.sh指定了 -d/--daemon 1),那么在杀死ltran之后,守护任务仍会将ltran拉起,所以此时若要完全退出ltran,需要执行gazelle_exit.sh。 -- -- -+## 5 运行Gazelle - --# 5 运行Gazelle -- --#### 前提条件 -+### 前提条件 - - - 已完成软件包的安装。 - - 已设置完配置文件。 - - 已初始化环境。 - --#### 操作步骤 -+### 操作步骤 - - 1. **启动ltran** - -@@ -275,21 +229,22 @@ tcp_conn_scan_interval=10 - **说明:一键部署脚本已启动ltran,若使用一键部署脚本,无需此步骤。** - - ``` -- [root@localhost deploy_open_source]# ltran --config-file /usr/share/gazelle/ltran.confEAL: Detected 96 lcore(s) -- EAL: Detected 4 NUMA nodes -- EAL: Multi-process socket /var/run/dpdk/(null)/mp_socket -- EAL: Selected IOVA mode 'PA' -- EAL: No free hugepages reported in hugepages-2048kB -- EAL: No free hugepages reported in hugepages-2048kB -- EAL: No free hugepages reported in hugepages-2048kB -- EAL: No available hugepages reported in hugepages-1048576kB -- EAL: Probing VFIO support... -- EAL: VFIO support initialized -- EAL: PCI device 0000:03:00.0 on NUMA socket 0...... -- EAL: Finished Process ltran_core_init. -- EAL: Finished Process ctrl_thread_fn. -- EAL: Finished Process client_rx_buf_init. -- EAL: Runing Process forward. -+[root@localhost deploy_open_source]# ltran --config-file /usr/share/gazelle/ltran.conf -+EAL: Detected 96 lcore(s) -+EAL: Detected 4 NUMA nodes -+EAL: Multi-process socket /var/run/dpdk/(null)/mp_socket -+EAL: Selected IOVA mode 'PA' -+EAL: No free hugepages reported in hugepages-2048kB -+EAL: No free hugepages reported in hugepages-2048kB -+EAL: No free hugepages reported in hugepages-2048kB -+EAL: No available hugepages reported in hugepages-1048576kB -+EAL: Probing VFIO support... -+EAL: VFIO support initialized -+EAL: PCI device 0000:03:00.0 on NUMA socket 0...... -+EAL: Finished Process ltran_core_init. -+EAL: Finished Process ctrl_thread_fn. -+EAL: Finished Process client_rx_buf_init. -+EAL: Runing Process forward. - ``` - - 2. **启动redis** -@@ -367,7 +322,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib - 1. 不支持使用export方式单独声明LD_PRELOAD环境变量。 - 2. GAZELLE_BIND_PROCNAME指定lstack绑定的进程名称;GAZELLE_BIND_THREADNAME指定lstack绑定的进程中的具体线程名,且支持字串匹配,如设置disp,表示进程中所有线程名包含disp 字串的线程都会绑定lstack。 - --# 6 最佳性能配置 -+## 6 最佳性能配置 - - 为获得最佳的性能,Gazelle在启动时对cpu和内存配置有一定要求。最佳性能配置如下: - -@@ -377,7 +332,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib - 4. 应用进程绑核可提高性能,与网卡同一个numa节点对应的核如果有空闲,应当优先绑定。 - 5. Gazelle的网络高性能只有在远程访问的时候才有保证,本机的tcp连接功能也支持,但如果本机有频繁的数据访问,会导致实例整体性能下降,不建议这么部署。 - --# 7 使用约束 -+## 7 使用约束 - - 1. Gazelle提供的命令行及配置文件仅root权限开源执行或修改。配置大页内存需要root用户执行操作。 - 2. 在将网卡绑定到igb_uio后,禁止将网卡绑回ixgbe。 -@@ -408,7 +363,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib - - - --# 8 升级说明 -+## 8 升级说明 - - 后续升级需要变更的组件包括ltran、liblstack.so、gazellectl、lstack.Makefile、lstack.conf、ltran.conf、gazelle_setup.sh、gazelle_exit.sh、gazelle_crontab.sh、gazelle_common.sh。 - -@@ -436,9 +391,9 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib - - - --#9 调测工具 -+## 9 调测工具 - --##9.1 获取ltran统计数据说明 -+### 9.1 获取ltran统计数据说明 - - #### 概述 - -@@ -501,7 +456,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib - - - --## 9.2 获取Lstack统计数据说明 -+### 9.2 获取Lstack统计数据说明 - - #### 概述 - -@@ -553,4 +508,4 @@ lstack作为网络协议栈底座,使用时必须指定需要获取的lstack - - ``` - gazellectl lstack set {client_ip} lowpower {0 | 1}1:enable lowpower mode --``` -\ No newline at end of file -+``` --- -2.23.0 - diff --git a/0054-ltran-fix-use-after-free-issue.patch b/0054-ltran-fix-use-after-free-issue.patch deleted file mode 100644 index c9c93cd..0000000 --- a/0054-ltran-fix-use-after-free-issue.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0f37499d7922d59fa46b7961bde36ab0b20eac62 Mon Sep 17 00:00:00 2001 -From: Honggang LI -Date: Thu, 23 Jun 2022 13:56:31 +0800 -Subject: [PATCH 5/6] ltran: fix use-after-free issue - -Signed-off-by: Honggang LI ---- - src/ltran/ltran_timer.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c -index 29b307c..1327203 100644 ---- a/src/ltran/ltran_timer.c -+++ b/src/ltran/ltran_timer.c -@@ -63,9 +63,9 @@ void gazelle_detect_sock_logout(struct gazelle_tcp_sock_htable *tcp_sock_htable) - hlist_del_init(&tcp_sock->tcp_sock_node); - tcp_sock_htable->cur_tcp_sock_num--; - tcp_sock_htable->array[i].chain_size--; -- free(tcp_sock); - LTRAN_DEBUG("delete the tcp sock htable: tid %u ip %u port %u\n", - tcp_sock->tid, tcp_sock->ip, (uint32_t)ntohs(tcp_sock->port)); -+ free(tcp_sock); - } - } - } --- -2.23.0 - diff --git a/0055-refactor-pkt-read-send-performance.patch b/0055-refactor-pkt-read-send-performance.patch deleted file mode 100644 index 23c8ecc..0000000 --- a/0055-refactor-pkt-read-send-performance.patch +++ /dev/null @@ -1,3232 +0,0 @@ -From f0e65d55ace8b4e5c1bd2023f1b62da181f421c5 Mon Sep 17 00:00:00 2001 -From: jiangheng14 -Date: Thu, 7 Jul 2022 21:31:20 +0800 -Subject: [PATCH 6/6] refactor-pkt-read-send-performance - ---- - src/common/dpdk_common.h | 145 +++++++ - src/common/gazelle_dfx_msg.h | 50 ++- - src/lstack/api/lstack_epoll.c | 321 ++++++-------- - src/lstack/api/lstack_wrap.c | 15 +- - src/lstack/core/lstack_cfg.c | 18 + - src/lstack/core/lstack_control_plane.c | 4 +- - src/lstack/core/lstack_dpdk.c | 32 +- - src/lstack/core/lstack_init.c | 5 +- - src/lstack/core/lstack_lwip.c | 477 ++++++++++----------- - src/lstack/core/lstack_protocol_stack.c | 276 ++++++------ - src/lstack/core/lstack_stack_stat.c | 80 +++- - src/lstack/core/lstack_thread_rpc.c | 85 ++-- - src/lstack/include/lstack_cfg.h | 1 + - src/lstack/include/lstack_dpdk.h | 5 +- - src/lstack/include/lstack_lockless_queue.h | 10 +- - src/lstack/include/lstack_lwip.h | 11 +- - src/lstack/include/lstack_protocol_stack.h | 31 +- - src/lstack/include/lstack_stack_stat.h | 3 + - src/lstack/include/lstack_thread_rpc.h | 5 +- - src/lstack/include/posix/lstack_epoll.h | 22 +- - src/lstack/lstack.conf | 1 + - src/lstack/netif/lstack_ethdev.c | 9 +- - src/lstack/netif/lstack_vdev.c | 14 +- - src/ltran/ltran_dfx.c | 52 ++- - src/ltran/ltran_forward.c | 18 +- - src/ltran/ltran_stat.c | 19 +- - 26 files changed, 911 insertions(+), 798 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 595e85f..4a7bd37 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -14,6 +14,7 @@ - #define __GAZELLE_DPDK_COMMON_H__ - - #include -+#include - - #define GAZELLE_KNI_NAME "kni" // will be removed during dpdk update - -@@ -35,6 +36,7 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf - return; - - dst->ol_flags = src->ol_flags; -+ dst->tx_offload = src->tx_offload; - // there is buf_len in rx_descriptor_fields1, copy it is dangerous acturely. 16 : mbuf desc size - rte_memcpy((uint8_t *)dst->rx_descriptor_fields1, (const uint8_t *)src->rx_descriptor_fields1, 16); - -@@ -65,4 +67,147 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool); - int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count); - void kni_process_rx(uint16_t port); - -+/* -+ gazelle custom rte ring interface -+ lightweight ring reduce atomic and smp_mb. -+ only surpport single-consumers or the single-consumer. -+ */ -+static __rte_always_inline uint32_t gazelle_light_ring_enqueue_busrt(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t cons = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ uint32_t prod = r->prod.tail; -+ uint32_t free_entries = r->capacity + cons - prod; -+ -+ if (n > free_entries) { -+ return 0; -+ } -+ -+ __rte_ring_enqueue_elems(r, prod, obj_table, sizeof(void *), n); -+ -+ __atomic_store_n(&r->prod.tail, prod + n, __ATOMIC_RELEASE); -+ -+ return n; -+} -+ -+static __rte_always_inline uint32_t gazelle_light_ring_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); -+ uint32_t cons = r->cons.tail; -+ uint32_t entries = prod - cons; -+ -+ if (n > entries) { -+ n = entries; -+ } -+ -+ if (n == 0) { -+ return 0; -+ } -+ -+ __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); -+ -+ __atomic_store_n(&r->cons.tail, cons + n, __ATOMIC_RELEASE); -+ -+ return n; -+} -+ -+/* -+ gazelle custom rte ring interface -+ one thread enqueue and dequeue, other thread read object use and object still in queue. -+ so malloc and free in same thread. only surpport single-consumers or the single-consumer. -+ -+ cons.tail prod.tail prod.head cons.head -+ gazelle_ring_sp_enqueue: cons.head-->> cons.tal, enqueue object -+ gazelle_ring_sc_dequeue: cons.tal -->> prod.tail, dequeue object -+ gazelle_ring_read: prod.tail-->> cons.head, read object, prod.head = prod.tail + N -+ gazelle_ring_read_over: prod.tail = prod.head, update prod.tail -+ */ -+static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t head = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE); -+ uint32_t tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ -+ uint32_t entries = r->capacity + tail - head; -+ if (n > entries) { -+ return 0; -+ } -+ -+ -+ __rte_ring_enqueue_elems(r, head, obj_table, sizeof(void *), n); -+ -+ __atomic_store_n(&r->cons.head, head + n, __ATOMIC_RELEASE); -+ -+ return n; -+} -+ -+static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t cons = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); -+ -+ uint32_t entries = prod - cons; -+ if (n > entries) { -+ n = entries; -+ } -+ if (unlikely(n == 0)) { -+ return 0; -+ } -+ -+ -+ __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); -+ -+ __atomic_store_n(&r->cons.tail, cons + n, __ATOMIC_RELEASE); -+ -+ return n; -+} -+ -+static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t cons = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE); -+ uint32_t prod = r->prod.head; -+ -+ const uint32_t entries = cons - prod; -+ if (n > entries) { -+ n = entries; -+ } -+ if (unlikely(n == 0)) { -+ return 0; -+ } -+ -+ __rte_ring_dequeue_elems(r, prod, obj_table, sizeof(void *), n); -+ -+ r->prod.head = prod + n; -+ -+ return n; -+} -+ -+static __rte_always_inline void gazelle_ring_read_n(struct rte_ring *r, uint32_t n) -+{ -+ __atomic_store_n(&r->prod.tail, r->prod.tail + n, __ATOMIC_RELEASE); -+} -+ -+static __rte_always_inline void gazelle_ring_read_over(struct rte_ring *r) -+{ -+ __atomic_store_n(&r->prod.tail, r->prod.head, __ATOMIC_RELEASE); -+} -+ -+static __rte_always_inline uint32_t gazelle_ring_readover_count(struct rte_ring *r) -+{ -+ rte_smp_rmb(); -+ return r->prod.tail - r->cons.tail; -+} -+static __rte_always_inline uint32_t gazelle_ring_readable_count(const struct rte_ring *r) -+{ -+ rte_smp_rmb(); -+ return r->cons.head - r->prod.tail; -+} -+ -+static __rte_always_inline uint32_t gazelle_ring_count(const struct rte_ring *r) -+{ -+ rte_smp_rmb(); -+ return r->cons.head - r->cons.tail; -+} -+static __rte_always_inline uint32_t gazelle_ring_free_count(const struct rte_ring *r) -+{ -+ return r->capacity - gazelle_ring_count(r); -+} - #endif -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 6db67ee..cf435cd 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -57,34 +57,37 @@ enum GAZELLE_LATENCY_TYPE { - GAZELLE_LATENCY_READ, - }; - --struct gazelle_stat_pkts { -- uint64_t tx; -- uint64_t rx; -- uint64_t tx_drop; -- uint64_t rx_drop; -- uint64_t rx_allocmbuf_fail; -- uint64_t tx_allocmbuf_fail; -- uint64_t call_msg_cnt; -- uint16_t conn_num; -- uint16_t send_idle_ring_cnt; -- uint64_t event_list; -+struct gazelle_stack_stat { -+ uint64_t wakeup_events; -+ uint64_t write_lwip_cnt; -+ uint64_t send_self_rpc; - uint64_t read_lwip_drop; - uint64_t read_lwip_cnt; -- uint64_t write_lwip_drop; -- uint64_t write_lwip_cnt; -+ uint64_t rx_allocmbuf_fail; -+ uint64_t tx_allocmbuf_fail; -+ uint64_t call_null; -+ uint64_t rx_drop; -+ uint64_t rx; -+ uint64_t tx_drop; -+ uint64_t tx; -+}; -+ -+struct gazelle_wakeup_stat { -+ uint64_t app_events; -+ uint64_t app_write_idlefail; - uint64_t app_write_cnt; - uint64_t app_read_cnt; -- uint64_t app_write_idlefail; -- uint64_t app_write_drop; -- uint64_t recv_list; -- uint64_t wakeup_events; -- uint64_t app_events; -- uint64_t call_alloc_fail; - uint64_t read_null; -- uint64_t call_null; -- uint64_t arp_copy_fail; -- uint64_t send_self_rpc; -- uint64_t send_list; -+}; -+ -+struct gazelle_stat_pkts { -+ uint64_t call_msg_cnt; -+ uint16_t conn_num; -+ uint64_t recv_list_cnt; -+ uint64_t call_alloc_fail; -+ uint64_t send_list_cnt; -+ struct gazelle_stack_stat stack_stat; -+ struct gazelle_wakeup_stat wakeup_stat; - }; - - /* same as define in lwip/stats.h - struct stats_mib2 */ -@@ -159,6 +162,7 @@ struct gazelle_stat_lstack_conn_info { - uint32_t recv_ring_cnt; - uint32_t tcp_sub_state; - int32_t sem_cnt; -+ int32_t fd; - }; - - struct gazelle_stat_lstack_conn { -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index cba67ea..4978f02 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -39,36 +40,33 @@ - #define SEC_TO_NSEC 1000000000 - #define SEC_TO_MSEC 1000 - #define MSEC_TO_NSEC 1000000 --#define EPOLL_MAX_EVENTS 512 - #define POLL_KERNEL_EVENTS 32 - --static PER_THREAD struct wakeup_poll g_wakeup_poll = {0}; --static bool g_use_epoll = false; /* FIXME: when no epoll close prepare event for performance testing */ -- - void add_epoll_event(struct netconn *conn, uint32_t event) - { - /* conn sock nerver null, because lwip call this func */ -- struct lwip_sock *sock = get_socket(conn->socket); -- -- if ((event & sock->epoll_events) == 0) { -+ struct lwip_sock *sock = get_socket_by_fd(conn->socket); -+ if (sock->wakeup == NULL || (event & sock->epoll_events) == 0) { - return; - } -+ struct wakeup_poll *wakeup = sock->wakeup; -+ struct protocol_stack *stack = sock->stack; - -- sock->events |= event & sock->epoll_events; -- --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -- if (g_use_epoll && list_is_empty(&sock->event_list)) { -- list_add_node(&sock->stack->event_list, &sock->event_list); -+ if (wakeup->type == WAKEUP_EPOLL) { -+ pthread_spin_lock(&wakeup->event_list_lock); -+ sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); -+ if (list_is_null(&sock->event_list)) { -+ list_add_node(&wakeup->event_list, &sock->event_list); -+ } -+ pthread_spin_unlock(&wakeup->event_list_lock); - } --#endif - -- if (sock->wakeup) { -- sock->stack->stats.wakeup_events++; -- if (get_protocol_stack_group()->wakeup_enable) { -- rte_ring_sp_enqueue(sock->stack->wakeup_ring, &sock->wakeup->event_sem); -- } else { -- sem_post(&sock->wakeup->event_sem); -- } -+ stack->stats.wakeup_events++; -+ sem_t *sem = &wakeup->event_sem; -+ if (get_protocol_stack_group()->wakeup_enable) { -+ gazelle_light_ring_enqueue_busrt(stack->wakeup_ring, (void **)&sem, 1); -+ } else { -+ sem_post(sem); - } - } - -@@ -77,61 +75,34 @@ static inline uint32_t update_events(struct lwip_sock *sock) - uint32_t event = 0; - - if (sock->epoll_events & EPOLLIN) { -- if (sock->attach_fd > 0 && NETCONN_IS_ACCEPTIN(sock)) { -- event |= EPOLLIN; -- } -- -- if (sock->attach_fd < 0 && NETCONN_IS_DATAIN(sock)) { -+ if (NETCONN_IS_DATAIN(sock) || NETCONN_IS_ACCEPTIN(sock)) { - event |= EPOLLIN; - } - } - - if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -- event |= EPOLLOUT; -+ /* lwip_netconn_do_connected set LIBOS FLAGS when connected */ -+ if (sock->conn && CONN_TYPE_IS_LIBOS(sock->conn)) { -+ event |= EPOLLOUT; -+ } - } - -- if ((sock->epoll_events & EPOLLERR) && (sock->events & EPOLLERR)) { -+ if (sock->errevent > 0) { - event |= EPOLLERR | EPOLLIN; - } - - return event; - } - --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK --void update_stack_events(struct protocol_stack *stack) -+static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *sock) - { -- if (!g_use_epoll) { -- return; -- } -- -- struct list_node *node, *temp; -- list_for_each_safe(node, temp, &stack->event_list) { -- struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -- -- sock->events = update_events(sock); -- if (sock->events != 0) { -- continue; -- } -- -- if (pthread_spin_trylock(&stack->event_lock)) { -- continue; -+ sock->events = update_events(sock); -+ if (sock->events) { -+ pthread_spin_lock(&wakeup->event_list_lock); -+ if (list_is_null(&sock->event_list)) { -+ list_add_node(&wakeup->event_list, &sock->event_list); - } -- list_del_node_init(&sock->event_list); -- pthread_spin_unlock(&stack->event_lock); -- } --} --#endif -- --static void raise_pending_events(struct lwip_sock *sock) --{ -- struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket_by_fd(sock->attach_fd) : sock; -- if (attach_sock == NULL) { -- return; -- } -- -- attach_sock->events = update_events(attach_sock); -- if (attach_sock->events & attach_sock->epoll_events) { -- rpc_call_addevent(attach_sock->stack, attach_sock); -+ pthread_spin_unlock(&wakeup->event_list_lock); - } - } - -@@ -157,11 +128,15 @@ int32_t lstack_epoll_create(int32_t size) - memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)); - - init_list_node(&wakeup->event_list); -- wakeup->epollfd = fd; - sem_init(&wakeup->event_sem, 0, 0); -+ pthread_spin_init(&wakeup->event_list_lock, PTHREAD_PROCESS_PRIVATE); -+ -+ wakeup->type = WAKEUP_EPOLL; -+ wakeup->epollfd = fd; - sock->wakeup = wakeup; - -- g_use_epoll = true; -+ register_wakeup(wakeup); -+ - return fd; - } - -@@ -176,6 +151,9 @@ int32_t lstack_epoll_close(int32_t fd) - } - - if (sock->wakeup) { -+ unregister_wakeup(sock->wakeup); -+ sem_destroy(&sock->wakeup->event_sem); -+ pthread_spin_destroy(&sock->wakeup->event_list_lock); - free(sock->wakeup); - } - sock->wakeup = NULL; -@@ -236,161 +214,116 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -- epoll_sock->wakeup->have_kernel_fd = true; - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - - if (CONN_TYPE_HAS_HOST(sock->conn)) { -- epoll_sock->wakeup->have_kernel_fd = true; - int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event); - if (ret < 0) { -- return ret; -+ LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d\n", fd, epfd, op); - } - } - -+ struct wakeup_poll *wakeup = epoll_sock->wakeup; - do { - switch (op) { - case EPOLL_CTL_ADD: -- sock->wakeup = epoll_sock->wakeup; -- if (sock->stack) { -- epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]++; -- } -- if (list_is_empty(&sock->event_list)) { -- list_add_node(&sock->wakeup->event_list, &sock->event_list); -- } -+ sock->wakeup = wakeup; -+ wakeup->stack_fd_cnt[sock->stack->queue_id]++; - /* fall through */ - case EPOLL_CTL_MOD: - sock->epoll_events = event->events | EPOLLERR | EPOLLHUP; - sock->ep_data = event->data; -- if (sock->conn && NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { -- raise_pending_events(sock); -- } -+ raise_pending_events(wakeup, sock); - break; - case EPOLL_CTL_DEL: -- list_del_node_init(&sock->event_list); - sock->epoll_events = 0; -- if (sock->stack) { -- epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]--; -- } -+ wakeup->stack_fd_cnt[sock->stack->queue_id]--; -+ pthread_spin_lock(&wakeup->event_list_lock); -+ list_del_node_null(&sock->event_list); -+ pthread_spin_unlock(&wakeup->event_list_lock); - break; - default: - GAZELLE_RETURN(EINVAL); - } -- fd = sock->nextfd; -- sock = get_socket(fd); -- } while (fd > 0 && sock != NULL); -+ sock = sock->listen_next; -+ } while (sock != NULL); - -- update_epoll_max_stack(epoll_sock->wakeup); -+ update_epoll_max_stack(wakeup); - return 0; - } - --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK --static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) -+static void del_node_array(struct epoll_event *events, int32_t event_num, int32_t del_index) - { -- int32_t event_num = 0; -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents); -- for (uint32_t i = 0; i < stack_group->stack_num && event_num < maxevents; i++) { -- struct protocol_stack *stack = stack_group->stacks[i]; -- int32_t start_event_num = event_num; -- -- if (pthread_spin_trylock(&stack->event_lock)) { -- continue; -- } -- -- struct list_node *node, *temp; -- list_for_each_safe(node, temp, &stack->event_list) { -- struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -- -- uint32_t event = sock->events & sock->epoll_events; -- if (event == 0 || sock->wait_close) { -- continue; -- } -- -- events[event_num].events = event; -- events[event_num].data = sock->ep_data; -- event_num++; -+ for (int32_t i = del_index; i + 1 < event_num; i++) { -+ events[i] = events[i + 1]; -+ } -+} - -- if (event_num >= maxevents) { -- break; -+static int32_t del_duplicate_event(struct epoll_event *events, int32_t event_num) -+{ -+ for (int32_t i = 0; i < event_num; i++) { -+ for (int32_t j = i + 1; j < event_num; j++) { -+ if (events[i].data.u64 == events[j].data.u64) { -+ del_node_array(events, event_num, j); -+ event_num--; - } - } -- -- pthread_spin_unlock(&stack->event_lock); -- -- __sync_fetch_and_add(&stack->stats.app_events, event_num - start_event_num); - } - - return event_num; - } --#else -+ - static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) - { - int32_t event_num = 0; - struct list_node *node, *temp; -+ int32_t accept_num = 0; -+ -+ pthread_spin_lock(&wakeup->event_list_lock); -+ - list_for_each_safe(node, temp, &wakeup->event_list) { - struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -- if (sock->conn == NULL) { -- list_del_node_init(&sock->event_list); -- continue; -+ if (sock->conn && sock->conn->acceptmbox) { -+ accept_num++; - } - -- struct lwip_sock *temp_sock = sock; -- do { -- struct lwip_sock *attach_sock = (temp_sock->attach_fd > 0) ? get_socket(temp_sock->attach_fd) : temp_sock; -- if (attach_sock == NULL || temp_sock->wait_close) { -- temp_sock = (temp_sock->nextfd > 0) ? get_socket(temp_sock->nextfd) : NULL; -- continue; -- } -+ events[event_num].events = sock->events; -+ events[event_num].data = sock->ep_data; -+ event_num++; - -- uint32_t event = update_events(attach_sock); -- if (event != 0) { -- events[event_num].events = event; -- events[event_num].data = temp_sock->ep_data; -- event_num++; -- if (event_num >= maxevents) { -- break; -- } -- } -+ if (event_num >= maxevents) { -+ break; -+ } -+ } - -- temp_sock = (temp_sock->nextfd > 0) ? get_socket(temp_sock->nextfd) : NULL; -- } while (temp_sock); -+ pthread_spin_unlock(&wakeup->event_list_lock); -+ -+ if (accept_num > 1) { -+ event_num = del_duplicate_event(events, event_num); - } - -+ // atomic_fetch_add(&wakeup->bind_stack->stats.app_events, event_num); - return event_num; - } --#endif - - static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - { - int32_t event_num = 0; - - for (uint32_t i = 0; i < nfds; i++) { -- /* listenfd nextfd pointerto next stack listen, others nextfd=-1 */ -+ /* sock->listen_next pointerto next stack listen */ - int32_t fd = fds[i].fd; -- while (fd > 0) { -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- break; -- } -- -- /* attach listen is empty, all event in attached listen. attached listen attach_fd is self */ -- struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket(sock->attach_fd) : sock; -- if (attach_sock == NULL || sock->wait_close) { -- fd = sock->nextfd; -- continue; -- } -- -- uint32_t events = update_events(attach_sock); -+ struct lwip_sock *sock = get_socket_by_fd(fd); -+ while (sock && sock->conn) { -+ uint32_t events = update_events(sock); - if (events) { - fds[i].revents = events; -- __sync_fetch_and_add(&sock->stack->stats.app_events, 1); - event_num++; - break; - } - -- fd = sock->nextfd; -+ sock = sock->listen_next;; - } - } - -@@ -417,7 +350,7 @@ static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct prot - - /* avoid kernel thread post too much, use EPOLLET */ - struct epoll_event event; -- event.data.ptr = &wakeup->event_sem; -+ event.data.ptr = wakeup; - event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET; - if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) { - LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -@@ -457,15 +390,18 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - - do { - event_num += epoll_lwip_event(sock->wakeup, &events[event_num], maxevents - event_num); -+ sock->wakeup->stat.app_events += event_num; - -- if (sock->wakeup->have_kernel_fd) { -+ if (__atomic_load_n(&sock->wakeup->have_kernel_event, __ATOMIC_RELAXED)) { - event_num += posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0); - } - - if (event_num > 0) { -+ while (sem_trywait(&sock->wakeup->event_sem) == 0); - break; - } - -+ sock->wakeup->have_kernel_event = false; - if (timeout < 0) { - ret = sem_wait(&sock->wakeup->event_sem); - } else { -@@ -479,6 +415,7 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - static void init_poll_wakeup_data(struct wakeup_poll *wakeup) - { - sem_init(&wakeup->event_sem, 0, 0); -+ wakeup->type = WAKEUP_POLL; - - wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd)); - if (wakeup->last_fds == NULL) { -@@ -542,11 +479,6 @@ static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struc - if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) { - LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); - } -- -- wakeup->last_fds[index].fd = new_fd->fd; -- wakeup->last_fds[index].events = new_fd->events; -- -- wakeup->have_kernel_fd = true; - } - - static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds) -@@ -554,17 +486,17 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - if (!wakeup->init) { - wakeup->init = true; - init_poll_wakeup_data(wakeup); -- } else { -- while (sem_trywait(&wakeup->event_sem) == 0) {} -- } -- -- if (nfds > wakeup->last_max_nfds) { -- resize_kernel_poll(wakeup, nfds); -+ register_wakeup(wakeup); - } - - int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; - int32_t poll_change = 0; - -+ /* poll fds num more, recalloc fds size */ -+ if (nfds > wakeup->last_max_nfds) { -+ resize_kernel_poll(wakeup, nfds); -+ poll_change = 1; -+ } - /* poll fds num less, del old fd */ - for (uint32_t i = nfds; i < wakeup->last_nfds; i++) { - update_kernel_poll(wakeup, i, NULL); -@@ -572,44 +504,51 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - } - - for (uint32_t i = 0; i < nfds; i++) { -+ int32_t fd = fds[i].fd; - fds[i].revents = 0; -+ struct lwip_sock *sock = get_socket_by_fd(fd); - -- if (fds[i].fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) { -- continue; -+ if (fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) { -+ /* fd close then socket may get same fd. */ -+ if (sock == NULL || sock->wakeup != NULL) { -+ continue; -+ } - } -+ wakeup->last_fds[i].fd = fd; -+ wakeup->last_fds[i].events = fds[i].events; - poll_change = 1; - -- int32_t fd = fds[i].fd; -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL || CONN_TYPE_HAS_HOST(sock->conn)) { -+ if (sock == NULL || sock->conn == NULL || CONN_TYPE_HAS_HOST(sock->conn)) { - update_kernel_poll(wakeup, i, fds + i); - } - -- do { -- sock = get_socket(fd); -- if (sock == NULL || sock->conn == NULL) { -- break; -+ while (sock && sock->conn) { -+ if (sock->epoll_events != (fds[i].events | POLLERR)) { -+ sock->epoll_events = fds[i].events | POLLERR; -+ } -+ if (sock->wakeup != wakeup) { -+ sock->wakeup = wakeup; - } -- sock->epoll_events = fds[i].events | POLLERR; -- sock->wakeup = wakeup; - -- /* listenfd list */ -- fd = sock->nextfd; - stack_count[sock->stack->queue_id]++; -- } while (fd > 0); -+ /* listenfd list */ -+ sock = sock->listen_next; -+ } - } - -- wakeup->last_nfds = nfds; - if (poll_change == 0) { - return; - } -+ wakeup->last_nfds = nfds; - - poll_bind_statck(wakeup, stack_count); - } - - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - { -- poll_init(&g_wakeup_poll, fds, nfds); -+ static PER_THREAD struct wakeup_poll wakeup_poll = {0}; -+ -+ poll_init(&wakeup_poll, fds, nfds); - - int32_t event_num = 0; - int32_t ret; -@@ -624,23 +563,25 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - event_num += poll_lwip_event(fds, nfds); - - /* reduce syscall epoll_wait */ -- if (g_wakeup_poll.have_kernel_fd) { -- int32_t kernel_num = posix_api->epoll_wait_fn(g_wakeup_poll.epollfd, g_wakeup_poll.events, nfds, 0); -+ if (__atomic_load_n(&wakeup_poll.have_kernel_event, __ATOMIC_RELAXED)) { -+ int32_t kernel_num = posix_api->epoll_wait_fn(wakeup_poll.epollfd, wakeup_poll.events, nfds, 0); - for (int32_t i = 0; i < kernel_num; i++) { -- uint32_t index = g_wakeup_poll.events[i].data.u32; -- fds[index].revents = g_wakeup_poll.events[i].events; -+ uint32_t index = wakeup_poll.events[i].data.u32; -+ fds[index].revents = wakeup_poll.events[i].events; - } - event_num += kernel_num >= 0 ? kernel_num : 0; - } - - if (event_num > 0) { -+ while (sem_trywait(&wakeup_poll.event_sem) == 0); - break; - } - -+ wakeup_poll.have_kernel_event = false; - if (timeout < 0) { -- ret = sem_wait(&g_wakeup_poll.event_sem); -+ ret = sem_wait(&wakeup_poll.event_sem); - } else { -- ret = sem_timedwait(&g_wakeup_poll.event_sem, &poll_time); -+ ret = sem_timedwait(&wakeup_poll.event_sem, &poll_time); - } - } while (ret == 0); - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index bf5dcb4..ec68d62 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -52,7 +52,7 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd) - return PATH_KERNEL; - } - -- if (unlikely(posix_api->is_chld)) { -+ if (unlikely(posix_api->ues_posix)) { - return PATH_KERNEL; - } - -@@ -84,7 +84,7 @@ static inline int32_t do_epoll_create(int32_t size) - return posix_api->epoll_create_fn(size); - } - -- if (unlikely(posix_api->is_chld)) { -+ if (unlikely(posix_api->ues_posix)) { - return posix_api->epoll_create_fn(size); - } - -@@ -93,7 +93,7 @@ static inline int32_t do_epoll_create(int32_t size) - - static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event* event) - { -- if (unlikely(posix_api->is_chld)) { -+ if (unlikely(posix_api->ues_posix)) { - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - -@@ -102,7 +102,7 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct - - static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { -- if (unlikely(posix_api->is_chld)) { -+ if (unlikely(posix_api->ues_posix)) { - return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - -@@ -203,7 +203,8 @@ static inline int32_t do_listen(int32_t s, int32_t backlog) - return posix_api->listen_fn(s, backlog); - } - -- int32_t ret = stack_broadcast_listen(s, backlog); -+ int32_t ret = get_global_cfg_params()->listen_shadow ? stack_broadcast_listen(s, backlog) : -+ stack_single_listen(s, backlog); - if (ret != 0) { - return ret; - } -@@ -264,7 +265,7 @@ static inline int32_t do_setsockopt(int32_t s, int32_t level, int32_t optname, c - static inline int32_t do_socket(int32_t domain, int32_t type, int32_t protocol) - { - if ((domain != AF_INET && domain != AF_UNSPEC) -- || posix_api->is_chld) { -+ || posix_api->ues_posix) { - return posix_api->socket_fn(domain, type, protocol); - } - -@@ -368,7 +369,7 @@ static int32_t do_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - GAZELLE_RETURN(EINVAL); - } - -- if (unlikely(posix_api->is_chld) || nfds == 0) { -+ if (unlikely(posix_api->ues_posix) || nfds == 0) { - return posix_api->poll_fn(fds, nfds, timeout); - } - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 13086a3..ca2b979 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -56,6 +56,7 @@ static int32_t parse_devices(void); - static int32_t parse_dpdk_args(void); - static int32_t parse_gateway_addr(void); - static int32_t parse_kni_switch(void); -+static int32_t parse_listen_shadow(void); - - struct config_vector_t { - const char *name; -@@ -73,6 +74,7 @@ static struct config_vector_t g_config_tbl[] = { - { "num_wakeup", parse_wakeup_cpu_number }, - { "low_power_mode", parse_low_power_mode }, - { "kni_switch", parse_kni_switch }, -+ { "listen_shadow", parse_listen_shadow }, - { NULL, NULL } - }; - -@@ -670,6 +672,22 @@ static int32_t parse_use_ltran(void) - return 0; - } - -+static int32_t parse_listen_shadow(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "listen_shadow"); -+ if (arg == NULL) { -+ g_config_params.listen_shadow = false; -+ return 0; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ g_config_params.listen_shadow = (val == 0) ? false : true; -+ -+ return 0; -+} -+ - static int32_t parse_kni_switch(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 26a1b1c..ef38fb5 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -713,7 +713,7 @@ void control_server_thread(void *arg) - struct epoll_event evt_array; - while (1) { - /* wait init finish */ -- if (posix_api->is_chld) { -+ if (posix_api->ues_posix) { - usleep(GAZELLE_10MS); - continue; - } -@@ -759,7 +759,7 @@ void control_client_thread(void *arg) - - while (1) { - /* wait init finish */ -- if (posix_api->is_chld) { -+ if (posix_api->ues_posix) { - usleep(GAZELLE_10MS); - continue; - } -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index df0332b..6675d7b 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -129,26 +129,6 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - return pool; - } - --struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id) --{ -- char pool_name[PATH_MAX]; -- struct rte_mempool *pool; -- int32_t ret; -- -- ret = snprintf_s(pool_name, sizeof(pool_name), PATH_MAX - 1, "%s_%hu", name, queue_id); -- if (ret < 0) { -- return NULL; -- } -- -- pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL, -- NULL, rte_socket_id(), 0); -- if (pool == NULL) { -- LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); -- } -- -- return pool; --} -- - static struct reg_ring_msg *create_reg_mempool(const char *name, uint16_t queue_id) - { - int ret; -@@ -175,13 +155,13 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF, RX_MBUF_CACHE_SZ, -+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ, - stack->queue_id); - if (stack->rx_pktmbuf_pool == NULL) { - return -1; - } - -- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF, TX_MBUF_CACHE_SZ, -+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ, - stack->queue_id); - if (stack->tx_pktmbuf_pool == NULL) { - return -1; -@@ -220,12 +200,14 @@ int32_t create_shared_ring(struct protocol_stack *stack) - lockless_queue_init(&stack->rpc_queue); - - if (get_protocol_stack_group()->wakeup_enable) { -- stack->wakeup_ring = create_ring("WAKEUP_RING", VDEV_WAKEUP_QUEUE_SZ, 0, stack->queue_id); -+ stack->wakeup_ring = create_ring("WAKEUP_RING", VDEV_WAKEUP_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, -+ stack->queue_id); - if (stack->wakeup_ring == NULL) { - return -1; - } - } - -+ - if (use_ltran()) { - stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); - if (stack->rx_ring == NULL) { -@@ -255,7 +237,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui - struct rte_mbuf *free_buf[FREE_RX_QUEUE_SZ]; - - while (remain > 0) { -- batch = LWIP_MIN(remain, FREE_RX_QUEUE_SZ); -+ batch = LWIP_MIN(remain, RING_SIZE(FREE_RX_QUEUE_SZ)); - - ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch); - if (ret != 0) { -@@ -263,7 +245,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui - return -1; - } - -- ret = rte_ring_en_enqueue_bulk(ring, (void **)free_buf, batch); -+ ret = gazelle_ring_sp_enqueue(ring, (void **)free_buf, batch); - if (ret == 0) { - LSTACK_LOG(ERR, LSTACK, "cannot enqueue to ring, count: %d\n", (int32_t)batch); - return -1; -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index f8e96bf..78040b0 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -143,7 +143,7 @@ static int32_t check_preload_bind_proc(void) - - __attribute__((destructor)) void gazelle_network_exit(void) - { -- if (posix_api != NULL && !posix_api->is_chld) { -+ if (posix_api != NULL && !posix_api->ues_posix) { - lwip_exit(); - } - -@@ -275,7 +275,6 @@ __attribute__((constructor)) void gazelle_network_init(void) - LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n"); - } - -- posix_api->is_chld = 0; -+ posix_api->ues_posix = 0; - LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n"); -- rte_smp_mb(); - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 8544ef7..156fc1f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -35,33 +35,24 @@ - #define HALF_DIVISOR (2) - #define USED_IDLE_WATERMARK (VDEV_IDLE_QUEUE_SZ >> 2) - --void listen_list_add_node(int32_t head_fd, int32_t add_fd) --{ -- struct lwip_sock *sock = NULL; -- int32_t fd = head_fd; -- -- while (fd > 0) { -- sock = get_socket(fd); -- if (sock == NULL) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %d get sock null\n", get_stack_tid(), fd); -- return; -- } -- fd = sock->nextfd; -- } -- sock->nextfd = add_fd; --} -+static int32_t lwip_alloc_pbufs(pbuf_layer layer, uint16_t length, pbuf_type type, void **pbufs, uint32_t num); - - static void free_ring_pbuf(struct rte_ring *ring) - { -- while (1) { -- struct pbuf *pbuf = NULL; -- int32_t ret = rte_ring_sc_dequeue(ring, (void **)&pbuf); -- if (ret != 0) { -- break; -- } -+ void *pbufs[SOCK_RECV_RING_SIZE]; - -- pbuf_free(pbuf); -- } -+ do { -+ gazelle_ring_read(ring, pbufs, RING_SIZE(SOCK_RECV_RING_SIZE)); -+ gazelle_ring_read_over(ring); -+ } while (gazelle_ring_readable_count(ring)); -+ -+ do { -+ uint32_t num = gazelle_ring_sc_dequeue(ring, pbufs, RING_SIZE(SOCK_RECV_RING_SIZE)); -+ -+ for (uint32_t i = 0; i < num; i++) { -+ pbuf_free(pbufs[i]); -+ } -+ } while (gazelle_ring_readover_count(ring)); - } - - static void reset_sock_data(struct lwip_sock *sock) -@@ -73,11 +64,6 @@ static void reset_sock_data(struct lwip_sock *sock) - } - sock->recv_ring = NULL; - -- if (sock->recv_wait_free) { -- free_ring_pbuf(sock->recv_wait_free); -- rte_ring_free(sock->recv_wait_free); -- } -- sock->recv_wait_free = NULL; - - if (sock->send_ring) { - free_ring_pbuf(sock->send_ring); -@@ -85,19 +71,11 @@ static void reset_sock_data(struct lwip_sock *sock) - } - sock->send_ring = NULL; - -- if (sock->send_idle_ring) { -- free_ring_pbuf(sock->send_idle_ring); -- rte_ring_free(sock->send_idle_ring); -- } -- sock->send_idle_ring = NULL; - - sock->stack = NULL; - sock->wakeup = NULL; -- sock->events = 0; -- sock->nextfd = -1; -- sock->attach_fd = -1; -+ sock->listen_next = NULL; - sock->wait_close = false; -- sock->shadowed_sock = NULL; - sock->epoll_events = 0; - sock->events = 0; - -@@ -105,34 +83,29 @@ static void reset_sock_data(struct lwip_sock *sock) - pbuf_free(sock->recv_lastdata); - } - sock->recv_lastdata = NULL; -- -- if (sock->send_lastdata) { -- pbuf_free(sock->send_lastdata); -- } -- sock->send_lastdata = NULL; - } - - static void replenish_send_idlembuf(struct rte_ring *ring) - { -- uint32_t replenish_cnt = rte_ring_free_count(ring); -+ void *pbuf[SOCK_SEND_RING_SIZE]; - -- for (uint32_t i = 0; i < replenish_cnt; i++) { -- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); -- if (pbuf == NULL) { -- break; -- } -+ uint32_t replenish_cnt = gazelle_ring_free_count(ring); -+ uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); - -- int32_t ret = rte_ring_sp_enqueue(ring, (void *)pbuf); -- if (ret < 0) { -- pbuf_free(pbuf); -- break; -- } -+ if (lwip_alloc_pbufs(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM, (void **)pbuf, alloc_num) != 0) { -+ return; -+ } -+ -+ uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, alloc_num); -+ for (uint32_t i = num; i < alloc_num; i++) { -+ pbuf_free(pbuf[i]); - } - } - - void gazelle_init_sock(int32_t fd) - { - static uint32_t name_tick = 0; -+ struct protocol_stack *stack = get_protocol_stack(); - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - return; -@@ -140,38 +113,26 @@ void gazelle_init_sock(int32_t fd) - - reset_sock_data(sock); - -- sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); -+ sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ, -+ atomic_fetch_add(&name_tick, 1)); - if (sock->recv_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno); - return; - } - -- sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); -- if (sock->recv_wait_free == NULL) { -- LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno); -- return; -- } -- -- sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); -+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ, -+ atomic_fetch_add(&name_tick, 1)); - if (sock->send_ring == NULL) { - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -+ replenish_send_idlembuf(sock->send_ring); - -- sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1)); -- if (sock->send_idle_ring == NULL) { -- LSTACK_LOG(ERR, LSTACK, "idle_send create failed. errno: %d.\n", rte_errno); -- return; -- } -- replenish_send_idlembuf(sock->send_idle_ring); -- -- sock->stack = get_protocol_stack(); -+ sock->stack = stack; - sock->stack->conn_num++; -- init_list_node(&sock->recv_list); -- init_list_node(&sock->attach_list); -- init_list_node(&sock->listen_list); -- init_list_node(&sock->event_list); -- init_list_node(&sock->send_list); -+ init_list_node_null(&sock->recv_list); -+ init_list_node_null(&sock->event_list); -+ init_list_node_null(&sock->send_list); - } - - void gazelle_clean_sock(int32_t fd) -@@ -181,17 +142,18 @@ void gazelle_clean_sock(int32_t fd) - return; - } - -+ if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL) { -+ pthread_spin_lock(&sock->wakeup->event_list_lock); -+ list_del_node_null(&sock->event_list); -+ pthread_spin_unlock(&sock->wakeup->event_list_lock); -+ } -+ - sock->stack->conn_num--; - - reset_sock_data(sock); - -- list_del_node_init(&sock->recv_list); -- list_del_node_init(&sock->attach_list); -- list_del_node_init(&sock->listen_list); --#ifdef GAZELLE_USE_EPOLL_EVENT_STACK -- list_del_node_init(&sock->event_list); --#endif -- list_del_node_init(&sock->send_list); -+ list_del_node_null(&sock->recv_list); -+ list_del_node_null(&sock->send_list); - } - - void gazelle_free_pbuf(struct pbuf *pbuf) -@@ -201,45 +163,14 @@ void gazelle_free_pbuf(struct pbuf *pbuf) - } - - struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -- if (mbuf->pool != NULL) { -- rte_pktmbuf_free(mbuf); -- } else { -- rte_free(mbuf); -- } --} -- --static int32_t alloc_mbufs(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) --{ -- // alloc mbuf from pool -- if (rte_pktmbuf_alloc_bulk(pool, mbufs, num) == 0) { -- return 0; -- } -- -- // alloc mbuf from system -- for (uint32_t i = 0; i < num; i++) { -- struct rte_mbuf *mbuf = (struct rte_mbuf *)rte_malloc(NULL, pool->elt_size, sizeof(uint64_t)); -- if (mbuf == NULL) { -- for (uint32_t j = 0; j < i; j++) { -- rte_free(mbufs[j]); -- mbufs[j] = NULL; -- } -- return -1; -- } -- -- mbufs[i] = mbuf; -- rte_pktmbuf_init(pool, NULL, mbuf, 0); -- rte_pktmbuf_reset(mbuf); -- mbuf->pool = NULL; -- } -- -- return 0; -+ rte_pktmbuf_free(mbuf); - } - - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) - { - struct pbuf_custom *pbuf_custom = NULL; - -- int32_t ret = alloc_mbufs(pool, mbufs, num); -+ int32_t ret = rte_pktmbuf_alloc_bulk(pool, mbufs, num); - if (ret != 0) { - return ret; - } -@@ -252,86 +183,98 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - return 0; - } - --struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) -+static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, uint16_t length, pbuf_type type) - { -- struct rte_mbuf *mbuf; -- int32_t ret = alloc_mbufs(get_protocol_stack()->tx_pktmbuf_pool, &mbuf, 1); -- if (ret != 0) { -- get_protocol_stack()->stats.tx_allocmbuf_fail++; -- return NULL; -- } -- - struct pbuf_custom *pbuf_custom = mbuf_to_pbuf(mbuf); - pbuf_custom->custom_free_function = gazelle_free_pbuf; - - void *data = rte_pktmbuf_mtod(mbuf, void *); - struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); -- --#if CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW - if (pbuf) { - pbuf->ol_flags = 0; - pbuf->l2_len = 0; - pbuf->l3_len = 0; - } --#endif - - return pbuf; - } - --struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags) -+static int32_t lwip_alloc_pbufs(pbuf_layer layer, uint16_t length, pbuf_type type, void **bufs, uint32_t num) - { -- struct pbuf *pbuf = NULL; -+ int32_t ret = rte_pktmbuf_alloc_bulk(get_protocol_stack()->tx_pktmbuf_pool, (struct rte_mbuf **)bufs, num); -+ if (ret != 0) { -+ get_protocol_stack()->stats.tx_allocmbuf_fail++; -+ return -1; -+ } - -- if (sock->send_lastdata) { -- pbuf = sock->send_lastdata; -- sock->send_lastdata = NULL; -- } else { -- int32_t ret = rte_ring_sc_dequeue(sock->send_ring, (void **)&pbuf); -- if (ret != 0) { -- *apiflags &= ~TCP_WRITE_FLAG_MORE; -- return NULL; -- } -+ for (uint32_t i = 0; i < num; i++) { -+ bufs[i] = init_mbuf_to_pbuf(bufs[i], layer, length, type); - } - -- if (pbuf->tot_len >= remain_size) { -- sock->send_lastdata = pbuf; -- *apiflags |= TCP_WRITE_FLAG_MORE; /* set TCP_PSH flag */ -+ return 0; -+} -+ -+struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) -+{ -+ struct pbuf *pbuf; -+ -+ if (lwip_alloc_pbufs(layer, length, type, (void **)&pbuf, 1) != 0) { - return NULL; - } - -- replenish_send_idlembuf(sock->send_idle_ring); -+ return pbuf; -+} - -- if ((sock->epoll_events & EPOLLOUT) && rte_ring_free_count(sock->send_ring)) { -- add_epoll_event(sock->conn, EPOLLOUT); -+struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags) -+{ -+ struct pbuf *pbuf = NULL; -+ -+ if (gazelle_ring_sc_dequeue(sock->send_ring, (void **)&pbuf, 1) != 1) { -+ *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ return NULL; - } - - sock->stack->stats.write_lwip_cnt++; - return pbuf; - } - -+static inline void del_data_out_event(struct lwip_sock *sock) -+{ -+ pthread_spin_lock(&sock->wakeup->event_list_lock); -+ -+ /* check again avoid cover event add in stack thread */ -+ if (!NETCONN_IS_OUTIDLE(sock)) { -+ sock->events &= ~EPOLLOUT; -+ -+ if (sock->events == 0) { -+ list_del_node_null(&sock->event_list); -+ } -+ } -+ -+ pthread_spin_unlock(&sock->wakeup->event_list_lock); -+} -+ - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - { -- if (sock->events & EPOLLERR) { -+ if (sock->errevent > 0) { - return 0; - } - -- uint32_t free_count = rte_ring_free_count(sock->send_ring); -+ uint32_t free_count = gazelle_ring_readable_count(sock->send_ring); - if (free_count == 0) { - return -1; - } - -- uint32_t avaible_cont = rte_ring_count(sock->send_idle_ring); -- avaible_cont = LWIP_MIN(free_count, avaible_cont); -- - struct pbuf *pbuf = NULL; - ssize_t send_len = 0; - size_t copy_len; - uint32_t send_pkt = 0; - -- while (send_len < len && send_pkt < avaible_cont) { -- int32_t ret = rte_ring_sc_dequeue(sock->send_idle_ring, (void **)&pbuf); -- if (ret < 0) { -- sock->stack->stats.app_write_idlefail++; -+ while (send_len < len && send_pkt < free_count) { -+ if (gazelle_ring_read(sock->send_ring, (void **)&pbuf, 1) != 1) { -+ if (sock->wakeup) { -+ sock->wakeup->stat.app_write_idlefail++; -+ } - break; - } - -@@ -339,21 +282,42 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - pbuf_take(pbuf, (char *)buf + send_len, copy_len); - pbuf->tot_len = pbuf->len = copy_len; - -- ret = rte_ring_sp_enqueue(sock->send_ring, pbuf); -- if (ret != 0) { -- sock->stack->stats.app_write_drop++; -- pbuf_free(pbuf); -- break; -- } -- - send_len += copy_len; - send_pkt++; - } -- __sync_fetch_and_add(&sock->stack->stats.app_write_cnt, send_pkt); -+ gazelle_ring_read_over(sock->send_ring); -+ -+ if (sock->wakeup) { -+ sock->wakeup->stat.app_write_cnt += send_pkt; -+ if (sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -+ del_data_out_event(sock); -+ } -+ } - - return (send_len <= 0) ? -1 : send_len; - } - -+static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) -+{ -+ /* send all send_ring, so len set lwip send max. */ -+ ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -+ if (len == 0) { -+ /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -+ sock->errevent = 1; -+ add_epoll_event(sock->conn, EPOLLERR); -+ } -+ -+ if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -+ replenish_send_idlembuf(sock->send_ring); -+ } -+ -+ if (len > 0) { -+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -+ add_epoll_event(sock->conn, EPOLLOUT); -+ } -+ } -+} -+ - void stack_send(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; -@@ -369,17 +333,11 @@ void stack_send(struct rpc_msg *msg) - return; - } - -- /* send all send_ring, so len set lwip send max. */ -- ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -- if (len == 0) { -- /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -- add_epoll_event(sock->conn, EPOLLERR); -- } -+ do_lwip_send(fd, sock, flags); - - /* have remain data add sendlist */ - if (NETCONN_IS_DATAOUT(sock)) { -- if (list_is_empty(&sock->send_list)) { -- sock->send_flags = flags; -+ if (list_is_null(&sock->send_list)) { - list_add_node(&sock->stack->send_list, &sock->send_list); - } - sock->stack->stats.send_self_rpc++; -@@ -396,20 +354,14 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - sock = container_of(node, struct lwip_sock, send_list); - - if (sock->conn == NULL || !NETCONN_IS_DATAOUT(sock)) { -- list_del_node_init(&sock->send_list); -+ list_del_node_null(&sock->send_list); - continue; - } - -- /* send all send_ring, so len set lwip send max. */ -- ssize_t len = lwip_send(sock->conn->socket, sock, UINT16_MAX, sock->send_flags); -- if (len == 0) { -- /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -- add_epoll_event(sock->conn, EPOLLERR); -- list_del_node_init(&sock->send_list); -- } -+ do_lwip_send(sock->conn->socket, sock, 0); - - if (!NETCONN_IS_DATAOUT(sock)) { -- list_del_node_init(&sock->send_list); -+ list_del_node_null(&sock->send_list); - } - - if (++read_num >= send_max) { -@@ -418,26 +370,39 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - } - } - -+static inline void free_recv_ring_readover(struct rte_ring *ring) -+{ -+ void *pbufs[SOCK_RECV_RING_SIZE]; -+ uint32_t num = gazelle_ring_sc_dequeue(ring, pbufs, RING_SIZE(SOCK_RECV_RING_SIZE)); -+ for (uint32_t i = 0; i < num; i++) { -+ pbuf_free(pbufs[i]); -+ } -+} -+ - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - { - if (sock->conn->recvmbox == NULL) { - return 0; - } - -- if (rte_ring_count(sock->recv_wait_free)) { -- free_ring_pbuf(sock->recv_wait_free); -+ if (gazelle_ring_readover_count(sock->recv_ring) >= SOCK_RECV_FREE_THRES) { -+ free_recv_ring_readover(sock->recv_ring); -+ } -+ -+ uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); -+ if (free_count == 0) { -+ GAZELLE_RETURN(EAGAIN); - } - -- uint32_t free_count = rte_ring_free_count(sock->recv_ring); - uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -- uint32_t read_max = LWIP_MIN(free_count, data_count); -- struct pbuf *pbuf = NULL; -+ uint32_t read_num = LWIP_MIN(free_count, data_count); -+ read_num = LWIP_MIN(read_num, SOCK_RECV_RING_SIZE); -+ struct pbuf *pbufs[SOCK_RECV_RING_SIZE]; - uint32_t read_count = 0; - ssize_t recv_len = 0; -- int32_t ret; - -- for (uint32_t i = 0; i < read_max; i++) { -- err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbuf, apiflags); -+ for (uint32_t i = 0; i < read_num; i++) { -+ err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbufs[i], apiflags); - if (err != ERR_OK) { - if (recv_len > 0) { - /* already received data, return that (this trusts in getting the same error from -@@ -448,35 +413,28 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - return (err == ERR_CLSD) ? 0 : -1; - } - -- if (!(flags & MSG_PEEK)) { -- ret = rte_ring_sp_enqueue(sock->recv_ring, pbuf); -- if (ret != 0) { -- pbuf_free(pbuf); -- sock->stack->stats.read_lwip_drop++; -- break; -- } -- read_count++; -- } -- -- if (get_protocol_stack_group()->latency_start) { -- calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_LWIP); -- } -- -- recv_len += pbuf->len; -+ recv_len += pbufs[i]->tot_len; -+ read_count++; - - /* once we have some data to return, only add more if we don't need to wait */ - apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN; - } - -- if (data_count > read_count) { -- add_recv_list(sock->conn->socket); -+ if (!(flags & MSG_PEEK)) { -+ uint32_t enqueue_num = gazelle_ring_sp_enqueue(sock->recv_ring, (void **)pbufs, read_count); -+ for (uint32_t i = enqueue_num; i < read_count; i++) { -+ /* update receive window */ -+ tcp_recved(sock->conn->pcb.tcp, pbufs[i]->tot_len); -+ pbuf_free(pbufs[i]); -+ sock->stack->stats.read_lwip_drop++; -+ } - } - -- if (recv_len > 0 && (flags & MSG_PEEK) == 0) { -- add_epoll_event(sock->conn, EPOLLIN); -+ for (uint32_t i = 0; get_protocol_stack_group()->latency_start && i < read_count; i++) { -+ calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); - } -- sock->stack->stats.read_lwip_cnt += read_count; - -+ sock->stack->stats.read_lwip_cnt += read_count; - if (recv_len == 0) { - GAZELLE_RETURN(EAGAIN); - } -@@ -532,14 +490,12 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - GAZELLE_RETURN(EINVAL); - } - -- sock->send_flags = flags; - ssize_t send = write_stack_data(sock, buf, len); - if (send < 0) { - GAZELLE_RETURN(EAGAIN); - } else if (send == 0) { - return 0; - } -- rte_smp_mb(); - - rpc_call_send(fd, NULL, send, flags); - return send; -@@ -574,22 +530,52 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - return buflen; - } - -+static inline void del_data_in_event(struct lwip_sock *sock) -+{ -+ pthread_spin_lock(&sock->wakeup->event_list_lock); -+ -+ /* check again avoid cover event add in stack thread */ -+ if (!NETCONN_IS_DATAIN(sock)) { -+ sock->events &= ~EPOLLIN; -+ -+ if (sock->events == 0) { -+ list_del_node_null(&sock->event_list); -+ } -+ } -+ -+ pthread_spin_unlock(&sock->wakeup->event_list_lock); -+} -+ -+static struct pbuf *pbuf_free_partial(struct pbuf *pbuf, uint16_t free_len) -+{ -+ while (free_len && pbuf) { -+ if (free_len >= pbuf->len) { -+ struct pbuf *p = pbuf; -+ pbuf = pbuf->next; -+ free_len = free_len - p->len; -+ } else { -+ pbuf_remove_header(pbuf, free_len); -+ break; -+ } -+ } -+ -+ return pbuf; -+} -+ - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - { - size_t recv_left = len; - struct pbuf *pbuf = NULL; - ssize_t recvd = 0; -- int32_t ret; -- u16_t copy_len; -+ uint16_t copy_len; - - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - LSTACK_LOG(ERR, LSTACK, "get_socket null fd %d.\n", fd); - GAZELLE_RETURN(EINVAL); - } -- sock->recv_flags = flags; - -- if ((sock->events & EPOLLERR) && !NETCONN_IS_DATAIN(sock)) { -+ if (sock->errevent > 0) { - return 0; - } - -@@ -598,35 +584,39 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - pbuf = sock->recv_lastdata; - sock->recv_lastdata = NULL; - } else { -- ret = rte_ring_sc_dequeue(sock->recv_ring, (void **)&pbuf); -- if (ret != 0) { -+ if (gazelle_ring_read(sock->recv_ring, (void **)&pbuf, 1) != 1) { - break; - } - } - -- copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : (u16_t)recv_left; -+ copy_len = (recv_left > pbuf->len) ? pbuf->len : (uint16_t)recv_left; - pbuf_copy_partial(pbuf, (char *)buf + recvd, copy_len, 0); - - recvd += copy_len; - recv_left -= copy_len; - -- if (pbuf->tot_len > copy_len) { -- sock->recv_lastdata = pbuf_free_header(pbuf, copy_len); -+ if (pbuf->len > copy_len || pbuf->next) { -+ sock->recv_lastdata = pbuf_free_partial(pbuf, copy_len); - } else { -+ if (sock->wakeup) { -+ sock->wakeup->stat.app_read_cnt += 1; -+ } - if (get_protocol_stack_group()->latency_start) { - calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_READ); - } -- ret = rte_ring_sp_enqueue(sock->recv_wait_free, pbuf); -- if (ret != 0) { -- pbuf_free(pbuf); -- } -- sock->recv_lastdata = NULL; -- __sync_fetch_and_add(&sock->stack->stats.app_read_cnt, 1); -+ gazelle_ring_read_over(sock->recv_ring); - } - } - -+ /* rte_ring_count reduce lock */ -+ if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN)) { -+ del_data_in_event(sock); -+ } -+ - if (recvd == 0) { -- sock->stack->stats.read_null++; -+ if (sock->wakeup) { -+ sock->wakeup->stat.read_null++; -+ } - GAZELLE_RETURN(EAGAIN); - } - return recvd; -@@ -634,9 +624,9 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - - void add_recv_list(int32_t fd) - { -- struct lwip_sock *sock = get_socket(fd); -+ struct lwip_sock *sock = get_socket_by_fd(fd); - -- if (sock->stack && list_is_empty(&sock->recv_list)) { -+ if (sock && sock->stack && list_is_null(&sock->recv_list)) { - list_add_node(&sock->stack->recv_list, &sock->recv_list); - } - } -@@ -648,24 +638,26 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - struct lwip_sock *sock; - uint32_t read_num = 0; - -+ struct list_node *last_node = list->prev; - list_for_each_safe(node, temp, list) { - sock = container_of(node, struct lwip_sock, recv_list); - -- if (sock->conn == NULL || sock->recv_ring == NULL || sock->send_ring == NULL || sock->conn->pcb.tcp == NULL) { -- list_del_node_init(&sock->recv_list); -+ if (sock->conn == NULL || sock->conn->recvmbox == NULL || rte_ring_count(sock->conn->recvmbox->ring) == 0) { -+ list_del_node_null(&sock->recv_list); - continue; - } - -- if (rte_ring_free_count(sock->recv_ring)) { -- list_del_node_init(&sock->recv_list); -- ssize_t len = lwip_recv(sock->conn->socket, NULL, 0, sock->recv_flags); -- if (len == 0) { -- /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -- add_epoll_event(sock->conn, EPOLLERR); -- } -+ ssize_t len = lwip_recv(sock->conn->socket, NULL, 0, 0); -+ if (len == 0) { -+ /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -+ sock->errevent = 1; -+ add_epoll_event(sock->conn, EPOLLERR); -+ } else if (len > 0) { -+ add_epoll_event(sock->conn, EPOLLIN); - } - -- if (++read_num >= max_num) { -+ /* last_node:recv only once per sock. max_num avoid cost too much time this loop */ -+ if (++read_num >= max_num || last_node == node) { - break; - } - } -@@ -684,14 +676,14 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - - if (netconn != NULL && netconn->recvmbox != NULL) { - conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring); -+ conn->fd = netconn->socket; - - struct lwip_sock *sock = get_socket(netconn->socket); - if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { -- conn->recv_ring_cnt = rte_ring_count(sock->recv_ring); -+ conn->recv_ring_cnt = gazelle_ring_readable_count(sock->recv_ring); - conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; - -- conn->send_ring_cnt = rte_ring_count(sock->send_ring); -- conn->send_ring_cnt += (sock->send_lastdata) ? 1 : 0; -+ conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring); - - if (sock->wakeup) { - sem_getvalue(&sock->wakeup->event_sem, &conn->sem_cnt); -@@ -756,9 +748,11 @@ void create_shadow_fd(struct rpc_msg *msg) - } - - clone_lwip_socket_opt(clone_sock, sock); -- clone_sock->shadowed_sock = sock; - -- listen_list_add_node(fd, clone_fd); -+ while (sock->listen_next) { -+ sock = sock->listen_next; -+ } -+ sock->listen_next = clone_sock; - - int32_t ret = lwip_bind(clone_fd, addr, addr_len); - if (ret < 0) { -@@ -843,11 +837,6 @@ static uint32_t get_list_count(struct list_node *list) - return count; - } - --void stack_eventlist_count(struct rpc_msg *msg) --{ -- msg->result = get_list_count(&get_protocol_stack()->event_list); --} -- - void stack_sendlist_count(struct rpc_msg *msg) - { - msg->result = get_list_count(&get_protocol_stack()->send_list); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 88513ba..a1f3790 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -11,6 +11,7 @@ - */ - #define _GNU_SOURCE - #include -+#include - - #include - #include -@@ -30,6 +31,7 @@ - #include "lstack_protocol_stack.h" - #include "lstack_cfg.h" - #include "lstack_control_plane.h" -+#include "posix/lstack_epoll.h" - #include "lstack_stack_stat.h" - - #define READ_LIST_MAX 32 -@@ -39,7 +41,6 @@ - - static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; - static struct protocol_stack_group g_stack_group = {0}; --static PER_THREAD long g_stack_tid = 0; - - void set_init_fail(void); - typedef void *(*stack_thread_func)(void *arg); -@@ -66,6 +67,8 @@ static inline void set_stack_idx(uint16_t idx) - - long get_stack_tid(void) - { -+ static PER_THREAD long g_stack_tid = 0; -+ - if (g_stack_tid == 0) { - g_stack_tid = syscall(__NR_gettid); - } -@@ -96,17 +99,37 @@ struct protocol_stack *get_protocol_stack_by_fd(int32_t fd) - return sock->stack; - } - --struct protocol_stack *get_minconn_protocol_stack(void) -+struct protocol_stack *get_bind_protocol_stack(void) - { -- int32_t min_index = 0; -+ static PER_THREAD struct protocol_stack *bind_stack = NULL; -+ -+ /* same app communication thread bind same stack */ -+ if (bind_stack) { -+ return bind_stack; -+ } - -- for (int32_t i = 1; i < g_stack_group.stack_num; i++) { -- if (g_stack_group.stacks[i]->conn_num < g_stack_group.stacks[min_index]->conn_num) { -- min_index = i; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ uint16_t index = 0; -+ -+ /* close listen shadow, per app communication thread select only one stack */ -+ if (get_global_cfg_params()->listen_shadow == false) { -+ static uint16_t stack_index = 0; -+ index = atomic_fetch_add(&stack_index, 1); -+ if (index >= stack_group->stack_num) { -+ LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num); -+ return NULL; -+ } -+ /* use listen shadow, app communication thread maybe more than stack num, select the least load stack */ -+ } else { -+ for (uint16_t i = 1; i < stack_group->stack_num; i++) { -+ if (stack_group->stacks[i]->conn_num < stack_group->stacks[index]->conn_num) { -+ index = i; -+ } - } - } - -- return g_stack_group.stacks[min_index]; -+ bind_stack = stack_group->stacks[index]; -+ return stack_group->stacks[index]; - } - - void lstack_low_power_idling(void) -@@ -193,7 +216,7 @@ static int32_t create_thread(uint16_t queue_id, char *thread_name, stack_thread_ - return 0; - } - --static void* gazelle_weakup_thread(void *arg) -+static void* gazelle_wakeup_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; - struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -@@ -203,17 +226,13 @@ static void* gazelle_weakup_thread(void *arg) - - LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - -+ sem_t *event_sem[WAKEUP_MAX_NUM]; -+ int num; - for (;;) { -- if (rte_ring_count(stack->wakeup_ring) == 0) { -- continue; -- } -- -- sem_t *event_sem; -- if (rte_ring_sc_dequeue(stack->wakeup_ring, (void **)&event_sem)) { -- continue; -+ num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -+ for (int i = 0; i < num; i++) { -+ sem_post(event_sem[i]); - } -- -- sem_post(event_sem); - } - - return NULL; -@@ -233,12 +252,8 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - stack->lwip_stats = &lwip_stats; - - init_list_node(&stack->recv_list); -- init_list_node(&stack->listen_list); -- init_list_node(&stack->event_list); - init_list_node(&stack->send_list); - -- pthread_spin_init(&stack->event_lock, PTHREAD_PROCESS_SHARED); -- - sys_calibrate_tsc(); - stack_stat_init(); - -@@ -297,8 +312,10 @@ static void* gazelle_kernel_event(void *arg) - } - - for (int32_t i = 0; i < event_num; i++) { -- if (events[i].data.ptr) { -- sem_post((sem_t *)events[i].data.ptr); -+ struct wakeup_poll *wakeup = events[i].data.ptr; -+ if (wakeup) { -+ __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE); -+ sem_post(&wakeup->event_sem); - } - } - } -@@ -311,7 +328,7 @@ static int32_t create_companion_thread(struct protocol_stack_group *stack_group, - int32_t ret; - - if (stack_group->wakeup_enable) { -- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread); -+ ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); - return ret; -@@ -339,13 +356,11 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - - struct protocol_stack *stack = malloc(sizeof(*stack)); - if (stack == NULL) { -- sem_post(&stack_group->thread_phase1); - LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); - return NULL; - } - - if (init_stack_value(stack, queue_id) != 0) { -- sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } -@@ -358,7 +373,6 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id) - - if (use_ltran()) { - if (client_reg_thrd_ring() != 0) { -- sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } -@@ -419,6 +433,8 @@ static int32_t init_protocol_sem(void) - int32_t ret; - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -+ pthread_spin_init(&stack_group->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -+ - if (!use_ltran()) { - ret = sem_init(&stack_group->ethdev_init, 0, 0); - if (ret < 0) { -@@ -449,6 +465,7 @@ int32_t init_protocol_stack(void) - - stack_group->stack_num = get_global_cfg_params()->num_cpu; - stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ stack_group->wakeup_list = NULL; - - if (init_protocol_sem() != 0) { - return -1; -@@ -486,58 +503,10 @@ void stack_socket(struct rpc_msg *msg) - } - } - --static inline bool is_real_close(int32_t fd) --{ -- struct lwip_sock *sock = get_socket_by_fd(fd); -- -- /* last sock */ -- if (list_is_empty(&sock->attach_list)) { -- return true; -- } -- -- /* listen sock, but have attach sock */ -- if (sock->attach_fd == fd) { -- sock->wait_close = true; -- return false; -- } else { /* attach sock */ -- /* listen sock is normal */ -- struct lwip_sock *listen_sock = get_socket_by_fd(sock->attach_fd); -- if (listen_sock == NULL || !listen_sock->wait_close) { -- list_del_node_init(&sock->attach_list); -- return true; -- } -- -- /* listen sock is wait clsoe. check this is last attach sock */ -- struct list_node *list = &(sock->attach_list); -- struct list_node *node, *temp; -- uint32_t list_count = 0; -- list_for_each_safe(node, temp, list) { -- list_count++; -- } -- /* 2:listen sock is wait close and closing attach sock. close listen sock here */ -- if (list_count == 2) { -- lwip_close(listen_sock->attach_fd); -- gazelle_clean_sock(listen_sock->attach_fd); -- posix_api->close_fn(listen_sock->attach_fd); -- list_del_node_init(&listen_sock->attach_list); -- } -- list_del_node_init(&sock->attach_list); -- return true; -- } -- -- list_del_node_init(&sock->attach_list); -- return true; --} -- - void stack_close(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; - -- if (!is_real_close(fd)) { -- msg->result = 0; -- return; -- } -- - msg->result = lwip_close(fd); - if (msg->result != 0) { - LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -@@ -556,26 +525,8 @@ void stack_bind(struct rpc_msg *msg) - } - } - --static inline struct lwip_sock *reuse_listen(struct protocol_stack *stack, struct lwip_sock *listen_sock) --{ -- struct list_node *node, *temp; -- struct list_node *list = &(stack->listen_list); -- struct lwip_sock *sock; -- -- list_for_each_safe(node, temp, list) { -- sock = container_of(node, struct lwip_sock, listen_list); -- if (sock->conn->pcb.tcp->local_port == listen_sock->conn->pcb.tcp->local_port && -- sock->conn->pcb.tcp->local_ip.addr == listen_sock->conn->pcb.tcp->local_ip.addr) { -- return sock; -- } -- } -- -- return NULL; --} -- - void stack_listen(struct rpc_msg *msg) - { -- struct protocol_stack *stack = get_protocol_stack(); - int32_t fd = msg->args[MSG_ARG_0].i; - int32_t backlog = msg->args[MSG_ARG_1].i; - -@@ -585,25 +536,9 @@ void stack_listen(struct rpc_msg *msg) - return; - } - -- /* stack have listen same ip+port, then attach to old listen */ -- struct lwip_sock *listen_sock = reuse_listen(stack, sock); -- if (listen_sock) { -- if (list_is_empty(&sock->attach_list)) { -- list_add_node(&listen_sock->attach_list, &sock->attach_list); -- } -- sock->attach_fd = listen_sock->conn->socket; -- msg->result = 0; -- return; -- } -- - /* new listen add to stack listen list */ - msg->result = lwip_listen(fd, backlog); -- if (msg->result == 0) { -- if (list_is_empty(&sock->listen_list)) { -- list_add_node(&stack->listen_list, &sock->listen_list); -- } -- sock->attach_fd = fd; -- } else { -+ if (msg->result != 0) { - LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); - } - } -@@ -611,28 +546,35 @@ void stack_listen(struct rpc_msg *msg) - void stack_accept(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; -+ msg->result = -1; - - int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (accept_fd > 0) { -- struct lwip_sock *sock = get_socket(accept_fd); -- if (sock && sock->stack) { -- msg->result = accept_fd; -- return; -- } -+ if (accept_fd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -+ return; -+ } - -+ struct lwip_sock *sock = get_socket(accept_fd); -+ if (sock == NULL || sock->stack == NULL) { - lwip_close(accept_fd); - gazelle_clean_sock(accept_fd); - posix_api->close_fn(accept_fd); -+ LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -+ return; - } - -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %d\n", get_stack_tid(), msg->args[MSG_ARG_0].i, -- fd, accept_fd); -- msg->result = -1; -+ msg->result = accept_fd; -+ if (rte_ring_count(sock->conn->recvmbox->ring)) { -+ add_recv_list(accept_fd); -+ } - } - - void stack_connect(struct rpc_msg *msg) - { - msg->result = lwip_connect(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].socklen); -+ if (msg->result < 0) { -+ msg->result = -errno; -+ } - } - - void stack_getpeername(struct rpc_msg *msg) -@@ -723,6 +665,7 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - - ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); - if (ret != 0) { -+ stack->stats.rx_allocmbuf_fail++; - return; - } - copy_mbuf(mbuf_copy, mbuf); -@@ -737,22 +680,28 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - /* when fd is listenfd, listenfd of all protocol stack thread will be closed */ - int32_t stack_broadcast_close(int32_t fd) - { -- struct lwip_sock *sock = NULL; -- int32_t next_fd; -+ struct lwip_sock *sock = get_socket(fd); -+ int32_t ret = 0; -+ -+ do { -+ sock = sock->listen_next; -+ if (rpc_call_close(fd)) { -+ ret = -1; -+ } - -- while (fd > 0) { -- sock = get_socket(fd); - if (sock == NULL) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %d get sock null\n", get_stack_tid(), fd); -- GAZELLE_RETURN(EINVAL); -+ break; - } -- next_fd = sock->nextfd; -+ fd = sock->conn->socket; -+ } while (sock); - -- rpc_call_close(fd); -- fd = next_fd; -- } -+ return ret; -+} - -- return 0; -+/* choice one stack listen */ -+int32_t stack_single_listen(int32_t fd, int32_t backlog) -+{ -+ return rpc_call_listen(fd, backlog); - } - - /* listen sync to all protocol stack thread, so that any protocol stack thread can build connect */ -@@ -797,44 +746,59 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) - return 0; - } - --/* ergodic the protocol stack thread to find the connection, because all threads are listening */ --int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) -+static struct lwip_sock *get_min_accept_sock(int32_t fd) - { - struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL || sock->attach_fd < 0) { -- errno = EINVAL; -- return -1; -- } -- fd = sock->attach_fd; -- - struct lwip_sock *min_sock = NULL; -- int32_t min_fd = fd; -- while (fd > 0) { -- sock = get_socket(fd); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -- struct lwip_sock *attach_sock = get_socket(sock->attach_fd); -- if (attach_sock == NULL) { -- GAZELLE_RETURN(EINVAL); -- } - -- if (!NETCONN_IS_ACCEPTIN(attach_sock)) { -- fd = sock->nextfd; -+ while (sock) { -+ if (!NETCONN_IS_ACCEPTIN(sock)) { -+ sock = sock->listen_next; - continue; - } - -- if (min_sock == NULL || min_sock->stack->conn_num > attach_sock->stack->conn_num) { -- min_sock = attach_sock; -- min_fd = sock->attach_fd; -+ if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) { -+ min_sock = sock; - } - -- fd = sock->nextfd; -+ sock = sock->listen_next; -+ } -+ -+ return min_sock; -+} -+ -+static void inline del_accept_in_event(struct lwip_sock *sock) -+{ -+ pthread_spin_lock(&sock->wakeup->event_list_lock); -+ -+ if (!NETCONN_IS_ACCEPTIN(sock)) { -+ sock->events &= ~EPOLLIN; -+ if (sock->events == 0) { -+ list_del_node_null(&sock->event_list); -+ } - } - -+ pthread_spin_unlock(&sock->wakeup->event_list_lock); -+} -+ -+/* ergodic the protocol stack thread to find the connection, because all threads are listening */ -+int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) -+{ - int32_t ret = -1; -- if (min_sock) { -- ret = rpc_call_accept(min_fd, addr, addrlen); -+ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ errno = EINVAL; -+ return -1; -+ } -+ -+ struct lwip_sock *min_sock = get_min_accept_sock(fd); -+ if (min_sock && min_sock->conn) { -+ ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen); -+ } -+ -+ if (min_sock && min_sock->wakeup && min_sock->wakeup->type == WAKEUP_EPOLL) { -+ del_accept_in_event(min_sock); - } - - if (ret < 0) { -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 743857f..06fac5c 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -25,6 +25,7 @@ - #include "gazelle_dfx_msg.h" - #include "lstack_thread_rpc.h" - #include "lstack_stack_stat.h" -+#include "posix/lstack_epoll.h" - - #define US_PER_SEC 1000000 - -@@ -87,6 +88,68 @@ static void set_latency_start_flag(bool start) - } - } - -+void register_wakeup(struct wakeup_poll *wakeup) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ pthread_spin_lock(&stack_group->wakeup_list_lock); -+ -+ wakeup->next = stack_group->wakeup_list; -+ stack_group->wakeup_list = wakeup; -+ -+ pthread_spin_unlock(&stack_group->wakeup_list_lock); -+} -+ -+void unregister_wakeup(struct wakeup_poll *wakeup) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ pthread_spin_lock(&stack_group->wakeup_list_lock); -+ -+ struct wakeup_poll *node = stack_group->wakeup_list; -+ struct wakeup_poll *pre = NULL; -+ -+ while(node && node != wakeup) { -+ pre = node; -+ node = node->next; -+ } -+ -+ if (node == NULL) { -+ pthread_spin_unlock(&stack_group->wakeup_list_lock); -+ return; -+ } -+ -+ if (pre) { -+ pre->next = node->next; -+ } else { -+ stack_group->wakeup_list = node->next; -+ } -+ -+ pthread_spin_unlock(&stack_group->wakeup_list_lock); -+} -+ -+static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_stat *stat) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ pthread_spin_lock(&stack_group->wakeup_list_lock); -+ -+ struct wakeup_poll *node = stack_group->wakeup_list; -+ while (node) { -+ if (node->bind_stack == stack) { -+ stat->app_events += node->stat.app_events; -+ stat->read_null += node->stat.read_null; -+ stat->app_write_cnt += node->stat.app_write_cnt; -+ stat->app_write_idlefail += node->stat.app_write_idlefail; -+ stat->app_read_cnt += node->stat.app_read_cnt; -+ } -+ -+ node = node->next; -+ } -+ -+ pthread_spin_unlock(&stack_group->wakeup_list_lock); -+} -+ - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info) - { - struct cfg_params *cfg = get_global_cfg_params(); -@@ -102,21 +165,24 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - - dfx->loglevel = rte_log_get_level(RTE_LOGTYPE_LSTACK); -+ - lstack_get_low_power_info(&dfx->low_power_info); -- memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); -+ -+ memcpy_s(&dfx->data.pkts.stack_stat, sizeof(struct gazelle_stack_stat), &stack->stats, -+ sizeof(struct gazelle_stack_stat)); -+ -+ get_wakeup_stat(stack, &dfx->data.pkts.wakeup_stat); -+ - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; - - int32_t rpc_call_result = rpc_call_msgcnt(stack); - dfx->data.pkts.call_msg_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; - - rpc_call_result = rpc_call_recvlistcnt(stack); -- dfx->data.pkts.recv_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -- -- rpc_call_result = rpc_call_eventlistcnt(stack); -- dfx->data.pkts.event_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ dfx->data.pkts.recv_list_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; - - rpc_call_result = rpc_call_sendlistcnt(stack); -- dfx->data.pkts.send_list = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ dfx->data.pkts.send_list_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; - - dfx->data.pkts.conn_num = stack->conn_num; - } -@@ -182,6 +248,8 @@ int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode) - - for (uint32_t i = 0; i < stack_group->stack_num; i++) { - struct protocol_stack *stack = stack_group->stacks[i]; -+ -+ memset_s(&dfx, sizeof(dfx), 0, sizeof(dfx)); - get_stack_dfx_data(&dfx, stack, stat_mode); - - if (!use_ltran() && -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 312e192..8937920 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -23,34 +23,53 @@ - #include "lstack_dpdk.h" - #include "lstack_thread_rpc.h" - --static PER_THREAD struct rte_mempool *rpc_pool = NULL; -+#define RPC_MSG_MAX 32 -+struct rpc_msg_pool { -+ struct rpc_msg msgs[RPC_MSG_MAX]; -+ uint32_t prod __rte_cache_aligned; -+ uint32_t cons __rte_cache_aligned; -+}; -+ -+static PER_THREAD struct rpc_msg_pool *g_rpc_pool = NULL; -+ -+static inline __attribute__((always_inline)) struct rpc_msg *get_rpc_msg(struct rpc_msg_pool *rpc_pool) -+{ -+ uint32_t cons = __atomic_load_n(&rpc_pool->cons, __ATOMIC_ACQUIRE); -+ uint32_t prod = rpc_pool->prod + 1; -+ -+ if (prod == cons) { -+ return NULL; -+ } -+ -+ rpc_pool->prod = prod; -+ return &rpc_pool->msgs[prod]; -+} - - static inline __attribute__((always_inline)) - struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - { -- int32_t ret; - struct rpc_msg *msg = NULL; - - if (stack == NULL) { - return NULL; - } - -- static uint16_t pool_index = 0; -- if (rpc_pool == NULL) { -- rpc_pool = create_rpc_mempool("rpc_msg", atomic_fetch_add(&pool_index, 1)); -- if (rpc_pool == NULL) { -+ if (g_rpc_pool == NULL) { -+ g_rpc_pool = calloc(1, sizeof(struct rpc_msg_pool)); -+ if (g_rpc_pool == NULL) { -+ get_protocol_stack_group()->call_alloc_fail++; - return NULL; - } - } - -- ret = rte_mempool_get(rpc_pool, (void **)&msg); -- if (ret < 0) { -+ msg = get_rpc_msg(g_rpc_pool); -+ if (msg == NULL) { - get_protocol_stack_group()->call_alloc_fail++; - return NULL; - } -- msg->pool = rpc_pool; -+ msg->pool = g_rpc_pool; - -- pthread_spin_init(&msg->lock, PTHREAD_PROCESS_SHARED); -+ pthread_spin_init(&msg->lock, PTHREAD_PROCESS_PRIVATE); - msg->func = func; - msg->self_release = 1; - -@@ -64,7 +83,8 @@ void rpc_msg_free(struct rpc_msg *msg) - - msg->self_release = 0; - msg->func = NULL; -- rte_mempool_put(msg->pool, (void *)msg); -+ -+ atomic_fetch_add(&msg->pool->cons, 1); - } - - static inline __attribute__((always_inline)) -@@ -109,8 +129,6 @@ void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num) - stack->stats.call_null++; - } - -- rte_mb(); -- - if (msg->self_release) { - pthread_spin_unlock(&msg->lock); - } else { -@@ -192,16 +210,6 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - return rpc_sync_call(&stack->rpc_queue, msg); - } - --int32_t rpc_call_eventlistcnt(struct protocol_stack *stack) --{ -- struct rpc_msg *msg = rpc_msg_alloc(stack, stack_eventlist_count); -- if (msg == NULL) { -- return -1; -- } -- -- return rpc_sync_call(&stack->rpc_queue, msg); --} -- - int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendlist_count); -@@ -222,28 +230,6 @@ int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - return rpc_sync_call(&stack->rpc_queue, msg); - } - --void add_epoll_event(struct netconn *conn, uint32_t event); --static void rpc_add_event(struct rpc_msg *msg) --{ -- struct lwip_sock *sock = (struct lwip_sock *)msg->args[MSG_ARG_0].p; -- if (sock->conn) { -- add_epoll_event(sock->conn, sock->events); -- } --} -- --void rpc_call_addevent(struct protocol_stack *stack, void *sock) --{ -- struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_add_event); -- if (msg == NULL) { -- return; -- } -- -- msg->args[MSG_ARG_0].p = sock; -- -- msg->self_release = 0; -- rpc_call(&stack->rpc_queue, msg); --} -- - int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_arp); -@@ -260,7 +246,7 @@ int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - - int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol) - { -- struct protocol_stack *stack = get_minconn_protocol_stack(); -+ struct protocol_stack *stack = get_bind_protocol_stack(); - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_socket); - if (msg == NULL) { - return -1; -@@ -342,7 +328,12 @@ int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen) - msg->args[MSG_ARG_1].cp = addr; - msg->args[MSG_ARG_2].socklen = addrlen; - -- return rpc_sync_call(&stack->rpc_queue, msg); -+ int32_t ret = rpc_sync_call(&stack->rpc_queue, msg); -+ if (ret < 0) { -+ errno = -ret; -+ return -1; -+ } -+ return ret; - } - - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen) -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 987828d..aeffbb3 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -75,6 +75,7 @@ struct cfg_params { - uint32_t lpm_pkts_in_detect; - bool use_ltran; // ture:lstack read from nic false:read form ltran - bool kni_switch; -+ bool listen_shadow; // true:listen in all stack thread. false:listen in one stack thread. - int dpdk_argc; - char **dpdk_argv; - struct secondary_attach_arg sec_attach_arg; -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index bb9be21..6ffcc41 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -23,7 +23,7 @@ - #include "dpdk_common.h" - struct protocol_stack; - --#define RX_NB_MBUF ((5 * (MAX_CLIENTS / 4)) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) -+#define RX_NB_MBUF ((5 * MAX_CLIENTS) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) - #define RX_MBUF_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define TX_NB_MBUF (128 * DEFAULT_RING_SIZE) - #define TX_MBUF_CACHE_SZ (DEFAULT_RING_SIZE) -@@ -34,13 +34,13 @@ struct protocol_stack; - - #define MAX_PACKET_SZ 2048 - -+#define RING_SIZE(x) ((x) - 1) - - #define MBUF_SZ (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM) - - #define MAX_CORE_NUM 256 - #define CALL_MSG_RING_SIZE (unsigned long long)32 - #define CALL_CACHE_SZ 0 --#define CALL_POOL_SZ 128 - - /* Layout: - * | rte_mbuf | pbuf | custom_free_function | payload | -@@ -62,7 +62,6 @@ int32_t dpdk_eal_init(void); - int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num); - struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id); - int32_t create_shared_ring(struct protocol_stack *stack); --struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id); - void lstack_log_level_init(void); - int dpdk_ethdev_init(void); - int dpdk_ethdev_start(void); -diff --git a/src/lstack/include/lstack_lockless_queue.h b/src/lstack/include/lstack_lockless_queue.h -index c00d3a2..c70b56a 100644 ---- a/src/lstack/include/lstack_lockless_queue.h -+++ b/src/lstack/include/lstack_lockless_queue.h -@@ -1,5 +1,13 @@ - /* --* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. -+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. - */ - - #ifndef __GAZELLE_LOCKLESS_QUEUE_H__ -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index c73e3a7..ba57541 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -14,18 +14,16 @@ - #define __GAZELLE_LWIP_H__ - - #include "lstack_thread_rpc.h" -+#include "dpdk_common.h" - #include "lwipsock.h" - --#define SOCK_RECV_RING_SIZE (128) --#define SOCK_SEND_RING_SIZE (32) - - #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) --#define NETCONN_IS_DATAIN(sock) ((rte_ring_count((sock)->recv_ring) || (sock)->recv_lastdata)) --#define NETCONN_IS_DATAOUT(sock) ((rte_ring_count((sock)->send_ring) || (sock)->send_lastdata)) --#define NETCONN_IS_OUTIDLE(sock) rte_ring_free_count((sock)->send_ring) -+#define NETCONN_IS_DATAIN(sock) ((gazelle_ring_readable_count((sock)->recv_ring) || (sock)->recv_lastdata)) -+#define NETCONN_IS_DATAOUT(sock) gazelle_ring_readover_count((sock)->send_ring) -+#define NETCONN_IS_OUTIDLE(sock) gazelle_ring_readable_count((sock)->send_ring) - - void create_shadow_fd(struct rpc_msg *msg); --void listen_list_add_node(int32_t head_fd, int32_t add_fd); - void gazelle_init_sock(int32_t fd); - int32_t gazelle_socket(int domain, int type, int protocol); - void gazelle_clean_sock(int32_t fd); -@@ -37,7 +35,6 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num); - void send_stack_list(struct protocol_stack *stack, uint32_t send_max); - void add_recv_list(int32_t fd); - void stack_sendlist_count(struct rpc_msg *msg); --void stack_eventlist_count(struct rpc_msg *msg); - void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index bc4e4bd..8a6aa9d 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -14,48 +14,52 @@ - #define __GAZELLE_PROTOCOL_STACK_H__ - - #include --#include - #include - #include -+#include - #include "dpdk_common.h" - #include "lstack_thread_rpc.h" - #include "gazelle_dfx_msg.h" - #include "lstack_lockless_queue.h" - -+#define SOCK_RECV_RING_SIZE (128) -+#define SOCK_RECV_FREE_THRES (32) -+#define SOCK_SEND_RING_SIZE (32) -+#define SOCK_SEND_REPLENISH_THRES (16) -+#define WAKEUP_MAX_NUM (32) -+ - struct protocol_stack { - uint32_t tid; - uint16_t queue_id; - uint16_t port_id; - uint16_t socket_id; - uint16_t cpu_id; -- volatile uint16_t conn_num; - cpu_set_t idle_cpuset; /* idle cpu in numa of stack, app thread bind to it */ -+ int32_t epollfd; /* kernel event thread epoll fd */ - -- lockless_queue rpc_queue; - struct rte_mempool *rx_pktmbuf_pool; - struct rte_mempool *tx_pktmbuf_pool; - struct rte_ring *rx_ring; - struct rte_ring *tx_ring; - struct rte_ring *reg_ring; - struct rte_ring *wakeup_ring; -- - struct reg_ring_msg *reg_buf; - -+ volatile uint16_t conn_num __rte_cache_aligned; -+ lockless_queue rpc_queue __rte_cache_aligned; -+ char pad __rte_cache_aligned; -+ - struct netif netif; -+ struct eth_dev_ops *dev_ops; - uint32_t rx_ring_used; - uint32_t tx_ring_used; -- struct eth_dev_ops *dev_ops; - - struct list_node recv_list; -- struct list_node listen_list; - struct list_node send_list; -- struct list_node event_list; -- pthread_spinlock_t event_lock; -- int32_t epollfd; /* kernel event thread epoll fd */ - -- struct gazelle_stat_pkts stats; -- struct gazelle_stack_latency latency; - struct stats_ *lwip_stats; -+ struct gazelle_stack_latency latency; -+ struct gazelle_stack_stat stats __rte_cache_aligned; - }; - - struct eth_params; -@@ -74,12 +78,14 @@ struct protocol_stack_group { - /* dfx stats */ - bool latency_start; - uint64_t call_alloc_fail; -+ pthread_spinlock_t wakeup_list_lock; -+ struct wakeup_poll *wakeup_list __rte_cache_aligned; - }; - - long get_stack_tid(void); - struct protocol_stack *get_protocol_stack(void); - struct protocol_stack *get_protocol_stack_by_fd(int32_t fd); --struct protocol_stack *get_minconn_protocol_stack(void); -+struct protocol_stack *get_bind_protocol_stack(void); - struct protocol_stack_group *get_protocol_stack_group(void); - - int32_t init_protocol_stack(void); -@@ -96,6 +102,7 @@ int32_t stack_broadcast_close(int32_t fd); - - /* listen sync to all protocol stack thread, so that any protocol stack thread can build connect */ - int32_t stack_broadcast_listen(int32_t fd, int backlog); -+int32_t stack_single_listen(int32_t fd, int32_t backlog); - - /* ergodic the protocol stack thread to find the connection, because all threads are listening */ - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen); -diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h -index 2c3bf8f..e152fe6 100644 ---- a/src/lstack/include/lstack_stack_stat.h -+++ b/src/lstack/include/lstack_stack_stat.h -@@ -24,4 +24,7 @@ void stack_stat_init(void); - int32_t handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode); - uint64_t get_current_time(void); - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info); -+void register_wakeup(struct wakeup_poll *wakeup); -+void unregister_wakeup(struct wakeup_poll *wakeup); -+ - #endif /* GAZELLE_STACK_STAT_H */ -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 61bcd38..35e6b1e 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -37,12 +37,13 @@ union rpc_msg_arg { - socklen_t socklen; - size_t size; - }; -+struct rpc_msg_pool; - struct rpc_msg { - pthread_spinlock_t lock; /* msg handler unlock notice sender msg process done */ - int32_t self_release; /* 0:msg handler release msg 1:msg sender release msg */ - int64_t result; /* func return val */ - lockless_queue_node queue_node; -- struct rte_mempool *pool; -+ struct rpc_msg_pool *pool; - - rpc_msg_func func; /* msg handle func hook */ - union rpc_msg_arg args[RPM_MSG_ARG_SIZE]; /* resolve by type */ -@@ -50,11 +51,9 @@ struct rpc_msg { - - struct protocol_stack; - void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num); --void rpc_call_addevent(struct protocol_stack *stack, void *sock); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack); --int32_t rpc_call_eventlistcnt(struct protocol_stack *stack); - int32_t rpc_call_sendlistcnt(struct protocol_stack *stack); - int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn); - int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn); -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index a83f41f..e9f9b91 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -20,16 +20,27 @@ extern "C" { - #include - #include - #include -+#include -+#include - - #include "lstack_protocol_stack.h" - -+enum wakeup_type { -+ WAKEUP_EPOLL = 0, -+ WAKEUP_POLL, -+}; - struct wakeup_poll { -+ /* stack thread read frequently */ -+ sem_t event_sem __rte_cache_aligned; -+ enum wakeup_type type __rte_cache_aligned; -+ volatile bool have_kernel_event __rte_cache_aligned; -+ struct gazelle_wakeup_stat stat __rte_cache_aligned; -+ char pad __rte_cache_aligned; -+ - bool init; - struct protocol_stack *bind_stack; -- sem_t event_sem; -- -- int32_t epollfd; -- bool have_kernel_fd; -+ int32_t epollfd; /* epoll kernel fd, ctl add into gazelle_kernel_event thread */ -+ struct wakeup_poll *next; - - /* poll */ - struct pollfd *last_fds; -@@ -40,7 +51,8 @@ struct wakeup_poll { - /* epoll */ - int32_t stack_fd_cnt[PROTOCOL_STACK_MAX]; - struct protocol_stack *max_stack; -- struct list_node event_list; /* epoll temp use */ -+ struct list_node event_list; -+ pthread_spinlock_t event_list_lock; - }; - - int32_t lstack_epoll_create(int32_t size); -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index 696dfb9..fdca602 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -16,6 +16,7 @@ kni_switch=0 - low_power_mode=0 - - num_cpus="2" -+num_wakeup="3" - - host_addr="192.168.1.10" - mask_addr="255.255.255.0" -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 382f3bc..7938520 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -39,10 +39,11 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - struct pbuf_custom *pc = NULL; - struct protocol_stack *stack = get_protocol_stack(); - struct rte_mbuf *m = mbuf; -- uint16_t len; -+ uint16_t len, pkt_len; - -+ pkt_len = (uint16_t)rte_pktmbuf_pkt_len(m); - while (m != NULL) { -- len = (uint16_t)rte_pktmbuf_pkt_len(m); -+ len = (uint16_t)rte_pktmbuf_data_len(m); - payload = rte_pktmbuf_mtod(m, void *); - pc = mbuf_to_pbuf(m); - pc->custom_free_function = gazelle_free_pbuf; -@@ -51,6 +52,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - stack->stats.rx_allocmbuf_fail++; - break; - } -+ next->tot_len = pkt_len; - #if CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW - next->ol_flags = m->ol_flags; - #endif -@@ -71,7 +73,6 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - if (ret != ERR_OK) { - LSTACK_LOG(ERR, LSTACK, "eth_dev_recv: failed to handle rx pbuf ret=%d\n", ret); - stack->stats.rx_drop++; -- pbuf_free(head); - } - } - } -@@ -181,7 +182,7 @@ int32_t ethdev_init(struct protocol_stack *stack) - - if (use_ltran()) { - stack->rx_ring_used = 0; -- int32_t ret = fill_mbuf_to_ring(stack->rx_pktmbuf_pool, stack->rx_ring, VDEV_RX_QUEUE_SZ - 1); -+ int32_t ret = fill_mbuf_to_ring(stack->rx_pktmbuf_pool, stack->rx_ring, RING_SIZE(VDEV_RX_QUEUE_SZ)); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "fill mbuf to rx_ring failed ret=%d\n", ret); - return ret; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 5a4e86a..287ac8f 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -42,14 +42,14 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk - uint32_t nr_pkts; - struct rte_mbuf *free_buf[DPDK_PKT_BURST_SIZE]; - -- rcvd_pkts = rte_ring_en_dequeue_burst(stack->rx_ring, (void **)pkts, max_mbuf); -+ rcvd_pkts = gazelle_ring_sc_dequeue(stack->rx_ring, (void **)pkts, max_mbuf); - - stack->rx_ring_used += rcvd_pkts; - if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) { -- uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, DPDK_PKT_BURST_SIZE); -+ uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, RING_SIZE(DPDK_PKT_BURST_SIZE)); - int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); - if (likely(ret == 0)) { -- nr_pkts = rte_ring_en_enqueue_bulk(stack->rx_ring, (void **)free_buf, free_cnt); -+ nr_pkts = gazelle_ring_sp_enqueue(stack->rx_ring, (void **)free_buf, free_cnt); - stack->rx_ring_used -= nr_pkts; - } else { - stack->stats.rx_allocmbuf_fail++; -@@ -72,14 +72,14 @@ static uint32_t ltran_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pk - - do { - if (unlikely(stack->tx_ring_used >= INUSE_TX_PKTS_WATERMARK)) { -- uint32_t free_pkts = rte_ring_en_dequeue_burst(stack->tx_ring, (void **)free_buf, stack->tx_ring_used); -+ uint32_t free_pkts = gazelle_ring_sc_dequeue(stack->tx_ring, (void **)free_buf, stack->tx_ring_used); - for (uint32_t i = 0; i < free_pkts; i++) { - rte_pktmbuf_free(free_buf[i]); - } - stack->tx_ring_used -= free_pkts; - } - -- sent_pkts += rte_ring_en_enqueue_bulk(stack->tx_ring, (void **)(&pkts[sent_pkts]), nr_pkts - sent_pkts); -+ sent_pkts += gazelle_ring_sp_enqueue(stack->tx_ring, (void **)(&pkts[sent_pkts]), nr_pkts - sent_pkts); - } while ((sent_pkts < nr_pkts) && (ENQUEUE_RING_RETRY_TIMEOUT > sys_now() - tbegin) && get_register_state()); - - stack->tx_ring_used += sent_pkts; -@@ -128,7 +128,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - } - - do { -- (void)rte_ring_en_dequeue_burst(stack->reg_ring, free_buf, VDEV_REG_QUEUE_SZ); -+ (void)gazelle_ring_sc_dequeue(stack->reg_ring, free_buf, VDEV_REG_QUEUE_SZ); - - if (get_reg_ring_free_count(stack->reg_ring) == 0) { - continue; -@@ -144,7 +144,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - } - - free_buf[0] = tmp_buf; -- sent_pkts = rte_ring_en_enqueue_bulk(stack->reg_ring, free_buf, 1); -+ sent_pkts = gazelle_ring_sp_enqueue(stack->reg_ring, free_buf, 1); - } while ((sent_pkts < 1) && (ENQUEUE_RING_RETRY_TIMEOUT > sys_now() - tbegin) && get_register_state()); - - if (sent_pkts == 1) { -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 8d71966..7db1adc 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -546,32 +546,28 @@ static void gazelle_print_lstack_stat_brief(struct gazelle_stat_lstack_total *st - static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - { - printf("\n------ stack tid: %6u ------\n", lstack_stat->tid); -- printf("rx_pkts: %-20"PRIu64" ", lstack_stat->data.pkts.rx); -- printf("rx_drop: %-20"PRIu64" ", lstack_stat->data.pkts.rx_drop); -- printf("rx_allocmbuf_fail: %-10"PRIu64"\n", lstack_stat->data.pkts.rx_allocmbuf_fail); -- printf("tx_pkts: %-20"PRIu64" ", lstack_stat->data.pkts.tx); -- printf("tx_drop: %-20"PRIu64" ", lstack_stat->data.pkts.tx_drop); -- printf("tx_allocmbuf_fail: %-10"PRIu64"\n", lstack_stat->data.pkts.tx_allocmbuf_fail); -- printf("app_read: %-19"PRIu64" ", lstack_stat->data.pkts.app_read_cnt); -- printf("read_lwip: %-18"PRIu64" ", lstack_stat->data.pkts.read_lwip_cnt); -- printf("read_lwip_drop: %-13"PRIu64" \n", lstack_stat->data.pkts.read_lwip_drop); -- printf("app_write: %-18"PRIu64" ", lstack_stat->data.pkts.app_write_cnt); -- printf("write_lwip: %-17"PRIu64" ", lstack_stat->data.pkts.write_lwip_cnt); -- printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.app_write_idlefail); -- printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop); -- printf("write_lwip_drop: %-12"PRIu64" ", lstack_stat->data.pkts.write_lwip_drop); -- printf("app_write_idlebuf: %-10"PRIu16" \n", lstack_stat->data.pkts.send_idle_ring_cnt); -- printf("event_list: %-17"PRIu64" ", lstack_stat->data.pkts.event_list); -- printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list); -+ printf("rx_pkts: %-20"PRIu64" ", lstack_stat->data.pkts.stack_stat.rx); -+ printf("rx_drop: %-20"PRIu64" ", lstack_stat->data.pkts.stack_stat.rx_drop); -+ printf("rx_allocmbuf_fail: %-10"PRIu64"\n", lstack_stat->data.pkts.stack_stat.rx_allocmbuf_fail); -+ printf("tx_pkts: %-20"PRIu64" ", lstack_stat->data.pkts.stack_stat.tx); -+ printf("tx_drop: %-20"PRIu64" ", lstack_stat->data.pkts.stack_stat.tx_drop); -+ printf("tx_allocmbuf_fail: %-10"PRIu64"\n", lstack_stat->data.pkts.stack_stat.tx_allocmbuf_fail); -+ printf("app_read: %-19"PRIu64" ", lstack_stat->data.pkts.wakeup_stat.app_read_cnt); -+ printf("read_lwip: %-18"PRIu64" ", lstack_stat->data.pkts.stack_stat.read_lwip_cnt); -+ printf("read_lwip_drop: %-13"PRIu64" \n", lstack_stat->data.pkts.stack_stat.read_lwip_drop); -+ printf("app_write: %-18"PRIu64" ", lstack_stat->data.pkts.wakeup_stat.app_write_cnt); -+ printf("write_lwip: %-17"PRIu64" ", lstack_stat->data.pkts.stack_stat.write_lwip_cnt); -+ printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.app_write_idlefail); -+ printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list_cnt); -+ printf("send_list: %-18"PRIu64" ", lstack_stat->data.pkts.send_list_cnt); - printf("conn_num: %-19"PRIu16" \n", lstack_stat->data.pkts.conn_num); -- printf("wakeup_events: %-14"PRIu64" ", lstack_stat->data.pkts.wakeup_events); -- printf("app_events: %-17"PRIu64" ", lstack_stat->data.pkts.app_events); -- printf("read_null: %-18"PRIu64" \n", lstack_stat->data.pkts.read_null); -+ printf("wakeup_events: %-14"PRIu64" ", lstack_stat->data.pkts.stack_stat.wakeup_events); -+ printf("app_events: %-17"PRIu64" ", lstack_stat->data.pkts.wakeup_stat.app_events); -+ printf("read_null: %-18"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.read_null); - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); -- printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null); -- printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc); -- printf("send_list: %-18"PRIu64" \n", lstack_stat->data.pkts.send_list); -+ printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.stack_stat.call_null); -+ printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.stack_stat.send_self_rpc); - } - - static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat, -@@ -873,8 +869,8 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - printf("Active Internet connections (servers and established)\n"); - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); -- printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt Local Address " -- " Foreign Address State\n"); -+ printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt fd Local Address " -+ " Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { -@@ -883,13 +879,13 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%-7d%s:%hu\t %s:%hu\t %s\n", i, conn_info->recv_cnt, - conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt, -- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-50u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-57u%s:%hu\t 0.0.0.0:*\t\t LISTEN\n", i, conn_info->recv_cnt, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index b264ad3..776692d 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -92,7 +92,7 @@ static __rte_always_inline void backup_bufs_enque_rx_ring(struct gazelle_stack * - struct rte_mbuf *free_buf[RING_MAX_SIZE]; - - flush_cnt = (stack->backup_pkt_cnt < RING_MAX_SIZE) ? stack->backup_pkt_cnt : RING_MAX_SIZE; -- free_cnt = rte_ring_cn_dequeue_burst(stack->rx_ring, (void **)free_buf, flush_cnt); -+ free_cnt = gazelle_ring_read(stack->rx_ring, (void **)free_buf, flush_cnt); - - for (uint32_t j = 0; j < free_cnt; j++) { - index = (stack->backup_start + j) % backup_size; -@@ -102,7 +102,7 @@ static __rte_always_inline void backup_bufs_enque_rx_ring(struct gazelle_stack * - stack->stack_stats.rx += free_cnt; - stack->backup_pkt_cnt -= free_cnt; - stack->backup_start = (stack->backup_start + free_cnt) % backup_size; -- rte_ring_cn_enqueue(stack->rx_ring); -+ gazelle_ring_read_over(stack->rx_ring); - } - - static __rte_always_inline void pktbufs_move_to_backup_bufs(struct gazelle_stack *stack, struct rte_mbuf **mbuf, -@@ -135,7 +135,7 @@ static __rte_always_inline uint32_t pkt_bufs_enque_rx_ring(struct gazelle_stack - struct rte_mbuf **cl_buffer = stack->pkt_buf; - struct rte_mbuf *free_buf[GAZELLE_PACKET_READ_SIZE]; - -- free_cnt = rte_ring_cn_dequeue_burst(stack->rx_ring, (void **)free_buf, stack->pkt_cnt); -+ free_cnt = gazelle_ring_read(stack->rx_ring, (void **)free_buf, stack->pkt_cnt); - stack->stack_stats.rx += free_cnt; - - /* this prefetch and copy code, only 50~60 instruction, but never spend less than 70 cycle. -@@ -187,7 +187,7 @@ static __rte_always_inline uint32_t pkt_bufs_enque_rx_ring(struct gazelle_stack - } - - if (likely(free_cnt != 0)) { -- rte_ring_cn_enqueue(stack->rx_ring); -+ gazelle_ring_read_over(stack->rx_ring); - } - - return free_cnt; -@@ -520,14 +520,14 @@ static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stac - return; - } - -- uint32_t num = rte_ring_cn_dequeue_burst(stack->reg_ring, pkts, PACKET_READ_SIZE); -+ uint32_t num = gazelle_ring_read(stack->reg_ring, pkts, PACKET_READ_SIZE); - - for (uint32_t i = 0; i < num; i++) { - tcp_hash_table_modify(stack, pkts[i]); - pkts[i] = NULL; - } - -- rte_ring_cn_enqueue(stack->reg_ring); -+ gazelle_ring_read_over(stack->reg_ring); - if (pthread_mutex_unlock(&sock_htable->mlock) != 0) { - LTRAN_WARN("write tcp_htable: unlock failed, errno %d\n", errno); - } -@@ -675,7 +675,7 @@ static __rte_always_inline void downstream_forward_one(struct gazelle_stack *sta - uint32_t used_cnt; - - struct rte_mbuf *used_pkts[GAZELLE_PACKET_READ_SIZE]; -- used_cnt = rte_ring_cn_dequeue_burst(stack->tx_ring, (void **)used_pkts, GAZELLE_PACKET_READ_SIZE); -+ used_cnt = gazelle_ring_read(stack->tx_ring, (void **)used_pkts, GAZELLE_PACKET_READ_SIZE); - if (used_cnt == 0) { - return; - } -@@ -686,7 +686,7 @@ static __rte_always_inline void downstream_forward_one(struct gazelle_stack *sta - if (ret != 0) { - /* free pkts that not have be sent. */ - LTRAN_ERR("down alloc error, rx_pkts:%u ret=%d.\n", used_cnt, ret); -- rte_ring_cn_enqueue(stack->tx_ring); -+ gazelle_ring_read_over(stack->tx_ring); - stack->stack_stats.tx_drop += used_cnt; - rte_exit(EXIT_FAILURE, "down alloc error\n"); - } -@@ -696,7 +696,7 @@ static __rte_always_inline void downstream_forward_one(struct gazelle_stack *sta - tx_bytes += used_pkts[tx_pkts]->data_len; - stack->stack_stats.tx_bytes += used_pkts[tx_pkts]->data_len; - } -- rte_ring_cn_enqueue(stack->tx_ring); -+ gazelle_ring_read_over(stack->tx_ring); - - /* send packets anyway. */ - tx_pkts = 0; -diff --git a/src/ltran/ltran_stat.c b/src/ltran/ltran_stat.c -index 7080424..c6805a6 100644 ---- a/src/ltran/ltran_stat.c -+++ b/src/ltran/ltran_stat.c -@@ -25,6 +25,7 @@ - #include "gazelle_dfx_msg.h" - #include "ltran_timer.h" - #include "ltran_ethdev.h" -+#include "dpdk_common.h" - #include "ltran_forward.h" - - static uint64_t g_start_time_stamp = 0; -@@ -32,25 +33,11 @@ static int32_t g_start_latency = GAZELLE_OFF; - volatile int32_t g_ltran_stop_flag = GAZELLE_FALSE; - static struct statistics g_statistics; - --static uint32_t get_rx_ring_count(const struct rte_ring *r) --{ -- return rte_ring_count(r); --} -- - uint64_t get_start_time_stamp(void) - { - return g_start_time_stamp; - } - --static uint32_t get_tx_ring_count(const struct rte_ring *r) --{ -- uint32_t prod_tail = r->prod.tail; -- uint32_t cons_head = r->cons.head; -- -- uint32_t count = (cons_head - prod_tail) & r->mask; -- return (count > r->capacity) ? r->capacity : count; --} -- - void set_start_latency_flag(int32_t flag) - { - struct gazelle_instance_mgr *instance_mgr = get_instance_mgr(); -@@ -203,8 +190,8 @@ static int32_t gazelle_filling_lstack_stat_total(struct gazelle_stat_lstack_tota - stat->latency_pkts = stack->stack_stats.latency_pkts; - stat->latency_total = stack->stack_stats.latency_total; - stat->reg_ring_cnt = rte_ring_cn_count(stack->reg_ring); -- stat->rx_ring_cnt = get_rx_ring_count(stack->rx_ring); -- stat->tx_ring_cnt = get_tx_ring_count(stack->tx_ring); -+ stat->rx_ring_cnt = gazelle_ring_readover_count(stack->rx_ring); -+ stat->tx_ring_cnt = gazelle_ring_readable_count(stack->tx_ring); - - return GAZELLE_OK; - } --- -2.23.0 - diff --git a/0056-ltran-support-checksum.patch b/0056-ltran-support-checksum.patch deleted file mode 100644 index 6a974fd..0000000 --- a/0056-ltran-support-checksum.patch +++ /dev/null @@ -1,351 +0,0 @@ -From 5c44c739f651e295141c096bf676cc3bc7ce7460 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 7 Jul 2022 22:21:34 +0800 -Subject: [PATCH 01/19] ltran support checksum - ---- - src/common/dpdk_common.c | 44 ++++++++++++++ - src/common/dpdk_common.h | 4 ++ - src/common/gazelle_reg_msg.h | 2 + - src/lstack/core/lstack_control_plane.c | 4 ++ - src/lstack/core/lstack_dpdk.c | 67 +++------------------- - src/lstack/include/lstack_protocol_stack.h | 2 + - src/ltran/ltran_ethdev.c | 48 +++++++++++----- - src/ltran/ltran_instance.c | 3 + - src/ltran/ltran_param.h | 2 + - 9 files changed, 102 insertions(+), 74 deletions(-) - -diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c -index 63dcfc1..939d135 100644 ---- a/src/common/dpdk_common.c -+++ b/src/common/dpdk_common.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - - #include "dpdk_common.h" -@@ -87,6 +88,49 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up) - return ret; - } - -+void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info) -+{ -+ uint64_t rx_ol = 0; -+ uint64_t tx_ol = 0; -+ uint64_t rx_ol_capa = dev_info->rx_offload_capa; -+ uint64_t tx_ol_capa = dev_info->tx_offload_capa; -+ -+ // rx ip -+ if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { -+ rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM; -+ COMMON_INFO("DEV_RX_OFFLOAD_IPV4_CKSUM\n"); -+ } -+ -+ if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { -+ rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM; -+ COMMON_INFO("DEV_RX_OFFLOAD_TCP_CKSUM\n"); -+ } -+ -+ // tx ip -+ if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) { -+ tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM; -+ COMMON_INFO("DEV_TX_OFFLOAD_IPV4_CKSUM\n"); -+ } -+ -+ // tx tcp -+ if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) { -+ tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM; -+ COMMON_INFO("DEV_TX_OFFLOAD_TCP_CKSUM\n"); -+ } -+ -+ if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) { -+ rx_ol = 0; -+ } -+ if (!(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) || !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) { -+ tx_ol = 0; -+ } -+ -+ conf->rxmode.offloads = rx_ol; -+ conf->txmode.offloads = tx_ol; -+ -+ COMMON_INFO("set checksum offloads\n"); -+} -+ - int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - { - int32_t ret; -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 4a7bd37..6a6a030 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -67,6 +67,10 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool); - int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count); - void kni_process_rx(uint16_t port); - -+struct rte_eth_conf; -+struct rte_eth_dev_info; -+void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info); -+ - /* - gazelle custom rte ring interface - lightweight ring reduce atomic and smp_mb. -diff --git a/src/common/gazelle_reg_msg.h b/src/common/gazelle_reg_msg.h -index ff846fd..f5842e7 100644 ---- a/src/common/gazelle_reg_msg.h -+++ b/src/common/gazelle_reg_msg.h -@@ -94,6 +94,8 @@ struct reg_response_msg { - struct { - uintptr_t base_virtaddr; - uint64_t socket_size; -+ uint64_t rx_offload; -+ uint64_t tx_offload; - } msg; - }; - -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index ef38fb5..c86dab1 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -297,6 +297,10 @@ static int32_t client_reg_proc_memory(bool is_reconnect) - return -1; - } - -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ stack_group->rx_offload = recv_msg.msg.rx_offload; -+ stack_group->tx_offload = recv_msg.msg.tx_offload; -+ - if (!is_reconnect) { - ret = proc_memory_init(&recv_msg); - if (ret != 0) { -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 6675d7b..13df6a3 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -313,68 +313,12 @@ static struct eth_params *alloc_eth_params(uint16_t port_id, uint16_t nb_queues) - - uint64_t get_eth_params_rx_ol(void) - { -- return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.rxmode.offloads; -+ return get_protocol_stack_group()->rx_offload; - } - - uint64_t get_eth_params_tx_ol(void) - { -- return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.txmode.offloads; --} -- --static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info) --{ --#if CHECKSUM_OFFLOAD_ALL -- uint64_t rx_ol = 0; -- uint64_t tx_ol = 0; -- -- uint64_t rx_ol_capa = dev_info->rx_offload_capa; -- uint64_t tx_ol_capa = dev_info->tx_offload_capa; -- -- // rx ip --#if CHECKSUM_CHECK_IP_HW -- if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { -- rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM; -- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n"); -- } --#endif -- -- // rx tcp --#if CHECKSUM_CHECK_TCP_HW -- if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { -- rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM; -- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_TCP_CKSUM\n"); -- } --#endif -- -- // tx ip --#if CHECKSUM_GEN_IP_HW -- if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) { -- tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM; -- LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_IPV4_CKSUM\n"); -- } --#endif -- -- // tx tcp --#if CHECKSUM_GEN_TCP_HW -- if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) { -- tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM; -- LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_TCP_CKSUM\n"); -- } --#endif -- if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) { -- rx_ol = 0; -- } -- if (!(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) || !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) { -- tx_ol = 0; -- } -- -- conf->rxmode.offloads = rx_ol; -- conf->txmode.offloads = tx_ol; -- -- LSTACK_LOG(INFO, LSTACK, "set checksum offloads\n"); --#endif /* CHECKSUM_OFFLOAD_ALL */ -- -- return 0; -+ return get_protocol_stack_group()->tx_offload; - } - - static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info) -@@ -471,8 +415,11 @@ int32_t dpdk_ethdev_init(void) - } - eth_params_checksum(ð_params->conf, &dev_info); - int32_t rss_enable = eth_params_rss(ð_params->conf, &dev_info); -- get_protocol_stack_group()->eth_params = eth_params; -- get_protocol_stack_group()->port_id = eth_params->port_id; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ stack_group->eth_params = eth_params; -+ stack_group->port_id = eth_params->port_id; -+ stack_group->rx_offload = eth_params->conf.rxmode.offloads; -+ stack_group->tx_offload = eth_params->conf.txmode.offloads; - - ret = rte_eth_dev_configure(port_id, nb_queues, nb_queues, ð_params->conf); - if (ret < 0) { -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 8a6aa9d..e5eedd7 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -70,6 +70,8 @@ struct protocol_stack_group { - sem_t thread_phase1; - sem_t ethdev_init; - sem_t all_init; -+ uint64_t rx_offload; -+ uint64_t tx_offload; - struct rte_mempool *kni_pktmbuf_pool; - struct eth_params *eth_params; - struct protocol_stack *stacks[PROTOCOL_STACK_MAX]; -diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c -index 7d42fcd..03c692d 100644 ---- a/src/ltran/ltran_ethdev.c -+++ b/src/ltran/ltran_ethdev.c -@@ -237,19 +237,31 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo - uint16_t rx_queue_num = (uint16_t)get_ltran_config()->bond.rx_queue_num; - uint16_t tx_queue_num = (uint16_t)get_ltran_config()->bond.tx_queue_num; - struct rte_eth_dev_info dev_info; -- struct rte_eth_conf port_conf = {0}; - uint16_t queue_id; - -+ rte_eth_dev_stop(port_num); -+ -+ if (rte_eth_dev_info_get(port_num, &dev_info) != 0) { -+ LTRAN_ERR("Fail rte_eth_dev_info_get\n"); -+ return GAZELLE_ERR; -+ } -+ -+ struct rte_eth_conf port_conf = {0}; -+ port_conf.txmode.mq_mode = ETH_MQ_TX_NONE; -+ port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG; -+ eth_params_checksum(&port_conf, &dev_info); - port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE; - -- rte_eth_dev_stop(port_num); -- int32_t ret = rte_eth_dev_configure(port_num, rx_queue_num, tx_queue_num, &port_conf); -- if (ret != 0) { -- LTRAN_ERR("rte_eth_dev_configure failed in slave port initialize. errno: %d, port: %d\n", ret, port_num); -+ struct ltran_config *ltran_config = get_ltran_config(); -+ ltran_config->dpdk.rx_offload = port_conf.rxmode.offloads; -+ ltran_config->dpdk.tx_offload = port_conf.txmode.offloads; -+ -+ if (rte_eth_dev_configure(port_num, rx_queue_num, tx_queue_num, &port_conf)) { -+ LTRAN_ERR("rte_eth_dev_configure failed in slave port initialize. errno: %d, port: %hu\n", errno, port_num); - return GAZELLE_ERR; - } - -- ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, &tx_ring_size); -+ int32_t ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, &tx_ring_size); - if (ret != 0) { - LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed in slave port initialize. errno: %d, port: %d \n", ret, - port_num); -@@ -266,7 +278,6 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo - } - } - -- rte_eth_dev_info_get(port_num, &dev_info); - for (queue_id = 0; queue_id < tx_queue_num; queue_id++) { - ret = rte_eth_tx_queue_setup(port_num, queue_id, tx_ring_size, (uint32_t)rte_eth_dev_socket_id(port_num), - &dev_info.default_txconf); -@@ -345,10 +356,25 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id - uint16_t rx_queue_num = (uint16_t)ltran_config->bond.rx_queue_num; - uint16_t tx_queue_num = (uint16_t)ltran_config->bond.tx_queue_num; - -+ int32_t ret = ltran_eth_bond_slave(port_info, port_num, bond_port_id); -+ if (ret < 0) { -+ LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %d, errno: %d \n", port_num, ret); -+ return GAZELLE_ERR; -+ } -+ -+ struct rte_eth_dev_info dev_info; -+ if (rte_eth_dev_info_get(bond_port_id, &dev_info) != 0) { -+ LTRAN_ERR("faile rte_eth_dev_info_get\n"); -+ return GAZELLE_ERR; -+ } -+ - struct rte_eth_conf port_conf = {0}; - port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE; -+ port_conf.txmode.mq_mode = ETH_MQ_TX_NONE; -+ port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG; -+ eth_params_checksum(&port_conf, &dev_info); - -- int32_t ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf); -+ ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf); - if (ret != 0) { - LTRAN_ERR("rte_eth_dev_configure failed with bond port num: %d, errno: %d \n", port_num, ret); - return GAZELLE_ERR; -@@ -362,12 +388,6 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id - LTRAN_DEBUG("Bond port adujst rx_ring_size: %hu, tx_ring_size: %hu. bond port num: %hu \n", - rx_ring_size, tx_ring_size, port_num); - -- ret = ltran_eth_bond_slave(port_info, port_num, bond_port_id); -- if (ret < 0) { -- LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %d, errno: %d \n", port_num, ret); -- return GAZELLE_ERR; -- } -- - ret = ltran_eth_rx_queue_setup(bond_port_id, pktmbuf_rxpool, rx_queue_num, rx_ring_size); - if (ret < 0) { - LTRAN_ERR("rte_eth_rx_queue_setup failed in bond port initialize. errno: %d, port: %d \n", ret, port_num); -diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c -index f8bb43f..15f4bb4 100644 ---- a/src/ltran/ltran_instance.c -+++ b/src/ltran/ltran_instance.c -@@ -450,6 +450,7 @@ int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg) - struct reg_response_msg send_msg; - struct client_proc_conf *conf = &recv_msg->msg.proc; - struct gazelle_instance *instance = NULL; -+ struct ltran_config *ltran_config = get_ltran_config(); - - (void)memset_s(&send_msg, sizeof(send_msg), 0, sizeof(send_msg)); - -@@ -479,6 +480,8 @@ int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg) - - send_msg.msg.socket_size = instance->socket_size; - send_msg.msg.base_virtaddr = instance->base_virtaddr; -+ send_msg.msg.rx_offload = ltran_config->dpdk.rx_offload; -+ send_msg.msg.tx_offload = ltran_config->dpdk.tx_offload; - send_msg.type = RSP_OK; - ret = write_specied_len(fd, (char *)&send_msg, sizeof(send_msg)); - if (ret != 0) { -diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h -index d3af24e..442694c 100644 ---- a/src/ltran/ltran_param.h -+++ b/src/ltran/ltran_param.h -@@ -25,6 +25,8 @@ struct ltran_config { - char **dpdk_argv; - int32_t dpdk_argc; - int32_t kni_switch; -+ uint64_t rx_offload; -+ uint64_t tx_offload; - } dpdk; - - struct { --- -2.23.0 - diff --git a/0057-add-examples-readme-compile-components-main-file-and.patch b/0057-add-examples-readme-compile-components-main-file-and.patch deleted file mode 100644 index 2602138..0000000 --- a/0057-add-examples-readme-compile-components-main-file-and.patch +++ /dev/null @@ -1,287 +0,0 @@ -From f02d373216f17fa6c9ca500e49d7f05f876d22a2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= -Date: Wed, 29 Jun 2022 14:33:23 +0800 -Subject: [PATCH 02/19] add examples readme, compile components, main file and - utilities header - ---- - examples/CMakeLists.txt | 34 ++++++++++++++++++++ - examples/README.md | 44 +++++++++++++++++++++++++ - examples/inc/parameter.h | 65 +++++++++++++++++++++++++++++++++++++ - examples/inc/utilities.h | 69 ++++++++++++++++++++++++++++++++++++++++ - examples/main.c | 23 ++++++++++++++ - 5 files changed, 235 insertions(+) - create mode 100644 examples/CMakeLists.txt - create mode 100644 examples/README.md - create mode 100644 examples/inc/parameter.h - create mode 100644 examples/inc/utilities.h - create mode 100644 examples/main.c - -diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt -new file mode 100644 -index 0000000..0fd09ab ---- /dev/null -+++ b/examples/CMakeLists.txt -@@ -0,0 +1,34 @@ -+# Copyright (c) 2022-2023. yyangoO. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+ -+cmake_minimum_required(VERSION 3.12.1) -+ -+set(PROJECT_NAME example) -+ -+project(${PROJECT_NAME}) -+ -+message(STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR}) -+message(STATUS "PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR}) -+ -+set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -pthread") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D EXAMPLE_COMPILE") -+ -+include_directories(${PROJECT_SOURCE_DIR}/inc) -+ -+set(HEADERS -+ inc/utilities.h -+ inc/parameter.h -+) -+set(SOURCES -+ main.c -+) -+ -+add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) -diff --git a/examples/README.md b/examples/README.md -new file mode 100644 -index 0000000..f5dc76f ---- /dev/null -+++ b/examples/README.md -@@ -0,0 +1,44 @@ -+# gazzle 示例程序 -+ -+* 支持 TCP 、 unix 非阻塞通讯。 -+* 支持多线程网络 IO 复用模型,线程之间相互独立。TCP 的 `listen` 、`epoll` 、`read` 、`write` 、`connect` 等接口都在同一线程内。`connect` 连接数可配。 -+* 支持多线程网络非对称模型,一个 listen 线程,若干个读写线程。listen 线程和读写线程使用 `poll` / `epoll` 监听事件。 -+* 支持 `recvmsg` 、`sendmsg` 、`recv` 、`send` 、`getpeername` 、`getsockopt` 、`epoll_ctl` 等 posix 接口。 -+* 网络通讯报文采用问答方式,丢包或者内容错误则报错并停止通讯。报文内容有变化,长度可配。 -+ -+## 网络模型 -+ -+* **单线程非阻塞**:采用同步非阻塞 IO 模型,在单线程中采用非阻塞的方式监听并发起 IO 请求,当内核中数据到达后读取数据、执行业务逻辑并发送。 -+* **多线程非阻塞IO复用**:基于 `epoll` 实现多线程非阻塞 IO 模型。每个线程之间互不干涉。通过 `epoll` 监控多个当前线程负责的 fd ,当任何一个数据状态准备就绪时,返回并执行读写操作和对应的业务逻辑。 -+* **多线程非阻塞非对称**:采用基于 `epoll` 的单线程多路 IO 复用监听连接事件,并采用多线程的方式完成后续读写监听业务。 server 在启动监听之前,开辟一定数量的线程,用线程池管理。主线程创建监听 `fd` 之后,采用多路 IO 复用机制 (`epoll`) 进行 IO 状态监控。当监听到客户端的连接请求时,建立连接并将相关 `fd` 分发给线程池的某个线程进行监听。线程池中的每个线程都采用多路 IO 复用机制 (`epoll`) ,用来监听主线程中建立成功并分发下来的 `socket` 。 -+ -+## 程序接口 -+ -+* `--as [server | client]`:作为服务端还是客户端。 -+ * `server`:作为服务端。 -+ * `client`:作为客户端。 -+* `--ip [xxx.xxx.xxx.xxx]`:IP地址。 -+* `--port [xxxx]`:端口。 -+* `--model [-mum | -mud]` :采用的网络模型类型。 -+ * `-mum (multi thread, unblock, multiplexing IO)`:多线程非阻塞IO复用。 -+ * `-mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。 -+* `--threadnum`:线程数设置。 -+* `--connectnum`:连接数设置。 -+* `--api [unix | posix]`:内部实现的接口类型。 -+ * `unix` :基于 unix 接口实现。 -+ * `posix` :基于 posix 接口实现。 -+* `--pktlen [xxxx]`:报文长度配置。 -+* `--verify [on | off]`:是否校验报文。 -+* `--ringpmd [on | off]`:是否基于 dpkg ring PMD 收发环回。 -+* `--help [--xxx]`:获得帮助信息。 -+ -+## 使用 -+ -+``` -+cd build -+mkdir examples -+cd examples -+cmake ../../examples -+make -+./examples --help -+``` -diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h -new file mode 100644 -index 0000000..7912862 ---- /dev/null -+++ b/examples/inc/parameter.h -@@ -0,0 +1,65 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#ifndef __PARAMETER_H__ -+#define __PARAMETER_H__ -+ -+ -+#include "utilities.h" -+ -+ -+/** -+ * @brief porgram parameter -+ * The porgram's parameters. -+ */ -+struct ProgramParams -+{ -+ char* as; ///< as server or client -+ char* ip; ///< IP address -+ uint32_t port; ///< port -+ char* model; ///< model type -+ uint32_t thread_num; ///< the number of threads -+ uint32_t connect_num; ///< the connection number -+ char* api; ///< the type of api -+ uint32_t pktlen; ///< the packet length -+ bool verify; ///< if we verify the message or not -+ bool ringpmd; ///< if we use ring PMD or not -+}; -+ -+ -+/** -+ * @brief initialize the parameters -+ * This function initializes the parameters of main function. -+ * @param params the parameters pointer -+ */ -+void program_params_init(struct ProgramParams *params); -+ -+/** -+ * @brief parse the parameters -+ * This function parses the parameters of main function. -+ * @param params the parameters pointer -+ * @param argc the count of arguments -+ * @param argv the value of arguments -+ * @return the result flag -+ */ -+int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[]); -+ -+/** -+ * @brief print the parameters -+ * This function prints the parameters of main function. -+ * @param params the parameters pointer -+ */ -+void program_params_print(struct ProgramParams *params); -+ -+ -+#endif // __PARAMETER_H__ -diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h -new file mode 100644 -index 0000000..d800531 ---- /dev/null -+++ b/examples/inc/utilities.h -@@ -0,0 +1,69 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#ifndef __UTILITIES_H__ -+#define __UTILITIES_H__ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+ -+#define PRINT_ERROR(str) do \ -+ { \ -+ printf("\n[error]: "); \ -+ printf(str); \ -+ printf("\n"); \ -+ } while(0) -+#define PRINT_WARNNING(str) do \ -+ { \ -+ printf("\n[warnning]: "); \ -+ printf(str); \ -+ printf("\n"); \ -+ } while(0) -+#define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) -+#define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true))) -+ -+#define PROGRAM_OK (0) ///< program ok flag -+#define PROGRAM_FINISH (1) ///< program finish flag -+#define PROGRAM_FAULT (-1) ///< program fault flag -+ -+#define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix -+#define UNIX_TCP_PORT_MAX (65535) ///< TCP minimum port number in unix -+#define THREAD_NUM_MIN (1) ///< minimum number of thead -+#define THREAD_NUM_MAX (1000) ///< maximum number of thead -+#define MESSAGE_PKTLEN_MIN (1) ///< minimum length of message (1 byte) -+#define MESSAGE_PKTLEN_MAX (10485760) ///< maximum length of message (10 Mb) -+ -+#define DEFAULT_PARAM_AS ("server") ///< default type -+#define DEFAULT_PARAM_IP ("127.0.0.1") ///< default IP -+#define DEFAULT_PARAM_PORT (5050) ///< default port -+#define DEFAULT_PARAM_MODEL ("mum") ///< default model type -+#define DEFAULT_PARAM_CONNECT_NUM (10) ///< default connection number -+#define DEFAULT_PARAM_THREAD_NUM (8) ///< default thread number -+#define DEFAULT_PARAM_API ("posix") ///< default API type -+#define DEFAULT_PARAM_PKTLEN (1024) ///< default packet length of message -+#define DEFAULT_PARAM_VERIFY (true) ///< default flag of message verifying -+#define DEFAULT_PARAM_RINGPMD (false) ///< default flag of ring PMD -+ -+ -+#endif // __UTILITIES_H__ -diff --git a/examples/main.c b/examples/main.c -new file mode 100644 -index 0000000..30d04e6 ---- /dev/null -+++ b/examples/main.c -@@ -0,0 +1,23 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "utilities.h" -+#include "parameter.h" -+ -+ -+int32_t main(int argc, char *argv[]) -+{ -+ int32_t ret = PROGRAM_OK; -+ -+ return ret; -+} --- -2.23.0 - diff --git a/0058-add-examples-parameter-parsing.patch b/0058-add-examples-parameter-parsing.patch deleted file mode 100644 index f9cb1be..0000000 --- a/0058-add-examples-parameter-parsing.patch +++ /dev/null @@ -1,550 +0,0 @@ -From 69be15c6a29d05c6b7f95e8fb778f79f51cf9240 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= -Date: Mon, 11 Jul 2022 20:10:25 +0800 -Subject: [PATCH 03/19] add examples parameter parsing - ---- - examples/CMakeLists.txt | 1 + - examples/README.md | 30 ++--- - examples/inc/parameter.h | 68 +++++++++- - examples/inc/utilities.h | 34 ++--- - examples/main.c | 11 ++ - examples/src/parameter.c | 267 +++++++++++++++++++++++++++++++++++++++ - 6 files changed, 372 insertions(+), 39 deletions(-) - create mode 100644 examples/src/parameter.c - -diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt -index 0fd09ab..2e62bd3 100644 ---- a/examples/CMakeLists.txt -+++ b/examples/CMakeLists.txt -@@ -29,6 +29,7 @@ set(HEADERS - ) - set(SOURCES - main.c -+ src/parameter.c - ) - - add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) -diff --git a/examples/README.md b/examples/README.md -index f5dc76f..6f82bb2 100644 ---- a/examples/README.md -+++ b/examples/README.md -@@ -14,23 +14,23 @@ - - ## 程序接口 - --* `--as [server | client]`:作为服务端还是客户端。 -+* `-a, --as [server | client]`:作为服务端还是客户端。 - * `server`:作为服务端。 - * `client`:作为客户端。 --* `--ip [xxx.xxx.xxx.xxx]`:IP地址。 --* `--port [xxxx]`:端口。 --* `--model [-mum | -mud]` :采用的网络模型类型。 -- * `-mum (multi thread, unblock, multiplexing IO)`:多线程非阻塞IO复用。 -- * `-mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。 --* `--threadnum`:线程数设置。 --* `--connectnum`:连接数设置。 --* `--api [unix | posix]`:内部实现的接口类型。 -- * `unix` :基于 unix 接口实现。 -- * `posix` :基于 posix 接口实现。 --* `--pktlen [xxxx]`:报文长度配置。 --* `--verify [on | off]`:是否校验报文。 --* `--ringpmd [on | off]`:是否基于 dpkg ring PMD 收发环回。 --* `--help [--xxx]`:获得帮助信息。 -+* `-i, --ip [xxx.xxx.xxx.xxx]`:IP地址。 -+* `-p, --port [xxxx]`:端口。 -+* `-m, --model [mum | mud]`:采用的网络模型类型。 -+ * `mum (multi thread, unblock, multiplexing IO)`:多线程非阻塞IO复用。 -+ * `mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。 -+* `-t, --threadnum`:线程数设置。 -+* `-c, --connectnum`:连接数设置。 -+* `-A, --api [unix | posix]`:内部实现的接口类型。 -+ * `unix`:基于 unix 接口实现。 -+ * `posix`:基于 posix 接口实现。 -+* `-P, --pktlen [xxxx]`:报文长度配置。 -+* `-v, --verify`:是否校验报文。 -+* `-r, --ringpmd`:是否基于dpdk ring PMD 收发环回。 -+* `-h, --help`:获得帮助信息。 - - ## 使用 - -diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h -index 7912862..fe0dce0 100644 ---- a/examples/inc/parameter.h -+++ b/examples/inc/parameter.h -@@ -11,13 +11,67 @@ - */ - - --#ifndef __PARAMETER_H__ --#define __PARAMETER_H__ -+#ifndef __EXAMPLES_PARAMETER_H__ -+#define __EXAMPLES_PARAMETER_H__ - - - #include "utilities.h" - - -+#define PARAM_DEFAULT_AS ("server") ///< default type -+#define PARAM_DEFAULT_IP ("127.0.0.1") ///< default IP -+#define PARAM_DEFAULT_PORT (5050) ///< default port -+#define PARAM_DEFAULT_MODEL ("mum") ///< default model type -+#define PARAM_DEFAULT_CONNECT_NUM (10) ///< default connection number -+#define PARAM_DEFAULT_THREAD_NUM (8) ///< default thread number -+#define PARAM_DEFAULT_API ("posix") ///< default API type -+#define PARAM_DEFAULT_PKTLEN (1024) ///< default packet length of message -+#define PARAM_DEFAULT_VERIFY (false) ///< default flag of message verifying -+#define PARAM_DEFAULT_RINGPMD (false) ///< default flag of ring PMD of dpdk -+ -+enum -+{ -+#define PARAM_NAME_AS ("as") ///< name of parameter type -+ PARAM_NUM_AS = 'a', -+#define PARAM_NAME_IP ("ip") ///< name of parameter IP -+ PARAM_NUM_IP = 'i', -+#define PARAM_NAME_PORT ("port") ///< name of parameter port -+ PARAM_NUM_PORT = 'p', -+#define PARAM_NAME_MODEL ("model") ///< name of parameter model type -+ PARAM_NUM_MODEL = 'm', -+#define PARAM_NAME_CONNECT_NUM ("connectnum") ///< name of parameter connection number -+ PARAM_NUM_CONNECT_NUM = 'c', -+#define PARAM_NAME_THREAD_NUM ("threadnum") ///< name of parameter thread number -+ PARAM_NUM_THREAD_NUM = 't', -+#define PARAM_NAME_API ("api") ///< name of parameter API type -+ PARAM_NUM_API = 'A', -+#define PARAM_NAME_PKTLEN ("pktlen") ///< name of parameter packet length of message -+ PARAM_NUM_PKTLEN = 'P', -+#define PARAM_NAME_VERIFY ("verify") ///< name of parameter flag of message verifying -+ PARAM_NUM_VERIFY = 'v', -+#define PARAM_NAME_RINGPMD ("ringpmd") ///< name of parameter flag of ring PMD of dpdk -+ PARAM_NUM_RINGPMD = 'r', -+#define PARAM_NAME_HELP ("help") ///< name of parameter help -+ PARAM_NUM_HELP = 'h', -+}; -+ -+#define NO_ARGUMENT 0 ///< options takes no arguments -+#define REQUIRED_ARGUMETN 1 ///< options requires arguments -+#define OPTIONAL_ARGUMETN 2 ///< options arguments are optional -+ -+ -+/** -+ * @brief program option description -+ * The program option description. -+ */ -+struct ProgramOption -+{ -+ const char *name; ///< name of program option -+ int32_t has_arg; ///< whether program option takes an argument, one of no, required, and optional -+ int32_t *flag; ///< if not `NULL`, set `*flag` to `val` when option found -+ int32_t val; ///< the number of this program option -+}; -+ - /** - * @brief porgram parameter - * The porgram's parameters. -@@ -44,6 +98,12 @@ struct ProgramParams - */ - void program_params_init(struct ProgramParams *params); - -+/** -+ * @brief print help information -+ * This function prints help informations. -+ */ -+void program_params_help(void); -+ - /** - * @brief parse the parameters - * This function parses the parameters of main function. -@@ -52,7 +112,7 @@ void program_params_init(struct ProgramParams *params); - * @param argv the value of arguments - * @return the result flag - */ --int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[]); -+int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[]); - - /** - * @brief print the parameters -@@ -62,4 +122,4 @@ int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[ - void program_params_print(struct ProgramParams *params); - - --#endif // __PARAMETER_H__ -+#endif // __EXAMPLES_PARAMETER_H__ -diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h -index d800531..bccd523 100644 ---- a/examples/inc/utilities.h -+++ b/examples/inc/utilities.h -@@ -11,8 +11,8 @@ - */ - - --#ifndef __UTILITIES_H__ --#define __UTILITIES_H__ -+#ifndef __EXAMPLES_UTILITIES_H__ -+#define __EXAMPLES_UTILITIES_H__ - - - #include -@@ -21,30 +21,35 @@ - #include - #include - #include -- - #include -+#include -+ - #include - - #include -+#include - -+#include -+#include - --#define PRINT_ERROR(str) do \ -+ -+#define PRINT_ERROR(format, ...) do \ - { \ - printf("\n[error]: "); \ -- printf(str); \ -+ printf(format, ##__VA_ARGS__); \ - printf("\n"); \ - } while(0) --#define PRINT_WARNNING(str) do \ -+#define PRINT_WARNNING(format, ...) do \ - { \ - printf("\n[warnning]: "); \ -- printf(str); \ -+ printf(format, ##__VA_ARGS__); \ - printf("\n"); \ - } while(0) - #define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) - #define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true))) - - #define PROGRAM_OK (0) ///< program ok flag --#define PROGRAM_FINISH (1) ///< program finish flag -+#define PROGRAM_ABORT (1) ///< program abort flag - #define PROGRAM_FAULT (-1) ///< program fault flag - - #define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix -@@ -54,16 +59,5 @@ - #define MESSAGE_PKTLEN_MIN (1) ///< minimum length of message (1 byte) - #define MESSAGE_PKTLEN_MAX (10485760) ///< maximum length of message (10 Mb) - --#define DEFAULT_PARAM_AS ("server") ///< default type --#define DEFAULT_PARAM_IP ("127.0.0.1") ///< default IP --#define DEFAULT_PARAM_PORT (5050) ///< default port --#define DEFAULT_PARAM_MODEL ("mum") ///< default model type --#define DEFAULT_PARAM_CONNECT_NUM (10) ///< default connection number --#define DEFAULT_PARAM_THREAD_NUM (8) ///< default thread number --#define DEFAULT_PARAM_API ("posix") ///< default API type --#define DEFAULT_PARAM_PKTLEN (1024) ///< default packet length of message --#define DEFAULT_PARAM_VERIFY (true) ///< default flag of message verifying --#define DEFAULT_PARAM_RINGPMD (false) ///< default flag of ring PMD -- - --#endif // __UTILITIES_H__ -+#endif // __EXAMPLES_UTILITIES_H__ -diff --git a/examples/main.c b/examples/main.c -index 30d04e6..ed3abef 100644 ---- a/examples/main.c -+++ b/examples/main.c -@@ -13,11 +13,22 @@ - - #include "utilities.h" - #include "parameter.h" -+#include "server.h" -+ -+ -+static struct ProgramParams prog_params; - - - int32_t main(int argc, char *argv[]) - { - int32_t ret = PROGRAM_OK; - -+ program_params_init(&prog_params); -+ ret = program_params_parse(&prog_params, argc, argv); -+ if (PROGRAM_ABORT == ret) { -+ return ret; -+ } -+ program_params_print(&prog_params); -+ - return ret; - } -diff --git a/examples/src/parameter.c b/examples/src/parameter.c -new file mode 100644 -index 0000000..8abcc68 ---- /dev/null -+++ b/examples/src/parameter.c -@@ -0,0 +1,267 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "parameter.h" -+ -+ -+// program short options -+const char prog_short_opts[] = \ -+ "a:" // as -+ "i:" // ip -+ "p:" // port -+ "m:" // model -+ "t:" // thread number -+ "c:" // connect number -+ "A:" // api -+ "P:" // pktlen -+ "v" // verify -+ "r" // ringpmd -+ "h" // help -+ ; -+ -+// program long options -+const struct ProgramOption prog_long_opts[] = \ -+{ -+ {PARAM_NAME_AS, REQUIRED_ARGUMETN, NULL, PARAM_NUM_AS}, -+ {PARAM_NAME_IP, REQUIRED_ARGUMETN, NULL, PARAM_NUM_IP}, -+ {PARAM_NAME_PORT, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PORT}, -+ {PARAM_NAME_MODEL, REQUIRED_ARGUMETN, NULL, PARAM_NUM_MODEL}, -+ {PARAM_NAME_THREAD_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_THREAD_NUM}, -+ {PARAM_NAME_CONNECT_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_CONNECT_NUM}, -+ {PARAM_NAME_API, REQUIRED_ARGUMETN, NULL, PARAM_NUM_API}, -+ {PARAM_NAME_PKTLEN, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PKTLEN}, -+ {PARAM_NAME_VERIFY, NO_ARGUMENT, NULL, PARAM_NUM_VERIFY}, -+ {PARAM_NAME_RINGPMD, NO_ARGUMENT, NULL, PARAM_NUM_RINGPMD}, -+ {PARAM_NAME_HELP, NO_ARGUMENT, NULL, PARAM_NUM_HELP}, -+}; -+ -+ -+// get long options -+int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, int *long_idx); -+ -+ -+// set `as` parameter -+void program_param_prase_as(struct ProgramParams *params, char *arg, const char *name) -+{ -+ if (0 == strcmp(arg, "server") || 0 == strcmp(arg, "client")) { -+ params->as = arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `ip` parameter -+void program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name) -+{ -+ if (INADDR_NONE == inet_addr(arg)) { -+ params->ip = arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `port` parameter -+void program_param_prase_port(struct ProgramParams *params, char *arg, const char *name) -+{ -+ int32_t port_arg = atoi(optarg); -+ if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX)) { -+ params->port = (uint32_t)port_arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `model` parameter -+void program_param_prase_model(struct ProgramParams *params, char *arg, const char *name) -+{ -+ if (0 == strcmp(optarg, "mum") || 0 == strcmp(optarg, "mud")) { -+ params->model = optarg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `connect_num` parameter -+void program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name) -+{ -+ int32_t connectnum_arg = atoi(optarg); -+ if (0 < connectnum_arg) { -+ params->connect_num = (uint32_t)connectnum_arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `thread_num` parameter -+void program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name) -+{ -+ int32_t threadnum_arg = atoi(optarg); -+ if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX)) { -+ params->thread_num = (uint32_t)threadnum_arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `api` parameter -+void program_param_prase_api(struct ProgramParams *params, char *arg, const char *name) -+{ -+ if (0 == strcmp(optarg, "unix") || 0 == strcmp(optarg, "posix")) { -+ params->api = optarg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// set `pktlen` parameter -+void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name) -+{ -+ int32_t pktlen_arg = atoi(optarg); -+ if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX)) { -+ params->pktlen = (uint32_t)pktlen_arg; -+ } -+ else { -+ PRINT_ERROR("illigal argument -- %s \n", name); -+ exit(PROGRAM_ABORT); -+ } -+} -+ -+// initialize the parameters -+void program_params_init(struct ProgramParams *params) -+{ -+ params->as = PARAM_DEFAULT_AS; -+ params->ip = PARAM_DEFAULT_IP; -+ params->port = PARAM_DEFAULT_PORT; -+ params->model = PARAM_DEFAULT_MODEL; -+ params->thread_num = PARAM_DEFAULT_CONNECT_NUM; -+ params->connect_num = PARAM_DEFAULT_THREAD_NUM; -+ params->api = PARAM_DEFAULT_API; -+ params->pktlen = PARAM_DEFAULT_PKTLEN; -+ params->verify = PARAM_DEFAULT_VERIFY; -+ params->ringpmd = PARAM_DEFAULT_RINGPMD; -+} -+ -+// print program helps -+void program_params_help(void) -+{ -+ printf("\n"); -+ printf("-a, --as [server | client]: set programas server or client. \n"); -+ printf(" server: as server. \n"); -+ printf(" client: as client. \n"); -+ printf("-i, --ip [xxx.xxx.xxx.xxx]: set ip address. \n"); -+ printf("-p, --port [xxxx]: set port number in range of %d - %d. \n", UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX); -+ printf("-m, --model [mum | mud]: set the network model. \n"); -+ printf(" mum: multi thread, unblock, multiplexing IO network model. \n"); -+ printf(" mud: multi thread, unblock, dissymmetric network model. \n"); -+ printf("-t, --threadnum [xxxx]: set thread number in range of %d - %d. \n", THREAD_NUM_MIN, THREAD_NUM_MAX); -+ printf("-c, --connectnum [xxxx]: set thread number of connection. \n"); -+ printf("-A, --api [unix | posix]: set api type is server or client. \n"); -+ printf(" unix: use unix's api. \n"); -+ printf(" posix: use posix api. \n"); -+ printf("-P, --pktlen [xxxx]: set packet length in range of %d - %d. \n", MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX); -+ printf("-v, --verify: set to verifying the message packet. \n"); -+ printf("-r, --ringpmd: set use ringpmd. \n"); -+ printf("-h, --help: see helps. \n"); -+ printf("\n"); -+} -+ -+// parse the parameters -+int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[]) -+{ -+ int32_t c; -+ -+ while (true) { -+ int32_t opt_idx = 0; -+ -+ c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); -+ -+ if (-1 == c) { -+ break; -+ } -+ -+ switch (c) { -+ case (PARAM_NUM_AS): -+ program_param_prase_as(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_IP): -+ program_param_prase_ip(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_PORT): -+ program_param_prase_port(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_MODEL): -+ program_param_prase_model(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_CONNECT_NUM): -+ program_param_prase_connectnum(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_THREAD_NUM): -+ program_param_prase_threadnum(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_API): -+ program_param_prase_api(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_PKTLEN): -+ program_param_prase_pktlen(params, optarg, prog_long_opts[opt_idx].name); -+ break; -+ case (PARAM_NUM_VERIFY): -+ params->verify = true; -+ break; -+ case (PARAM_NUM_RINGPMD): -+ params->ringpmd = true; -+ break; -+ case (PARAM_NUM_HELP): -+ program_params_help(); -+ return PROGRAM_ABORT; -+ case ('?'): -+ return PROGRAM_ABORT; -+ default: -+ program_params_help(); -+ return PROGRAM_ABORT; -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// print the parameters -+void program_params_print(struct ProgramParams *params) -+{ -+ printf("\n"); -+ printf("[program parameters]: \n"); -+ printf("--> [as]: %s \n", params->as); -+ printf("--> [ip]: %s \n", params->ip); -+ printf("--> [port]: %u \n", params->port); -+ printf("--> [model]: %s \n", params->model); -+ printf("--> [thread number]: %u \n", params->thread_num); -+ printf("--> [connection number]: %u \n", params->connect_num); -+ printf("--> [api]: %s \n", params->api); -+ printf("--> [packet length]: %u \n", params->pktlen); -+ printf("--> [verify]: %s \n", (true == params->verify) ? "on" : "off"); -+ printf("--> [ringpmd]: %s \n", (true == params->ringpmd) ? "on" : "off"); -+ printf("\n"); -+} --- -2.23.0 - diff --git a/0059-lstack-core-fix-reta_conf-array-size-calculation.patch b/0059-lstack-core-fix-reta_conf-array-size-calculation.patch deleted file mode 100644 index 4e2afc5..0000000 --- a/0059-lstack-core-fix-reta_conf-array-size-calculation.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 11f46783f88912e3c204fc12d4f33034f371881b Mon Sep 17 00:00:00 2001 -From: Honggang LI -Date: Thu, 23 Jun 2022 13:36:36 +0800 -Subject: [PATCH 19/40] lstack/core: fix reta_conf array size calculation - -When dev_info.reta_size is smaller than RTE_RETA_GROUP_SIZE, the first -parameter (nmemb) of calloc is zero. - -If nmemb is 0, then calloc() returns either NULL, or a unique pointer -value that can later be successfully passed to free(). When non-NULL -unique pointer was returned, rss_setup() will failed because of garbage -value in memory pointed by the unique pointer. - -Signed-off-by: Honggang LI ---- - src/lstack/core/lstack_dpdk.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index df0332b..3f0dbb4 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -428,6 +428,7 @@ static int rss_setup(const int port_id, const uint16_t nb_queues) - int ret; - struct rte_eth_dev_info dev_info; - struct rte_eth_rss_reta_entry64 *reta_conf = NULL; -+ size_t reta_conf_size, n; - - rte_eth_dev_info_get(port_id, &dev_info); - -@@ -435,8 +436,11 @@ static int rss_setup(const int port_id, const uint16_t nb_queues) - return ERR_VAL; - } - -- reta_conf = calloc(dev_info.reta_size / RTE_RETA_GROUP_SIZE, -- sizeof(struct rte_eth_rss_reta_entry64)); -+ reta_conf_size = dev_info.reta_size / RTE_RETA_GROUP_SIZE; -+ if (dev_info.reta_size % RTE_RETA_GROUP_SIZE) -+ reta_conf_size += 1; -+ -+ reta_conf = calloc(reta_conf_size, sizeof(struct rte_eth_rss_reta_entry64)); - if (!reta_conf) { - return ERR_MEM; - } -@@ -446,8 +450,8 @@ static int rss_setup(const int port_id, const uint16_t nb_queues) - one_reta_conf->reta[i % RTE_RETA_GROUP_SIZE] = i % nb_queues; - } - -- for (i = 0; i < dev_info.reta_size / RTE_RETA_GROUP_SIZE; i++) { -- struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[i]; -+ for (n = 0; n < reta_conf_size; n++) { -+ struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[n]; - one_reta_conf->mask = 0xFFFFFFFFFFFFFFFFULL; - } - --- -2.23.0 - diff --git a/0060-Replace-gettid-with-rte_gettid.patch b/0060-Replace-gettid-with-rte_gettid.patch deleted file mode 100644 index 5698b6a..0000000 --- a/0060-Replace-gettid-with-rte_gettid.patch +++ /dev/null @@ -1,39 +0,0 @@ -From e1c6c79565a549866fbe7cb770a6f09183676c0b Mon Sep 17 00:00:00 2001 -From: Honggang LI -Date: Wed, 13 Jul 2022 09:50:06 +0800 -Subject: [PATCH 07/19] Replace gettid() with rte_gettid() - -Signed-off-by: Honggang LI ---- - src/lstack/core/lstack_protocol_stack.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index a1f3790..2acf77a 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -67,10 +67,10 @@ static inline void set_stack_idx(uint16_t idx) - - long get_stack_tid(void) - { -- static PER_THREAD long g_stack_tid = 0; -+ static PER_THREAD int32_t g_stack_tid = 0; - - if (g_stack_tid == 0) { -- g_stack_tid = syscall(__NR_gettid); -+ g_stack_tid = rte_gettid(); - } - - return g_stack_tid; -@@ -245,7 +245,7 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); - - set_stack_idx(queue_id); -- stack->tid = gettid(); -+ stack->tid = rte_gettid(); - stack->queue_id = queue_id; - stack->port_id = stack_group->port_id; - stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; --- -2.23.0 - diff --git a/0061-modify-the-code-for-canonical-and-update-the-cmake-b.patch b/0061-modify-the-code-for-canonical-and-update-the-cmake-b.patch deleted file mode 100644 index 6aad96c..0000000 --- a/0061-modify-the-code-for-canonical-and-update-the-cmake-b.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 3ddd9dadcdd3bf5b451f0170f88b9f4957eceb26 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= -Date: Tue, 12 Jul 2022 20:55:33 +0800 -Subject: [PATCH 08/19] modify the code for canonical and update the cmake - build components - ---- - examples/CMakeLists.txt | 13 +++---------- - examples/inc/utilities.h | 14 ++++++++++++++ - examples/main.c | 3 +-- - examples/src/parameter.c | 22 +++++++++++----------- - 4 files changed, 29 insertions(+), 23 deletions(-) - -diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt -index 2e62bd3..b1c2b07 100644 ---- a/examples/CMakeLists.txt -+++ b/examples/CMakeLists.txt -@@ -23,13 +23,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D EXAMPLE_COMPILE") - - include_directories(${PROJECT_SOURCE_DIR}/inc) - --set(HEADERS -- inc/utilities.h -- inc/parameter.h --) --set(SOURCES -- main.c -- src/parameter.c --) -- --add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) -+aux_source_directory(${PROJECT_SOURCE_DIR}/src SOURCES) -+ -+add_executable(${PROJECT_NAME} main.c ${SOURCES}) -diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h -index bccd523..b594469 100644 ---- a/examples/inc/utilities.h -+++ b/examples/inc/utilities.h -@@ -24,10 +24,12 @@ - #include - #include - -+#include - #include - - #include - #include -+#include - - #include - #include -@@ -45,6 +47,18 @@ - printf(format, ##__VA_ARGS__); \ - printf("\n"); \ - } while(0) -+#define PRINT_SERVER(format, ...) do \ -+ { \ -+ printf(": "); \ -+ printf(format, ##__VA_ARGS__); \ -+ printf("\n"); \ -+ } while(0) -+#define PRINT_CLIENT(format, ...) do \ -+ { \ -+ printf(": "); \ -+ printf(format, ##__VA_ARGS__); \ -+ printf("\n"); \ -+ } while(0) - #define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) - #define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true))) - -diff --git a/examples/main.c b/examples/main.c -index ed3abef..a7daded 100644 ---- a/examples/main.c -+++ b/examples/main.c -@@ -13,7 +13,6 @@ - - #include "utilities.h" - #include "parameter.h" --#include "server.h" - - - static struct ProgramParams prog_params; -@@ -25,7 +24,7 @@ int32_t main(int argc, char *argv[]) - - program_params_init(&prog_params); - ret = program_params_parse(&prog_params, argc, argv); -- if (PROGRAM_ABORT == ret) { -+ if (ret == PROGRAM_ABORT) { - return ret; - } - program_params_print(&prog_params); -diff --git a/examples/src/parameter.c b/examples/src/parameter.c -index 8abcc68..ff3bcbc 100644 ---- a/examples/src/parameter.c -+++ b/examples/src/parameter.c -@@ -53,7 +53,7 @@ int getopt_long(int argc, char * const argv[], const char *optstring, const stru - // set `as` parameter - void program_param_prase_as(struct ProgramParams *params, char *arg, const char *name) - { -- if (0 == strcmp(arg, "server") || 0 == strcmp(arg, "client")) { -+ if (strcmp(arg, "server") == 0 || strcmp(arg, "client") == 0) { - params->as = arg; - } - else { -@@ -65,7 +65,7 @@ void program_param_prase_as(struct ProgramParams *params, char *arg, const char - // set `ip` parameter - void program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name) - { -- if (INADDR_NONE == inet_addr(arg)) { -+ if (inet_addr(arg) != INADDR_NONE) { - params->ip = arg; - } - else { -@@ -78,7 +78,7 @@ void program_param_prase_ip(struct ProgramParams *params, char *arg, const char - void program_param_prase_port(struct ProgramParams *params, char *arg, const char *name) - { - int32_t port_arg = atoi(optarg); -- if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX)) { -+ if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX) == true) { - params->port = (uint32_t)port_arg; - } - else { -@@ -90,7 +90,7 @@ void program_param_prase_port(struct ProgramParams *params, char *arg, const cha - // set `model` parameter - void program_param_prase_model(struct ProgramParams *params, char *arg, const char *name) - { -- if (0 == strcmp(optarg, "mum") || 0 == strcmp(optarg, "mud")) { -+ if (strcmp(optarg, "mum") == 0 || strcmp(optarg, "mud") == 0) { - params->model = optarg; - } - else { -@@ -103,7 +103,7 @@ void program_param_prase_model(struct ProgramParams *params, char *arg, const ch - void program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name) - { - int32_t connectnum_arg = atoi(optarg); -- if (0 < connectnum_arg) { -+ if (connectnum_arg > 0) { - params->connect_num = (uint32_t)connectnum_arg; - } - else { -@@ -116,7 +116,7 @@ void program_param_prase_connectnum(struct ProgramParams *params, char *arg, con - void program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name) - { - int32_t threadnum_arg = atoi(optarg); -- if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX)) { -+ if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX) == true) { - params->thread_num = (uint32_t)threadnum_arg; - } - else { -@@ -128,7 +128,7 @@ void program_param_prase_threadnum(struct ProgramParams *params, char *arg, cons - // set `api` parameter - void program_param_prase_api(struct ProgramParams *params, char *arg, const char *name) - { -- if (0 == strcmp(optarg, "unix") || 0 == strcmp(optarg, "posix")) { -+ if (strcmp(optarg, "unix") == 0 || strcmp(optarg, "posix") == 0) { - params->api = optarg; - } - else { -@@ -141,7 +141,7 @@ void program_param_prase_api(struct ProgramParams *params, char *arg, const char - void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name) - { - int32_t pktlen_arg = atoi(optarg); -- if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX)) { -+ if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX) == true) { - params->pktlen = (uint32_t)pktlen_arg; - } - else { -@@ -157,8 +157,8 @@ void program_params_init(struct ProgramParams *params) - params->ip = PARAM_DEFAULT_IP; - params->port = PARAM_DEFAULT_PORT; - params->model = PARAM_DEFAULT_MODEL; -- params->thread_num = PARAM_DEFAULT_CONNECT_NUM; -- params->connect_num = PARAM_DEFAULT_THREAD_NUM; -+ params->thread_num = PARAM_DEFAULT_THREAD_NUM; -+ params->connect_num = PARAM_DEFAULT_CONNECT_NUM; - params->api = PARAM_DEFAULT_API; - params->pktlen = PARAM_DEFAULT_PKTLEN; - params->verify = PARAM_DEFAULT_VERIFY; -@@ -199,7 +199,7 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char * - - c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); - -- if (-1 == c) { -+ if (c == -1) { - break; - } - --- -2.23.0 - diff --git a/0062-enable-secure-compile-and-open-compile-log.patch b/0062-enable-secure-compile-and-open-compile-log.patch deleted file mode 100644 index 94e94db..0000000 --- a/0062-enable-secure-compile-and-open-compile-log.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 2e36e8a3885563d12eac0e5cbed56ddaf1d28e27 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:05:57 +0800 -Subject: [PATCH 09/19] enable-secure-compile-and-open-compile-log - ---- - src/lstack/Makefile | 2 +- - src/ltran/CMakeLists.txt | 5 +++-- - 2 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index 8fc2435..98289d8 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -21,7 +21,7 @@ OPTIMIZATION = -O2 -g - RM = rm -f - LDFLAGS = -shared -ldl -lm -lpthread -lrt -lnuma -lconfig -lboundscheck - --SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -+SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2 - - INC = -I$(LSTACK_DIR)/include \ - -I$(LSTACK_DIR)/../common \ -diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt -index c21d88a..970bc1b 100644 ---- a/src/ltran/CMakeLists.txt -+++ b/src/ltran/CMakeLists.txt -@@ -13,7 +13,8 @@ project(ltran) - - set(COMMON_DIR ${PROJECT_SOURCE_DIR}/../common) - --set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread") -+set(CMAKE_VERBOSE_MAKEFILE ON) -+set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D LTRAN_COMPILE") - - if($ENV{GAZELLE_COVERAGE_ENABLE}) -@@ -57,4 +58,4 @@ set_target_properties(ltran PROPERTIES LINK_FLAGS "-L$ENV{DPDK_LIB_PATH} -Wl,--w - - add_executable(gazellectl ltran_dfx.c ${COMMON_DIR}/gazelle_dfx_msg.c) - target_include_directories(gazellectl PRIVATE $ENV{DPDK_INCLUDE_FILE} ${COMMON_DIR}) --target_link_libraries(gazellectl PRIVATE boundscheck) -+target_link_libraries(gazellectl PRIVATE boundscheck -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack) --- -2.23.0 - diff --git a/0063-support-epoll-et-trig-mode.patch b/0063-support-epoll-et-trig-mode.patch deleted file mode 100644 index da63c7d..0000000 --- a/0063-support-epoll-et-trig-mode.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 6114f85920ac4d24b73d892a1ebe1890efd48a3a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:16:04 +0800 -Subject: [PATCH 10/19] support-epoll-et-trig-mode - ---- - src/lstack/api/lstack_epoll.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 4978f02..5d7a4b8 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -288,6 +288,10 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - accept_num++; - } - -+ if (sock->epoll_events & EPOLLET) { -+ list_del_node_null(&sock->event_list); -+ } -+ - events[event_num].events = sock->events; - events[event_num].data = sock->ep_data; - event_num++; --- -2.23.0 - diff --git a/0064-lstack-support-low-power.patch b/0064-lstack-support-low-power.patch deleted file mode 100644 index c672f73..0000000 --- a/0064-lstack-support-low-power.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 314689e509a2ddc491eb1bf6ecd40f1a8e6be3db Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:19:54 +0800 -Subject: [PATCH 11/19] lstack support low power - ---- - src/lstack/core/lstack_protocol_stack.c | 57 ++++++++++++++-------- - src/lstack/include/lstack_ethdev.h | 1 - - src/lstack/include/lstack_protocol_stack.h | 1 + - src/lstack/netif/lstack_ethdev.c | 10 ---- - 4 files changed, 38 insertions(+), 31 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 2acf77a..595b97e 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -132,9 +132,18 @@ struct protocol_stack *get_bind_protocol_stack(void) - return stack_group->stacks[index]; - } - --void lstack_low_power_idling(void) -+static uint32_t get_protocol_traffic(struct protocol_stack *stack) -+{ -+ if (use_ltran()) { -+ return rte_ring_count(stack->rx_ring) + rte_ring_count(stack->tx_ring); -+ } -+ -+ /* only lstack mode, have not appropriate method to get traffic */ -+ return LSTACK_LPM_RX_PKTS + 1; -+} -+ -+void low_power_idling(struct protocol_stack *stack) - { -- static PER_THREAD uint32_t wakeup_flag = 0; - static PER_THREAD uint32_t last_cycle_ts = 0; - static PER_THREAD uint64_t last_cycle_pkts = 0; - struct timespec st = { -@@ -147,14 +156,9 @@ void lstack_low_power_idling(void) - set the CPU decentralization flag; - 2. If the number of received packets exceeds the threshold, the authorization mark will end; - 3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */ -- if (get_global_cfg_params()->low_power_mod == 0) { -- wakeup_flag = 0; -- return; -- } -- -- if (eth_get_flow_cnt() < LSTACK_LPM_RX_PKTS) { -- wakeup_flag = 1; -+ if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) { - nanosleep(&st, &st); -+ stack->low_power = true; - return; - } - -@@ -165,18 +169,18 @@ void lstack_low_power_idling(void) - uint64_t now_pkts = get_protocol_stack()->stats.rx; - uint32_t now_ts = sys_now(); - if (((now_ts - last_cycle_ts) > LSTACK_LPM_DETECT_MS) || -- (wakeup_flag && ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT))) { -- if (!wakeup_flag && ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT)) { -- wakeup_flag = 1; -- } else if (wakeup_flag && ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) { -- wakeup_flag = 0; -+ ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) { -+ if ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT) { -+ stack->low_power = true; -+ } else { -+ stack->low_power = false; - } - - last_cycle_ts = now_ts; - last_cycle_pkts = now_pkts; - } - -- if (wakeup_flag) { -+ if (stack->low_power) { - nanosleep(&st, &st); - } - } -@@ -221,16 +225,25 @@ static void* gazelle_wakeup_thread(void *arg) - uint16_t queue_id = *(uint16_t *)arg; - struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - -- int32_t lcore_id = get_global_cfg_params()->wakeup[stack->queue_id]; -+ struct cfg_params *cfg = get_global_cfg_params(); -+ int32_t lcore_id = cfg->wakeup[stack->queue_id]; - thread_affinity_init(lcore_id); - -+ struct timespec st = { -+ .tv_sec = 0, -+ .tv_nsec = 1 -+ }; -+ - LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); - -- sem_t *event_sem[WAKEUP_MAX_NUM]; -- int num; - for (;;) { -- num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -- for (int i = 0; i < num; i++) { -+ if (cfg->low_power_mod != 0 && stack->low_power) { -+ nanosleep(&st, &st); -+ } -+ -+ sem_t *event_sem[WAKEUP_MAX_NUM]; -+ uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -+ for (uint32_t i = 0; i < num; i++) { - sem_post(event_sem[i]); - } - } -@@ -423,6 +436,10 @@ static void* gazelle_stack_thread(void *arg) - send_stack_list(stack, SEND_LIST_MAX); - - sys_timer_run(); -+ -+ if (get_global_cfg_params()->low_power_mod != 0) { -+ low_power_idling(stack); -+ } - } - - return NULL; -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index 573a413..0e8400f 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -31,7 +31,6 @@ struct eth_dev_ops { - - int32_t ethdev_init(struct protocol_stack *stack); - int32_t eth_dev_poll(void); --uint32_t eth_get_flow_cnt(void); - void eth_dev_recv(struct rte_mbuf *mbuf); - - #endif /* __GAZELLE_ETHDEV_H__ */ -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index e5eedd7..0faeccf 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -45,6 +45,7 @@ struct protocol_stack { - struct rte_ring *wakeup_ring; - struct reg_ring_msg *reg_buf; - -+ volatile bool low_power; - volatile uint16_t conn_num __rte_cache_aligned; - lockless_queue rpc_queue __rte_cache_aligned; - char pad __rte_cache_aligned; -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 7938520..0f30d76 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -111,16 +111,6 @@ int32_t eth_dev_poll(void) - return nr_pkts; - } - --uint32_t eth_get_flow_cnt(void) --{ -- if (use_ltran()) { -- return rte_ring_count(get_protocol_stack()->rx_ring) + rte_ring_count(get_protocol_stack()->tx_ring); -- } else { -- /* can't get flow cnt, lstack_low_power_idling don't use this params */ -- return LSTACK_LPM_RX_PKTS + 1; -- } --} -- - static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - { - struct protocol_stack *stack = get_protocol_stack(); --- -2.23.0 - diff --git a/0065-add-port-mask-range-check.patch b/0065-add-port-mask-range-check.patch deleted file mode 100644 index 1773f9b..0000000 --- a/0065-add-port-mask-range-check.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 324c47ae4bd64bed134f75dc2a9ec93f8161ea26 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:23:51 +0800 -Subject: [PATCH 12/19] add-port-mask-range-check - ---- - src/ltran/ltran_param.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index aafbeee..cd65531 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -335,12 +335,21 @@ static int32_t parse_bond_ports(const config_t *config, const char *key, struct - } - - ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM); -- if (ltran_config->bond.port_num >= GAZELLE_MAX_BOND_NUM) { -+ if (ltran_config->bond.port_num > GAZELLE_MAX_BOND_NUM) { - free(port_str); - gazelle_set_errno(GAZELLE_ERANGE); - return GAZELLE_ERR; - } - -+ for (uint32_t i = 0; i < ltran_config->bond.port_num; i++) { -+ if (ltran_config->bond.portmask[i] < GAZELLE_BOND_PORT_MASK_MIN || -+ ltran_config->bond.portmask[i] > GAZELLE_BOND_PORT_MASK_MAX) { -+ free(port_str); -+ gazelle_set_errno(GAZELLE_ERANGE); -+ return GAZELLE_ERR; -+ } -+ } -+ - free(port_str); - return GAZELLE_OK; - } --- -2.23.0 - diff --git a/0066-release-kni-device.patch b/0066-release-kni-device.patch deleted file mode 100644 index 4e35a9e..0000000 --- a/0066-release-kni-device.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 7fac90c4e7bb0faf7c5341452a7b2a02470748d3 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:25:44 +0800 -Subject: [PATCH 13/19] release-kni-device - ---- - src/common/dpdk_common.c | 11 ++++++++++- - src/common/dpdk_common.h | 1 + - src/lstack/api/lstack_signal.c | 7 ++++++- - src/lstack/core/lstack_init.c | 2 ++ - src/ltran/main.c | 5 +++-- - 5 files changed, 22 insertions(+), 4 deletions(-) - -diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c -index 939d135..8d056f9 100644 ---- a/src/common/dpdk_common.c -+++ b/src/common/dpdk_common.c -@@ -184,6 +184,15 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - return 0; - } - -+void dpdk_kni_release(void) -+{ -+ if (g_pkni) { -+ rte_kni_release(g_pkni); -+ } -+ -+ g_pkni = NULL; -+} -+ - int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count) - { - uint32_t i = rte_kni_tx_burst(g_pkni, pkts_burst, count); -@@ -211,4 +220,4 @@ void kni_process_rx(uint16_t port) - pkts_burst[i] = NULL; - } - } --} -\ No newline at end of file -+} -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 6a6a030..2066159 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -66,6 +66,7 @@ struct rte_kni* get_gazelle_kni(void); - int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool); - int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count); - void kni_process_rx(uint16_t port); -+void dpdk_kni_release(void); - - struct rte_eth_conf; - struct rte_eth_dev_info; -diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c -index 4dba472..e73bc61 100644 ---- a/src/lstack/api/lstack_signal.c -+++ b/src/lstack/api/lstack_signal.c -@@ -18,6 +18,8 @@ - #include - #include - -+#include "lstack_cfg.h" -+#include "dpdk_common.h" - #include "lstack_log.h" - #include "lstack_control_plane.h" - -@@ -55,9 +57,12 @@ static inline bool match_hijack_signal(int sig) - static void lstack_sig_default_handler(int sig) - { - LSTACK_LOG(ERR, LSTACK, "lstack dumped,caught signal:%d\n", sig); -- control_fd_close(); - dump_stack(); - lwip_exit(); -+ if (!use_ltran()) { -+ dpdk_kni_release(); -+ } -+ control_fd_close(); - (void)kill(getpid(), sig); - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 78040b0..a506b34 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -152,6 +152,8 @@ __attribute__((destructor)) void gazelle_network_exit(void) - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "rte_pdump_uninit failed\n"); - } -+ -+ dpdk_kni_release(); - } - } - -diff --git a/src/ltran/main.c b/src/ltran/main.c -index 701df3c..328ca89 100644 ---- a/src/ltran/main.c -+++ b/src/ltran/main.c -@@ -18,6 +18,7 @@ - #include - #include - -+#include "dpdk_common.h" - #include "ltran_config.h" - #include "ltran_log.h" - #include "ltran_stat.h" -@@ -55,6 +56,7 @@ static void sig_default_handler(int32_t sig) - { - LTRAN_ERR("ltran dumped,caught signal:%d.\n", sig); - print_stack(); -+ dpdk_kni_release(); - kill(getpid(), sig); - } - -@@ -125,8 +127,7 @@ static void ltran_core_destroy(void) - gazelle_stack_htable_destroy(); - gazelle_tcp_conn_htable_destroy(); - gazelle_tcp_sock_htable_destroy(); -- -- return; -+ dpdk_kni_release(); - } - - static void wait_thread_finish(pthread_t ctrl_thread, uint32_t next_core) --- -2.23.0 - diff --git a/0067-optimize-check-ltran-exist.patch b/0067-optimize-check-ltran-exist.patch deleted file mode 100644 index 2561156..0000000 --- a/0067-optimize-check-ltran-exist.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 07bb11a2f0b7a1b5e7cf2c965f490d6d83a0b92b Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:28:06 +0800 -Subject: [PATCH 14/19] optimize check ltran exist - ---- - src/ltran/ltran_dfx.c | 89 +++++++++++++++++++++++-------------------- - 1 file changed, 47 insertions(+), 42 deletions(-) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 7db1adc..2b71021 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -52,7 +52,7 @@ static int32_t g_ltran_rate_show_flag = GAZELLE_OFF; // not show when first g - static struct gazelle_stat_ltran_total g_last_ltran_total; - static struct gazelle_stat_lstack_total g_last_lstack_total[GAZELLE_MAX_STACK_ARRAY_SIZE]; - --static bool g_use_ltran; -+static bool g_use_ltran = false; - - /* Use the largest data structure. */ - #define GAZELLE_CMD_RESP_BUFFER_SIZE (sizeof(struct gazelle_stack_dfx_data) / sizeof(char)) -@@ -104,23 +104,6 @@ static struct gazelle_dfx_list g_gazelle_dfx_tbl[] = { - - static int32_t g_wait_reply = 1; - --static pid_t ltran_process_exist(void) --{ -- #define LINE 1024 -- #define BASE_DEC_SCALE 10 -- char line[LINE]; -- FILE *cmd = popen("pidof ltran", "r"); -- -- if (fgets(line, LINE, cmd) == NULL) { -- return 0; -- } -- -- pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE); -- (void)pclose(cmd); -- -- return pid; --} -- - static void gazelle_print_ltran_conn(void *buf, const struct gazelle_stat_msg_request *req_msg) - { - struct gazelle_stat_forward_table *table = (struct gazelle_stat_forward_table *)buf; -@@ -160,7 +143,7 @@ static void gazelle_print_ltran_sock(void *buf, const struct gazelle_stat_msg_re - printf("ltran sock table num: %u\n", table->conn_num); - } - --static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg) -+static int32_t dfx_connect_ltran(bool use_ltran, bool probe) - { - int32_t ret, fd; - struct sockaddr_un addr; -@@ -177,7 +160,7 @@ static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg) - } - - addr.sun_family = AF_UNIX; -- if (g_use_ltran) { -+ if (use_ltran) { - ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, - strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1); - if (ret != EOK) { -@@ -193,12 +176,24 @@ static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg) - - ret = connect(fd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)); - if (ret == -1) { -- printf("connect ltran failed. errno: %d ret=%d\n", errno, ret); -+ if (!probe) { -+ printf("connect ltran failed. errno: %d ret=%d\n", errno, ret); -+ } - close(fd); - return GAZELLE_ERR; - } - -- ret = write_specied_len(fd, (char *)req_msg, sizeof(*req_msg)); -+ return fd; -+} -+ -+static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg) -+{ -+ int32_t fd = dfx_connect_ltran(g_use_ltran, false); -+ if (fd < 0) { -+ return fd; -+ } -+ -+ int32_t ret = write_specied_len(fd, (char *)req_msg, sizeof(*req_msg)); - if (ret == -1) { - printf("write request msg failed ret=%d\n", ret); - close(fd); -@@ -899,8 +894,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - } - - if (i < conn->total_conn_num) { -- printf("...\n"); -- printf("Total connections: %u, display connections: %u\n", conn->total_conn_num, i); -+ printf("...\nTotal connections: %u, display connections: %u\n", conn->total_conn_num, i); - } - - if (stat->eof != 0) { -@@ -1199,29 +1193,13 @@ static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32 - return -1; - } - --int32_t main(int32_t argc, char *argv[]) -+int32_t dfx_loop(struct gazelle_stat_msg_request *req_msg, int32_t req_msg_num) - { -- struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0}; -- int32_t req_msg_num, ret; -+ int32_t ret; - int32_t msg_index = 0; - struct gazelle_dfx_list *dfx = NULL; - char recv_buf[GAZELLE_CMD_RESP_BUFFER_SIZE + 1] = {0}; - -- g_use_ltran = ltran_process_exist() ? true : false; -- req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg); -- if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) { -- show_usage(); -- return 0; -- } -- -- if (!g_use_ltran) { -- g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data); -- ret = check_cmd_support(req_msg, req_msg_num); -- if (ret < 0) { -- return -1; -- } -- } -- - for (;;) { - dfx = find_dfx_node(req_msg[msg_index].stat_mode); - if (dfx == NULL) { -@@ -1260,3 +1238,30 @@ int32_t main(int32_t argc, char *argv[]) - - return 0; - } -+ -+int32_t main(int32_t argc, char *argv[]) -+{ -+ struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0}; -+ int32_t req_msg_num, ret; -+ -+ int32_t fd = dfx_connect_ltran(true, true); -+ if (fd > 0) { -+ g_use_ltran = true; -+ close(fd); -+ } -+ req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg); -+ if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) { -+ show_usage(); -+ return 0; -+ } -+ -+ if (!g_use_ltran) { -+ g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data); -+ ret = check_cmd_support(req_msg, req_msg_num); -+ if (ret < 0) { -+ return -1; -+ } -+ } -+ -+ return dfx_loop(req_msg, req_msg_num); -+} --- -2.23.0 - diff --git a/0068-clean-code.patch b/0068-clean-code.patch deleted file mode 100644 index 5759b39..0000000 --- a/0068-clean-code.patch +++ /dev/null @@ -1,4389 +0,0 @@ -From dfdb9cbf47b047f1b13a6657b481899cdcee481e Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:33:28 +0800 -Subject: [PATCH 15/19] clean code - ---- - src/common/dpdk_common.c | 28 +- - src/common/dpdk_common.h | 16 +- - src/common/gazelle_base_func.h | 4 + - src/common/gazelle_dfx_msg.h | 17 - - src/common/gazelle_opt.h | 80 ++ - src/common/gazelle_parse_config.c | 20 +- - src/common/gazelle_parse_config.h | 20 - - src/common/gazelle_reg_msg.h | 9 +- - src/lstack/api/lstack_epoll.c | 45 +- - src/lstack/api/lstack_fork.c | 1 - - src/lstack/api/lstack_wrap.c | 12 +- - src/lstack/core/lstack_cfg.c | 20 +- - src/lstack/core/lstack_control_plane.c | 28 +- - src/lstack/core/lstack_dpdk.c | 62 +- - src/lstack/core/lstack_init.c | 15 +- - src/lstack/core/lstack_lwip.c | 43 +- - src/lstack/core/lstack_protocol_stack.c | 53 +- - src/lstack/core/lstack_protocol_stack.c.orig | 825 +++++++++++++++++++ - src/lstack/core/lstack_stack_stat.c | 30 +- - src/lstack/core/lstack_thread_rpc.c | 18 +- - src/lstack/include/lstack_cfg.h | 6 +- - src/lstack/include/lstack_compiler.h | 46 -- - src/lstack/include/lstack_control_plane.h | 3 +- - src/lstack/include/lstack_dpdk.h | 25 +- - src/lstack/include/lstack_ethdev.h | 13 +- - src/lstack/include/lstack_lwip.h | 11 +- - src/lstack/include/lstack_protocol_stack.h | 13 +- - src/lstack/include/lstack_signal.h | 17 - - src/lstack/include/lstack_stack_stat.h | 10 +- - src/lstack/include/lstack_thread_rpc.h | 4 +- - src/lstack/include/lstack_vdev.h | 18 +- - src/lstack/include/posix/lstack_epoll.h | 18 +- - src/lstack/include/posix/lstack_fcntl.h | 28 - - src/lstack/include/posix/lstack_fork.h | 17 - - src/lstack/include/posix/lstack_socket.h | 3 + - src/lstack/include/posix/lstack_unistd.h | 3 +- - src/lstack/lstack.conf | 1 + - src/lstack/netif/lstack_ethdev.c | 6 +- - src/lstack/netif/lstack_vdev.c | 8 +- - src/ltran/ltran_base.h | 82 +- - src/ltran/ltran_config.c | 3 +- - src/ltran/ltran_config.h | 20 - - src/ltran/ltran_dfx.c | 50 +- - src/ltran/ltran_ethdev.c | 35 +- - src/ltran/ltran_ethdev.h | 8 +- - src/ltran/ltran_forward.c | 17 +- - src/ltran/ltran_forward.h | 11 - - src/ltran/ltran_instance.c | 42 +- - src/ltran/ltran_instance.h | 10 +- - src/ltran/ltran_log.h | 2 - - src/ltran/ltran_monitor.c | 12 +- - src/ltran/ltran_opt.h | 54 -- - src/ltran/ltran_param.c | 37 +- - src/ltran/ltran_param.h | 7 +- - src/ltran/ltran_stack.c | 8 +- - src/ltran/ltran_stack.h | 4 +- - src/ltran/ltran_stat.c | 21 +- - src/ltran/ltran_stat.h | 12 +- - src/ltran/ltran_tcp_conn.c | 4 + - src/ltran/ltran_tcp_conn.h | 7 +- - src/ltran/ltran_tcp_sock.c | 18 +- - src/ltran/ltran_tcp_sock.h | 7 +- - src/ltran/ltran_timer.c | 6 +- - src/ltran/ltran_timer.h | 4 +- - src/ltran/main.c | 11 +- - 65 files changed, 1428 insertions(+), 660 deletions(-) - create mode 100644 src/common/gazelle_opt.h - delete mode 100644 src/common/gazelle_parse_config.h - create mode 100644 src/lstack/core/lstack_protocol_stack.c.orig - delete mode 100644 src/lstack/include/lstack_compiler.h - delete mode 100644 src/lstack/include/lstack_signal.h - delete mode 100644 src/lstack/include/posix/lstack_fcntl.h - delete mode 100644 src/lstack/include/posix/lstack_fork.h - delete mode 100644 src/ltran/ltran_config.h - delete mode 100644 src/ltran/ltran_opt.h - -diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c -index 8d056f9..7298d05 100644 ---- a/src/common/dpdk_common.c -+++ b/src/common/dpdk_common.c -@@ -56,8 +56,8 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up) - int32_t ret = 0; - static bool g_bond_dev_started = false; - -- if (port_id >= rte_eth_dev_count_avail() || port_id >= RTE_MAX_ETHPORTS) { -- COMMON_ERR("Invalid port id %d \n", port_id); -+ if (port_id >= rte_eth_dev_count_avail() || port_id >= GAZELLE_MAX_ETHPORTS) { -+ COMMON_ERR("Invalid port id %hu \n", port_id); - return -EINVAL; - } - -@@ -67,7 +67,7 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up) - ret = rte_eth_dev_start(port_id); - pthread_mutex_unlock(&g_kni_mutex); - if (ret < 0) { -- COMMON_ERR("Failed to start port %d ret=%d\n", port_id, ret); -+ COMMON_ERR("Failed to start port %hu ret=%d\n", port_id, ret); - } - g_bond_dev_started = true; - } else { -@@ -84,7 +84,7 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up) - } - } - -- COMMON_INFO("Configure network interface of %d %s \n", port_id, if_up ? "up" : "down"); -+ COMMON_INFO("Configure network interface of %hu %s \n", port_id, if_up ? "up" : "down"); - return ret; - } - -@@ -134,13 +134,13 @@ void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev - int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - { - int32_t ret; -- struct rte_kni_ops ops; -- struct rte_kni_conf conf; -+ struct rte_kni_ops ops = {0}; -+ struct rte_kni_conf conf = {0}; - const struct rte_bus *bus = NULL; -- struct rte_eth_dev_info dev_info; -+ struct rte_eth_dev_info dev_info = {0}; - const struct rte_pci_device *pci_dev = NULL; - -- if (port >= RTE_MAX_ETHPORTS) { -+ if (port >= GAZELLE_MAX_ETHPORTS) { - COMMON_ERR("Bond port id out of range.\n"); - return -1; - } -@@ -151,10 +151,6 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - return -1; - } - -- (void)memset_s(&dev_info, sizeof(dev_info), 0, sizeof(dev_info)); -- (void)memset_s(&conf, sizeof(conf), 0, sizeof(conf)); -- (void)memset_s(&ops, sizeof(ops), 0, sizeof(ops)); -- - ret = snprintf_s(conf.name, RTE_KNI_NAMESIZE, RTE_KNI_NAMESIZE - 1, "%s", GAZELLE_KNI_NAME); - if (ret < 0) { - COMMON_ERR("snprintf_s failed. ret=%d\n", ret); -@@ -163,7 +159,11 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - conf.mbuf_size = GAZELLE_MAX_PKT_SZ; - conf.group_id = port; - -- rte_eth_dev_info_get(port, &dev_info); -+ if (rte_eth_dev_info_get(port, &dev_info) != 0) { -+ COMMON_ERR("Fail rte_eth_dev_info_get\n"); -+ return -1; -+ } -+ - if (dev_info.device) { - bus = rte_bus_find_by_device(dev_info.device); - } -@@ -178,7 +178,7 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool) - ops.port_id = port; - g_pkni = rte_kni_alloc(pool, &conf, &ops); - if (g_pkni == NULL) { -- COMMON_ERR("Fail to create kni for port: %d \n", port); -+ COMMON_ERR("Fail to create kni for port: %hu \n", port); - return -1; - } - return 0; -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 2066159..493b435 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -16,12 +16,26 @@ - #include - #include - -+#include "gazelle_opt.h" -+ - #define GAZELLE_KNI_NAME "kni" // will be removed during dpdk update - - /* time_stamp time_stamp_vaid_check . align 8 */ --#define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2) - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - -+/* Layout: -+ * | rte_mbuf | pbuf | custom_free_function | payload | -+ **/ -+struct pbuf; -+static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) -+{ -+ return ((struct rte_mbuf *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE)); -+} -+static inline struct pbuf_custom *mbuf_to_pbuf(struct rte_mbuf *m) -+{ -+ return ((struct pbuf_custom *)((uint8_t *)(m) + sizeof(struct rte_mbuf) + GAZELLE_MBUFF_PRIV_SIZE)); -+} -+ - /* NOTE!!! magic code, even the order. - * I wrote it carefully, and check the assembly. for example, there is 24 ins in A72, - * and if there is no cache miss, it only take less than 20 cycle(store pipe is the bottleneck). -diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h -index 57ba632..9d7381e 100644 ---- a/src/common/gazelle_base_func.h -+++ b/src/common/gazelle_base_func.h -@@ -28,4 +28,8 @@ - #define NODE_ENTRY(node, type, member) \ - ((type*)((char*)(node) - (size_t)&((type*)0)->member)) - -+int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); -+ -+int32_t check_and_set_run_dir(void); -+ - #endif /* ifndef __GAZELLE_BASE_FUNC_H__ */ -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index cf435cd..68b6364 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -17,13 +17,8 @@ - #include - #include - --#include "gazelle_reg_msg.h" -- - #define GAZELLE_CLIENT_NUM_MIN 1 - #define GAZELLE_LOG_LEVEL_MAX 10 --#define GAZELLE_CLIENT_NUM_MAX 32 --#define GAZELLE_NULL_CLIENT (GAZELLE_CLIENT_NUM_MAX - 1) --#define GAZELLE_MAX_CLIENT GAZELLE_CLIENT_NUM_MAX - - /* maybe it should be consistent with MEMP_NUM_TCP_PCB */ - #define GAZELLE_LSTACK_MAX_CONN (20000 + 2000) // same as MAX_CLIENTS + RESERVED_CLIENTS in lwipopts.h -@@ -239,16 +234,4 @@ struct gazelle_stat_msg_request { - int write_specied_len(int fd, const char *buf, size_t target_size); - int read_specied_len(int fd, char *buf, size_t target_size); - --static inline int32_t check_and_set_run_dir(void) --{ -- int32_t ret; -- -- if (access(GAZELLE_RUN_DIR, 0) != 0) { -- ret = mkdir(GAZELLE_RUN_DIR, GAZELLE_FILE_PERMISSION); -- if (ret != 0) { -- return -1; -- } -- } -- return 0; --} - #endif -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -new file mode 100644 -index 0000000..f2ec163 ---- /dev/null -+++ b/src/common/gazelle_opt.h -@@ -0,0 +1,80 @@ -+/* -+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+#ifndef _GAZELLE_OPT_H_ -+#define _GAZELLE_OPT_H_ -+ -+#define GAZELLE_OK 0 -+#define GAZELLE_ERR (-1) -+#define GAZELLE_QUIT 1 -+ -+#define GAZELLE_ON 1 -+#define GAZELLE_OFF 0 -+ -+#define GAZELLE_TRUE 1 -+#define GAZELLE_FALSE 0 -+ -+#define PROTOCOL_STACK_MAX 32 -+ -+#define ETHER_ADDR_LEN 6 -+ -+#define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2) -+ -+#define DEFAULT_RING_SIZE (512) -+#define DEFAULT_BACKUP_RING_SIZE_FACTOR (16) -+ -+#define VDEV_RX_QUEUE_SZ DEFAULT_RING_SIZE -+#define VDEV_EVENT_QUEUE_SZ DEFAULT_RING_SIZE -+#define VDEV_REG_QUEUE_SZ DEFAULT_RING_SIZE -+#define VDEV_CALL_QUEUE_SZ DEFAULT_RING_SIZE -+#define VDEV_WAKEUP_QUEUE_SZ DEFAULT_RING_SIZE -+#define VDEV_IDLE_QUEUE_SZ DEFAULT_RING_SIZE -+ -+#define VDEV_TX_QUEUE_SZ DEFAULT_RING_SIZE -+#define FREE_RX_QUEUE_SZ DPDK_PKT_BURST_SIZE -+ -+#define RTE_TEST_TX_DESC_DEFAULT 512 -+#define RTE_TEST_RX_DESC_DEFAULT 128 -+ -+#define DPDK_PKT_BURST_SIZE 512 -+ -+/* total:33 client, index 32 is invaild client */ -+#define GAZELLE_CLIENT_NUM_ALL 33 -+#define GAZELLE_NULL_CLIENT (GAZELLE_CLIENT_NUM_ALL - 1) -+#define GAZELLE_CLIENT_NUM GAZELLE_NULL_CLIENT -+ -+#define GAZELLE_MAX_PORT_NUM 16 -+#define GAZELLE_MAX_ETHPORTS GAZELLE_MAX_PORT_NUM -+ -+#define GAZELLE_MAX_INSTANCE_NUM GAZELLE_CLIENT_NUM -+ -+#define GAZELLE_MAX_BOND_NUM 2 -+#define GAZELLE_PACKET_READ_SIZE 32 -+ -+#define GAZELLE_MAX_STACK_NUM 128 -+#define GAZELLE_MAX_TCP_SOCK_NUM (GAZELLE_MAX_STACK_NUM * 32) -+ -+/* same as define (MAX_CLIENTS + RESERVED_CLIENTS) in lwip/lwipopts.h */ -+#define GAZELLE_MAX_CONN_NUM (GAZELLE_MAX_STACK_NUM * (20000 + 2000)) -+ -+#define GAZELLE_MAX_STACK_HTABLE_SIZE 32 -+#define GAZELLE_MAX_CONN_HTABLE_SIZE 2048 -+#define GAZELLE_MAX_TCP_SOCK_HTABLE_SIZE 256 -+ -+#define GAZELLE_MAX_STACK_ARRAY_SIZE GAZELLE_CLIENT_NUM -+ -+#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock" -+ -+#define GAZELLE_RUN_DIR "/var/run/gazelle/" -+#define GAZELLE_FILE_PERMISSION 0700 -+ -+#endif /* _GAZELLE_OPT_H_ */ -diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c -index bbc8362..4e96fcc 100644 ---- a/src/common/gazelle_parse_config.c -+++ b/src/common/gazelle_parse_config.c -@@ -13,8 +13,13 @@ - #include - #include - #include -+#include -+#include -+#include -+#include - --#include "gazelle_parse_config.h" -+#include "gazelle_opt.h" -+#include "gazelle_base_func.h" - - static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size) - { -@@ -62,3 +67,16 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size) - - return cnt; - } -+ -+int32_t check_and_set_run_dir(void) -+{ -+ int32_t ret; -+ -+ if (access(GAZELLE_RUN_DIR, 0) != 0) { -+ ret = mkdir(GAZELLE_RUN_DIR, GAZELLE_FILE_PERMISSION); -+ if (ret != 0) { -+ return -1; -+ } -+ } -+ return 0; -+} -diff --git a/src/common/gazelle_parse_config.h b/src/common/gazelle_parse_config.h -deleted file mode 100644 -index 0f86d80..0000000 ---- a/src/common/gazelle_parse_config.h -+++ /dev/null -@@ -1,20 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef __GAZELLE_PARSE_CONFIG__ --#define __GAZELLE_PARSE_CONFIG__ -- --#include -- --int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); -- --#endif -\ No newline at end of file -diff --git a/src/common/gazelle_reg_msg.h b/src/common/gazelle_reg_msg.h -index f5842e7..a944d80 100644 ---- a/src/common/gazelle_reg_msg.h -+++ b/src/common/gazelle_reg_msg.h -@@ -15,12 +15,7 @@ - - #include - --#include --#include -- --#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock" --#define GAZELLE_RUN_DIR "/var/run/gazelle/" --#define GAZELLE_FILE_PERMISSION 0700 -+#include "gazelle_opt.h" - - #define NULL_CLIENT_IP UINT32_MAX - #define NULL_CLIENT_PORT UINT16_MAX -@@ -62,7 +57,7 @@ struct client_proc_conf { - uint64_t socket_size; - char file_prefix[PATH_MAX]; - -- struct rte_ether_addr ethdev; -+ uint8_t mac_addr[ETHER_ADDR_LEN]; - uint32_t ipv4; - - char argv[GAZELLE_MAX_REG_ARGS][PATH_MAX]; -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 5d7a4b8..06a099d 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -26,11 +26,11 @@ - #include - #include - --#include "lstack_compiler.h" - #include "lstack_ethdev.h" - #include "lstack_stack_stat.h" - #include "lstack_cfg.h" - #include "lstack_log.h" -+#include "dpdk_common.h" - #include "gazelle_base_func.h" - #include "lstack_lwip.h" - #include "lstack_protocol_stack.h" -@@ -70,7 +70,7 @@ void add_epoll_event(struct netconn *conn, uint32_t event) - } - } - --static inline uint32_t update_events(struct lwip_sock *sock) -+static uint32_t update_events(struct lwip_sock *sock) - { - uint32_t event = 0; - -@@ -125,7 +125,12 @@ int32_t lstack_epoll_create(int32_t size) - posix_api->close_fn(fd); - GAZELLE_RETURN(EINVAL); - } -- memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)); -+ if (memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "memset_s failed\n"); -+ free(wakeup); -+ posix_api->close_fn(fd); -+ GAZELLE_RETURN(EINVAL); -+ } - - init_list_node(&wakeup->event_list); - sem_init(&wakeup->event_sem, 0, 0); -@@ -181,7 +186,7 @@ static uint16_t find_max_cnt_stack(int32_t *stack_count, uint16_t stack_num, str - return last_stack->queue_id; - } - -- /* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0.*/ -+ /* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0. */ - static uint16_t tick = 0; - if (all_same_cnt && stack_num) { - max_index = atomic_fetch_add(&tick, 1) % stack_num; -@@ -262,16 +267,18 @@ static void del_node_array(struct epoll_event *events, int32_t event_num, int32_ - - static int32_t del_duplicate_event(struct epoll_event *events, int32_t event_num) - { -- for (int32_t i = 0; i < event_num; i++) { -- for (int32_t j = i + 1; j < event_num; j++) { -+ int32_t num = event_num; -+ -+ for (int32_t i = 0; i < num; i++) { -+ for (int32_t j = i + 1; j < num; j++) { - if (events[i].data.u64 == events[j].data.u64) { -- del_node_array(events, event_num, j); -- event_num--; -+ del_node_array(events, num, j); -+ num--; - } - } - } - -- return event_num; -+ return num; - } - - static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) -@@ -307,7 +314,7 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - event_num = del_duplicate_event(events, event_num); - } - -- // atomic_fetch_add(&wakeup->bind_stack->stats.app_events, event_num); -+ wakeup->stat.app_events += event_num; - return event_num; - } - -@@ -327,7 +334,7 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - break; - } - -- sock = sock->listen_next;; -+ sock = sock->listen_next; - } - } - -@@ -441,25 +448,33 @@ static void init_poll_wakeup_data(struct wakeup_poll *wakeup) - - static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds) - { -- wakeup->last_fds = realloc(wakeup->last_fds, nfds * sizeof(struct pollfd)); -+ if (wakeup->last_fds) { -+ free(wakeup->last_fds); -+ } -+ wakeup->last_fds = calloc(nfds, sizeof(struct pollfd)); - if (wakeup->last_fds == NULL) { - LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - -- wakeup->events = realloc(wakeup->events, nfds * sizeof(struct epoll_event)); -+ if (wakeup->events) { -+ free(wakeup->events); -+ } -+ wakeup->events = calloc(nfds, sizeof(struct epoll_event)); - if (wakeup->events == NULL) { - LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - - wakeup->last_max_nfds = nfds; -- memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd)); -+ if (memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd)) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "memset_s faile\n"); -+ } - } - - static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); - -+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); - if (wakeup->bind_stack && wakeup->bind_stack->queue_id == bind_id) { - return; - } -diff --git a/src/lstack/api/lstack_fork.c b/src/lstack/api/lstack_fork.c -index 63dde81..43c212b 100644 ---- a/src/lstack/api/lstack_fork.c -+++ b/src/lstack/api/lstack_fork.c -@@ -14,7 +14,6 @@ - #include - - #include --#include "posix/lstack_fork.h" - - pid_t lstack_fork(void) - { -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index ec68d62..e402ce1 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -27,12 +27,12 @@ - #include - - #include "posix/lstack_epoll.h" --#include "posix/lstack_fcntl.h" --#include "posix/lstack_socket.h" - #include "posix/lstack_unistd.h" -+#include "posix/lstack_socket.h" - #include "lstack_log.h" - #include "lstack_cfg.h" - #include "lstack_lwip.h" -+#include "lstack_protocol_stack.h" - #include "gazelle_base_func.h" - #include "lstack_thread_rpc.h" - -@@ -42,7 +42,7 @@ enum KERNEL_LWIP_PATH { - PATH_UNKNOW, - }; - --static inline enum KERNEL_LWIP_PATH select_path(int fd) -+static enum KERNEL_LWIP_PATH select_path(int fd) - { - if (posix_api == NULL) { - /* posix api maybe call before gazelle init */ -@@ -131,7 +131,7 @@ static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *add - return posix_api->accept_fn(s, addr, addrlen); - } - --static inline int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, int32_t flags) -+static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, int32_t flags) - { - if (addr == NULL || addrlen == NULL) { - GAZELLE_RETURN(EINVAL); -@@ -153,7 +153,7 @@ static inline int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *ad - return posix_api->accept4_fn(s, addr, addrlen, flags); - } - --static inline int32_t do_bind(int32_t s, const struct sockaddr *name, socklen_t namelen) -+static int32_t do_bind(int32_t s, const struct sockaddr *name, socklen_t namelen) - { - if (name == NULL) { - GAZELLE_RETURN(EINVAL); -@@ -174,7 +174,7 @@ static inline int32_t do_bind(int32_t s, const struct sockaddr *name, socklen_t - return rpc_call_bind(s, name, namelen); - } - --static inline int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t namelen) -+static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t namelen) - { - if (name == NULL) { - GAZELLE_RETURN(EINVAL); -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index ca2b979..ee914c5 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -11,8 +11,6 @@ - */ - - #define _GNU_SOURCE --#include "lstack_cfg.h" -- - #include - #include - #include -@@ -34,7 +32,7 @@ - #include "lstack_log.h" - #include "gazelle_base_func.h" - #include "lstack_protocol_stack.h" --#include "gazelle_parse_config.h" -+#include "lstack_cfg.h" - - #define DEFAULT_CONF_FILE "/etc/gazelle/lstack.conf" - #define LSTACK_CONF_ENV "LSTACK_CONF_PATH" -@@ -83,21 +81,21 @@ struct cfg_params *get_global_cfg_params(void) - return &g_config_params; - } - --static int32_t str_to_eth_addr(const char *src, unsigned char *dst, size_t dst_size) -+static int32_t str_to_eth_addr(const char *src, unsigned char *dst) - { - if (strlen(src) > DEV_MAC_LEN) { - return -EINVAL; - } - -- struct rte_ether_addr tmp; -+ uint8_t mac_addr[ETHER_ADDR_LEN]; - - int32_t ret = sscanf_s(src, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", -- &tmp.addr_bytes[0], &tmp.addr_bytes[1], &tmp.addr_bytes[2], /* 0、1、2 mac byte index */ -- &tmp.addr_bytes[3], &tmp.addr_bytes[4], &tmp.addr_bytes[5]); /* 3、4、5 byte index */ -- if (ret != RTE_ETHER_ADDR_LEN) { -+ &mac_addr[0], &mac_addr[1], &mac_addr[2], /* 0、1、2 mac byte index */ -+ &mac_addr[3], &mac_addr[4], &mac_addr[5]); /* 3、4、5 byte index */ -+ if (ret != ETHER_ADDR_LEN) { - return -EINVAL; - } -- ret = memcpy_s(dst, dst_size, tmp.addr_bytes, dst_size); -+ ret = memcpy_s(dst, ETHER_ADDR_LEN, mac_addr, ETHER_ADDR_LEN); - if (ret != EOK) { - return -EINVAL; - } -@@ -185,7 +183,7 @@ static int32_t parse_devices(void) - } - - /* add dev */ -- ret = str_to_eth_addr(dev, g_config_params.ethdev.addr_bytes, sizeof(g_config_params.ethdev.addr_bytes)); -+ ret = str_to_eth_addr(dev, g_config_params.mac_addr); - if (ret != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid device name %s ret=%d.\n", dev, ret); - } -@@ -648,7 +646,7 @@ static int32_t parse_wakeup_cpu_number(void) - g_config_params.num_wakeup = cnt; - - if (g_config_params.num_wakeup < g_config_params.num_cpu) { -- LSTACK_PRE_LOG(LSTACK_ERR, "num_wakeup=%d less than num_stack_cpu=%d.\n", g_config_params.num_wakeup, -+ LSTACK_PRE_LOG(LSTACK_ERR, "num_wakeup=%hu less than num_stack_cpu=%hu.\n", g_config_params.num_wakeup, - g_config_params.num_cpu); - return -EINVAL; - } -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index c86dab1..8012fa6 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -27,8 +27,10 @@ - #include "lstack_cfg.h" - #include "lstack_dpdk.h" - #include "gazelle_reg_msg.h" -+#include "gazelle_base_func.h" - #include "lstack_stack_stat.h" - #include "lstack_log.h" -+#include "lstack_thread_rpc.h" - #include "lstack_protocol_stack.h" - #include "lstack_control_plane.h" - -@@ -61,7 +63,10 @@ static int control_unix_sock(struct sockaddr_un *address) - return -1; - } - -- memset_s(address, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)); -+ if (memset_s(address, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)) != 0) { -+ posix_api->close_fn(sockfd); -+ return -1; -+ } - address->sun_family = AF_UNIX; - int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), GAZELLE_REG_SOCK_PATHNAME, - strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); -@@ -115,7 +120,6 @@ static int32_t msg_proc_init(enum request_type rqt_type, struct reg_request_msg - { - int32_t ret; - struct cfg_params *global_params = get_global_cfg_params(); -- (void)memset_s(rqt_msg, sizeof(struct reg_request_msg), 0, sizeof(struct reg_request_msg)); - - rqt_msg->type = rqt_type; - struct client_proc_conf *conf = &rqt_msg->msg.proc; -@@ -129,7 +133,7 @@ static int32_t msg_proc_init(enum request_type rqt_type, struct reg_request_msg - return ret; - } - -- ret = memcpy_s(conf->ethdev.addr_bytes, RTE_ETHER_ADDR_LEN, global_params->ethdev.addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = memcpy_s(conf->mac_addr, ETHER_ADDR_LEN, global_params->mac_addr, ETHER_ADDR_LEN); - if (ret != EOK) { - return ret; - } -@@ -169,8 +173,6 @@ static int32_t msg_thrd_init(enum request_type rqt_type, struct reg_request_msg - { - struct protocol_stack *stack = get_protocol_stack(); - -- (void)memset_s(rqt_msg, sizeof(struct reg_request_msg), 0, sizeof(struct reg_request_msg)); -- - rqt_msg->type = rqt_type; - struct client_thrd_conf *conf = &rqt_msg->msg.thrd; - -@@ -203,7 +205,6 @@ static int32_t reg_communicate(const int32_t sockfd, struct reg_request_msg *sen - - char *buf = (char *)recv_msg; - ssize_t recv_size = (ssize_t)sizeof(*recv_msg); -- (void)memset_s(recv_msg, sizeof(*recv_msg), 0, sizeof(*recv_msg)); - while (recv_size > 0) { - size = posix_api->read_fn(sockfd, buf, recv_size); - if ((size < 0) && (errno != EINTR) && (errno != EAGAIN)) { -@@ -277,8 +278,8 @@ static int32_t client_reg_proc_memory(bool is_reconnect) - { - int32_t ret; - int32_t sockfd = g_data_fd; -- struct reg_request_msg send_msg; -- struct reg_response_msg recv_msg; -+ struct reg_request_msg send_msg = {0}; -+ struct reg_response_msg recv_msg = {0}; - - ret = msg_proc_init(RQT_REG_PROC_MEM, &send_msg); - if (ret != 0) { -@@ -316,8 +317,8 @@ static int32_t client_reg_proc_attach(__attribute__((__unused__)) bool is_reconn - { - int32_t ret; - int32_t sockfd = g_data_fd; -- struct reg_request_msg send_msg; -- struct reg_response_msg recv_msg; -+ struct reg_request_msg send_msg = {0}; -+ struct reg_response_msg recv_msg = {0}; - - ret = msg_proc_init(RQT_REG_PROC_ATT, &send_msg); - if (ret != 0) { -@@ -416,8 +417,8 @@ int32_t client_reg_thrd_ring(void) - { - int32_t ret; - int32_t sockfd; -- struct reg_request_msg send_msg; -- struct reg_response_msg recv_msg; -+ struct reg_request_msg send_msg = {0}; -+ struct reg_response_msg recv_msg = {0}; - - sockfd = connect_to_ltran(CONNECT_TO_LTRAN_INFINITE, CONNECT_TO_LTRAN_RETRY_INTERVAL); - if (sockfd < 0) { -@@ -454,6 +455,7 @@ void control_fd_close(void) - { - if (g_data_fd != 0) { - close(g_data_fd); -+ g_data_fd = -1; - /* 200ms: wait ltran instance logout */ - rte_delay_ms(200); - } -@@ -622,6 +624,7 @@ static int32_t client_reg_proc_reconnect(int32_t epfd) - ret = thread_register(); - if (ret != 0) { - posix_api->close_fn(sockfd); -+ g_data_fd = -1; - return -1; - } - -@@ -630,6 +633,7 @@ static int32_t client_reg_proc_reconnect(int32_t epfd) - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn failed, errno is %d ret=%d\n", errno, ret); - posix_api->close_fn(sockfd); -+ g_data_fd = -1; - return -1; - } - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 6f4adf1..366655c 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -29,11 +29,14 @@ - #include - #include - #include -+#include -+#include - - #include "lstack_log.h" - #include "dpdk_common.h" - #include "lstack_dpdk.h" - #include "lstack_lockless_queue.h" -+#include "lstack_protocol_stack.h" - #include "lstack_thread_rpc.h" - #include "lstack_lwip.h" - #include "lstack_cfg.h" -@@ -97,8 +100,7 @@ int32_t dpdk_eal_init(void) - LSTACK_PRE_LOG(LSTACK_INFO, "rte_eal_init aleady init\n"); - /* maybe other program inited, merge init param share init */ - ret = 0; -- } -- else { -+ } else { - LSTACK_PRE_LOG(LSTACK_ERR, "rte_eal_init failed init, rte_errno %d\n", rte_errno); - } - } else { -@@ -207,7 +209,6 @@ int32_t create_shared_ring(struct protocol_stack *stack) - } - } - -- - if (use_ltran()) { - stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id); - if (stack->rx_ring == NULL) { -@@ -241,13 +242,13 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui - - ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch); - if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %d ret=%d\n", (int32_t)batch, ret); -+ LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %u ret=%d\n", batch, ret); - return -1; - } - - ret = gazelle_ring_sp_enqueue(ring, (void **)free_buf, batch); - if (ret == 0) { -- LSTACK_LOG(ERR, LSTACK, "cannot enqueue to ring, count: %d\n", (int32_t)batch); -+ LSTACK_LOG(ERR, LSTACK, "cannot enqueue to ring, count: %u\n", batch); - return -1; - } - -@@ -276,10 +277,10 @@ static int32_t ethdev_port_id(uint8_t *mac) - - for (port_id = 0; port_id < nr_eth_dev; port_id++) { - rte_eth_macaddr_get(port_id, &mac_addr); -- if (!memcmp(mac, mac_addr.addr_bytes, RTE_ETHER_ADDR_LEN)) { -+ if (!memcmp(mac, mac_addr.addr_bytes, ETHER_ADDR_LEN)) { - break; - } -- LSTACK_LOG(INFO, LSTACK, "nic mac:%02x:%02x:%02x:%02x:%02x:%02x not match\n", -+ LSTACK_LOG(INFO, LSTACK, "nic mac:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx not match\n", - mac_addr.addr_bytes[0], mac_addr.addr_bytes[1], mac_addr.addr_bytes[2], // 0 1 2 mac addr - mac_addr.addr_bytes[3], mac_addr.addr_bytes[4], mac_addr.addr_bytes[5]); // 3 4 5 mac addr - } -@@ -294,11 +295,10 @@ static int32_t ethdev_port_id(uint8_t *mac) - - static struct eth_params *alloc_eth_params(uint16_t port_id, uint16_t nb_queues) - { -- struct eth_params *eth_params = malloc(sizeof(struct eth_params)); -+ struct eth_params *eth_params = calloc(1, sizeof(struct eth_params)); - if (eth_params == NULL) { - return NULL; - } -- memset_s(eth_params, sizeof(struct eth_params), 0, sizeof(*eth_params)); - - eth_params->port_id = port_id; - eth_params->nb_queues = nb_queues; -@@ -348,27 +348,29 @@ static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *de - return rss_enable; - } - --static int rss_setup(const int port_id, const uint16_t nb_queues) -+static void rss_setup(const int port_id, const uint16_t nb_queues) - { -- int i; - int ret; - struct rte_eth_dev_info dev_info; - struct rte_eth_rss_reta_entry64 *reta_conf = NULL; -- size_t reta_conf_size, n; -+ uint16_t reta_conf_size, i; - -- rte_eth_dev_info_get(port_id, &dev_info); -+ if (rte_eth_dev_info_get(port_id, &dev_info) != 0) { -+ return; -+ } - - if (nb_queues == 0) { -- return ERR_VAL; -+ return; - } - - reta_conf_size = dev_info.reta_size / RTE_RETA_GROUP_SIZE; -- if (dev_info.reta_size % RTE_RETA_GROUP_SIZE) -- reta_conf_size += 1; -+ if (dev_info.reta_size % RTE_RETA_GROUP_SIZE) { -+ reta_conf_size += 1; -+ } - - reta_conf = calloc(reta_conf_size, sizeof(struct rte_eth_rss_reta_entry64)); - if (!reta_conf) { -- return ERR_MEM; -+ return; - } - for (i = 0; i < dev_info.reta_size; i++) { - struct rte_eth_rss_reta_entry64 *one_reta_conf = -@@ -376,8 +378,8 @@ static int rss_setup(const int port_id, const uint16_t nb_queues) - one_reta_conf->reta[i % RTE_RETA_GROUP_SIZE] = i % nb_queues; - } - -- for (n = 0; n < reta_conf_size; n++) { -- struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[n]; -+ for (i = 0; i < reta_conf_size; i++) { -+ struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[i]; - one_reta_conf->mask = 0xFFFFFFFFFFFFFFFFULL; - } - -@@ -388,14 +390,14 @@ static int rss_setup(const int port_id, const uint16_t nb_queues) - } - - free(reta_conf); -- return ERR_OK; - } - - int32_t dpdk_ethdev_init(void) - { - uint16_t nb_queues = get_global_cfg_params()->num_cpu; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- int32_t port_id = ethdev_port_id(get_global_cfg_params()->ethdev.addr_bytes); -+ int32_t port_id = ethdev_port_id(get_global_cfg_params()->mac_addr); - if (port_id < 0) { - return port_id; - } -@@ -409,7 +411,7 @@ int32_t dpdk_ethdev_init(void) - - int32_t max_queues = LWIP_MIN(dev_info.max_rx_queues, dev_info.max_tx_queues); - if (max_queues < nb_queues) { -- LSTACK_LOG(ERR, LSTACK, "port_id %u max_queues=%d\n", port_id, max_queues); -+ LSTACK_LOG(ERR, LSTACK, "port_id %d max_queues=%d\n", port_id, max_queues); - return -EINVAL; - } - -@@ -419,7 +421,6 @@ int32_t dpdk_ethdev_init(void) - } - eth_params_checksum(ð_params->conf, &dev_info); - int32_t rss_enable = eth_params_rss(ð_params->conf, &dev_info); -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); - stack_group->eth_params = eth_params; - stack_group->port_id = eth_params->port_id; - stack_group->rx_offload = eth_params->conf.rxmode.offloads; -@@ -428,12 +429,16 @@ int32_t dpdk_ethdev_init(void) - ret = rte_eth_dev_configure(port_id, nb_queues, nb_queues, ð_params->conf); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "cannot config eth dev at port %d: %s\n", port_id, rte_strerror(-ret)); -+ stack_group->eth_params = NULL; -+ free(eth_params); - return ret; - } - - ret = dpdk_ethdev_start(); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n"); -+ stack_group->eth_params = NULL; -+ free(eth_params); - return ret; - } - -@@ -451,14 +456,14 @@ static int32_t dpdk_ethdev_setup(const struct eth_params *eth_params, const stru - ret = rte_eth_rx_queue_setup(eth_params->port_id, stack->queue_id, eth_params->nb_rx_desc, stack->socket_id, - ð_params->rx_conf, stack->rx_pktmbuf_pool); - if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "cannot setup rx_queue %d: %s\n", stack->queue_id, rte_strerror(-ret)); -+ LSTACK_LOG(ERR, LSTACK, "cannot setup rx_queue %hu: %s\n", stack->queue_id, rte_strerror(-ret)); - return -1; - } - - ret = rte_eth_tx_queue_setup(eth_params->port_id, stack->queue_id, eth_params->nb_tx_desc, stack->socket_id, - ð_params->tx_conf); - if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "cannot setup tx_queue %d: %s\n", stack->queue_id, rte_strerror(-ret)); -+ LSTACK_LOG(ERR, LSTACK, "cannot setup tx_queue %hu: %s\n", stack->queue_id, rte_strerror(-ret)); - return -1; - } - -@@ -499,9 +504,10 @@ static void set_kni_ip_mac(uint16_t port_id) - - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = cfg->host_addr.addr; -- strcpy_s(set_ifr.ifr_name, sizeof(set_ifr.ifr_name), GAZELLE_KNI_NAME); -- int32_t ret = posix_api->ioctl_fn(fd, SIOCSIFADDR, &set_ifr); -- if (ret < 0) { -+ if (strcpy_s(set_ifr.ifr_name, sizeof(set_ifr.ifr_name), GAZELLE_KNI_NAME) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "strcpy_s fail \n"); -+ } -+ if (posix_api->ioctl_fn(fd, SIOCSIFADDR, &set_ifr) < 0) { - LSTACK_LOG(ERR, LSTACK, "set kni ip=%u fail\n", cfg->host_addr.addr); - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index a506b34..9fafda9 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -35,11 +35,12 @@ - #include "lstack_cfg.h" - #include "lstack_control_plane.h" - #include "lstack_ethdev.h" --#include "lstack_signal.h" - #include "lstack_dpdk.h" - #include "lstack_stack_stat.h" - #include "lstack_log.h" -+#include "dpdk_common.h" - #include "posix/lstack_epoll.h" -+#include "posix/lstack_unistd.h" - #include "gazelle_base_func.h" - #include "lstack_protocol_stack.h" - -@@ -48,11 +49,16 @@ - #define LSTACK_PRELOAD_NAME_LEN PATH_MAX - #define LSTACK_PRELOAD_ENV_PROC "GAZELLE_BIND_PROCNAME" - --static volatile int32_t g_init_fail = 0; -+static volatile bool g_init_fail = false; - - void set_init_fail(void) - { -- g_init_fail = 1; -+ g_init_fail = true; -+} -+ -+bool get_init_fail(void) -+{ -+ return g_init_fail; - } - - struct lstack_preload { -@@ -272,11 +278,12 @@ __attribute__((constructor)) void gazelle_network_init(void) - lwip_sock_init(); - - /* wait stack thread and kernel_event thread init finish */ -- wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num * 2); -+ wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num); - if (g_init_fail) { - LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n"); - } - - posix_api->ues_posix = 0; - LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n"); -+ rte_smp_mb(); - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 156fc1f..9f51ebd 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -30,6 +30,8 @@ - #include "lstack_dpdk.h" - #include "lstack_stack_stat.h" - #include "posix/lstack_epoll.h" -+#include "lstack_thread_rpc.h" -+#include "dpdk_common.h" - #include "lstack_lwip.h" - - #define HALF_DIVISOR (2) -@@ -39,7 +41,7 @@ static int32_t lwip_alloc_pbufs(pbuf_layer layer, uint16_t length, pbuf_type typ - - static void free_ring_pbuf(struct rte_ring *ring) - { -- void *pbufs[SOCK_RECV_RING_SIZE]; -+ void *pbufs[SOCK_RECV_RING_SIZE]; - - do { - gazelle_ring_read(ring, pbufs, RING_SIZE(SOCK_RECV_RING_SIZE)); -@@ -64,14 +66,12 @@ static void reset_sock_data(struct lwip_sock *sock) - } - sock->recv_ring = NULL; - -- - if (sock->send_ring) { - free_ring_pbuf(sock->send_ring); - rte_ring_free(sock->send_ring); - } - sock->send_ring = NULL; - -- - sock->stack = NULL; - sock->wakeup = NULL; - sock->listen_next = NULL; -@@ -90,8 +90,8 @@ static void replenish_send_idlembuf(struct rte_ring *ring) - void *pbuf[SOCK_SEND_RING_SIZE]; - - uint32_t replenish_cnt = gazelle_ring_free_count(ring); -- uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); - -+ uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); - if (lwip_alloc_pbufs(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM, (void **)pbuf, alloc_num) != 0) { - return; - } -@@ -126,7 +126,7 @@ void gazelle_init_sock(int32_t fd) - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -- replenish_send_idlembuf(sock->send_ring); -+ replenish_send_idlembuf(sock->send_ring); - - sock->stack = stack; - sock->stack->conn_num++; -@@ -441,15 +441,15 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - return recv_len; - } - --ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) -+static int32_t check_msg_vaild(const struct msghdr *message) - { - ssize_t buflen = 0; -- int32_t i; - - if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) { - GAZELLE_RETURN(EINVAL); - } -- for (i = 0; i < message->msg_iovlen; i++) { -+ -+ for (int32_t i = 0; i < message->msg_iovlen; i++) { - if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || - ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || - ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -@@ -457,8 +457,19 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) - } - buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); - } -- buflen = 0; -- for (i = 0; i < message->msg_iovlen; i++) { -+ -+ return 0; -+} -+ -+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) -+{ -+ ssize_t buflen = 0; -+ -+ if (check_msg_vaild(message)) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ for (int32_t i = 0; i < message->msg_iovlen; i++) { - ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); - if (recvd_local > 0) { - buflen += recvd_local; -@@ -507,17 +518,9 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - int32_t i; - ssize_t buflen = 0; - -- if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) { -+ if (check_msg_vaild(message)) { - GAZELLE_RETURN(EINVAL); - } -- for (i = 0; i < message->msg_iovlen; i++) { -- if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || -- ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || -- ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -- GAZELLE_RETURN(EINVAL); -- } -- buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); -- } - - for (i = 0; i < message->msg_iovlen; i++) { - ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); -@@ -756,7 +759,7 @@ void create_shadow_fd(struct rpc_msg *msg) - - int32_t ret = lwip_bind(clone_fd, addr, addr_len); - if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "clone bind failed clone_fd=%d errno=%d\n", ret, errno); -+ LSTACK_LOG(ERR, LSTACK, "clone bind failed clone_fd=%d errno=%d\n", clone_fd, errno); - msg->result = ret; - return; - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 595b97e..577711a 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -27,6 +27,8 @@ - #include "lstack_thread_rpc.h" - #include "dpdk_common.h" - #include "lstack_log.h" -+#include "lstack_dpdk.h" -+#include "lstack_ethdev.h" - #include "lstack_lwip.h" - #include "lstack_protocol_stack.h" - #include "lstack_cfg.h" -@@ -43,21 +45,19 @@ static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; - static struct protocol_stack_group g_stack_group = {0}; - - void set_init_fail(void); -+bool get_init_fail(void); - typedef void *(*stack_thread_func)(void *arg); - - --int32_t bind_to_stack_numa(struct protocol_stack *stack) -+void bind_to_stack_numa(struct protocol_stack *stack) - { - int32_t ret; - pthread_t tid = pthread_self(); - - ret = pthread_setaffinity_np(tid, sizeof(stack->idle_cpuset), &stack->idle_cpuset); - if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %d failed\n", rte_gettid(), stack->queue_id); -- return -1; -+ LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %hu failed\n", rte_gettid(), stack->queue_id); - } -- -- return 0; - } - - static inline void set_stack_idx(uint16_t idx) -@@ -194,12 +194,12 @@ static int32_t create_thread(uint16_t queue_id, char *thread_name, stack_thread_ - int32_t ret; - - if (queue_id >= PROTOCOL_STACK_MAX) { -- LSTACK_LOG(ERR, LSTACK, "queue_id is %d exceed max=%d\n", queue_id, PROTOCOL_STACK_MAX); -+ LSTACK_LOG(ERR, LSTACK, "queue_id is %hu exceed max=%d\n", queue_id, PROTOCOL_STACK_MAX); - return -1; - } - queue[queue_id] = queue_id; - -- ret = sprintf_s(name, sizeof(name), "%s%02d", thread_name, queue[queue_id]); -+ ret = sprintf_s(name, sizeof(name), "%s%02hu", thread_name, queue[queue_id]); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "set name failed\n"); - return -1; -@@ -234,7 +234,7 @@ static void* gazelle_wakeup_thread(void *arg) - .tv_nsec = 1 - }; - -- LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id); -+ LSTACK_LOG(INFO, LSTACK, "weakup_%02hu start\n", stack->queue_id); - - for (;;) { - if (cfg->low_power_mod != 0 && stack->low_power) { -@@ -255,8 +255,6 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); -- - set_stack_idx(queue_id); - stack->tid = rte_gettid(); - stack->queue_id = queue_id; -@@ -301,21 +299,20 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - static void* gazelle_kernel_event(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - - int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); - if (epoll_fd < 0) { -- LSTACK_LOG(ERR, LSTACK, "queue_id=%d epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -+ LSTACK_LOG(ERR, LSTACK, "queue_id=%hu epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); - /* exit in main thread, avoid create mempool and exit at the same time */ - set_init_fail(); -- sem_post(&get_protocol_stack_group()->all_init); -+ stack->epollfd = -1; - return NULL; - } - -- struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - stack->epollfd = epoll_fd; - -- sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(INFO, LSTACK, "kernel_event_%02d start\n", stack->queue_id); -+ LSTACK_LOG(INFO, LSTACK, "kernel_event_%02hu start\n", queue_id); - - struct epoll_event events[KERNEL_EPOLL_MAX]; - for (;;) { -@@ -340,18 +337,24 @@ static int32_t create_companion_thread(struct protocol_stack_group *stack_group, - { - int32_t ret; - -+ ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -+ return ret; -+ } -+ -+ /* wait gazelle_kernel_event finish use stack.avoid use stack after free when create gazelle_weakup_thread fail */ -+ while (stack->epollfd == 0) { -+ usleep(1); -+ } -+ - if (stack_group->wakeup_enable) { - ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); -- return ret; - } - } - -- ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -- } - return ret; - } - -@@ -363,7 +366,7 @@ void wait_sem_value(sem_t *sem, int32_t wait_value) - } while (sem_val < wait_value); - } - --static struct protocol_stack * stack_thread_init(uint16_t queue_id) -+static struct protocol_stack *stack_thread_init(uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -@@ -419,12 +422,12 @@ static void* gazelle_stack_thread(void *arg) - /* exit in main thread, avoid create mempool and exit at the same time */ - set_init_fail(); - sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%d\n", queue_id); -+ LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%hu\n", queue_id); - return NULL; - } - - sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id); -+ LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); - - for (;;) { - poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); -@@ -497,6 +500,10 @@ int32_t init_protocol_stack(void) - - wait_sem_value(&stack_group->thread_phase1, stack_group->stack_num); - -+ if (get_init_fail()) { -+ return -1; -+ } -+ - ret = init_stack_numa_cpuset(); - if (ret < 0) { - return -1; -diff --git a/src/lstack/core/lstack_protocol_stack.c.orig b/src/lstack/core/lstack_protocol_stack.c.orig -new file mode 100644 -index 0000000..4755b8a ---- /dev/null -+++ b/src/lstack/core/lstack_protocol_stack.c.orig -@@ -0,0 +1,825 @@ -+/* -+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+#define _GNU_SOURCE -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "gazelle_base_func.h" -+#include "lstack_thread_rpc.h" -+#include "dpdk_common.h" -+#include "lstack_log.h" -+#include "lstack_lwip.h" -+#include "lstack_protocol_stack.h" -+#include "lstack_cfg.h" -+#include "lstack_control_plane.h" -+#include "posix/lstack_epoll.h" -+#include "lstack_stack_stat.h" -+ -+#define READ_LIST_MAX 32 -+#define SEND_LIST_MAX 32 -+#define HANDLE_RPC_MSG_MAX 32 -+#define KERNEL_EPOLL_MAX 256 -+ -+static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; -+static struct protocol_stack_group g_stack_group = {0}; -+ -+void set_init_fail(void); -+typedef void *(*stack_thread_func)(void *arg); -+ -+ -+int32_t bind_to_stack_numa(struct protocol_stack *stack) -+{ -+ int32_t ret; -+ pthread_t tid = pthread_self(); -+ -+ ret = pthread_setaffinity_np(tid, sizeof(stack->idle_cpuset), &stack->idle_cpuset); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %d failed\n", rte_gettid(), stack->queue_id); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static inline void set_stack_idx(uint16_t idx) -+{ -+ g_stack_idx = idx; -+} -+ -+long get_stack_tid(void) -+{ -+ static PER_THREAD int32_t g_stack_tid = 0; -+ -+ if (g_stack_tid == 0) { -+ g_stack_tid = rte_gettid(); -+ } -+ -+ return g_stack_tid; -+} -+ -+struct protocol_stack_group *get_protocol_stack_group(void) -+{ -+ return &g_stack_group; -+} -+ -+struct protocol_stack *get_protocol_stack(void) -+{ -+ if (g_stack_idx >= PROTOCOL_STACK_MAX) { -+ return NULL; -+ } -+ return g_stack_group.stacks[g_stack_idx]; -+} -+ -+struct protocol_stack *get_protocol_stack_by_fd(int32_t fd) -+{ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ return NULL; -+ } -+ -+ return sock->stack; -+} -+ -+struct protocol_stack *get_bind_protocol_stack(void) -+{ -+ static PER_THREAD struct protocol_stack *bind_stack = NULL; -+ -+ /* same app communication thread bind same stack */ -+ if (bind_stack) { -+ return bind_stack; -+ } -+ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ uint16_t index = 0; -+ -+ /* close listen shadow, per app communication thread select only one stack */ -+ if (get_global_cfg_params()->listen_shadow == false) { -+ static uint16_t stack_index = 0; -+ index = atomic_fetch_add(&stack_index, 1); -+ if (index >= stack_group->stack_num) { -+ LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num); -+ return NULL; -+ } -+ /* use listen shadow, app communication thread maybe more than stack num, select the least load stack */ -+ } else { -+ for (uint16_t i = 1; i < stack_group->stack_num; i++) { -+ if (stack_group->stacks[i]->conn_num < stack_group->stacks[index]->conn_num) { -+ index = i; -+ } -+ } -+ } -+ -+ bind_stack = stack_group->stacks[index]; -+ return stack_group->stacks[index]; -+} -+ -+static uint32_t get_protocol_traffic(struct protocol_stack *stack) -+{ -+ if (use_ltran()) { -+ return rte_ring_count(stack->rx_ring) + rte_ring_count(stack->tx_ring); -+ } -+ -+ /* only lstack mode, have not appropriate method to get traffic */ -+ return LSTACK_LPM_RX_PKTS + 1; -+} -+ -+void low_power_idling(struct protocol_stack *stack) -+{ -+ static PER_THREAD uint32_t last_cycle_ts = 0; -+ static PER_THREAD uint64_t last_cycle_pkts = 0; -+ struct timespec st = { -+ .tv_sec = 0, -+ .tv_nsec = 1 -+ }; -+ -+ /* CPU delegation strategy in idling scenarios: -+ 1. In the detection period, if the number of received packets is less than the threshold, -+ set the CPU decentralization flag; -+ 2. If the number of received packets exceeds the threshold, the authorization mark will end; -+ 3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */ -+ if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) { -+ nanosleep(&st, &st); -+ stack->low_power = true; -+ return; -+ } -+ -+ if (last_cycle_ts == 0) { -+ last_cycle_ts = sys_now(); -+ } -+ -+ uint64_t now_pkts = get_protocol_stack()->stats.rx; -+ uint32_t now_ts = sys_now(); -+ if (((now_ts - last_cycle_ts) > LSTACK_LPM_DETECT_MS) || -+ ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) { -+ if ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT) { -+ stack->low_power = true; -+ } else { -+ stack->low_power = false; -+ } -+ -+ last_cycle_ts = now_ts; -+ last_cycle_pkts = now_pkts; -+ } -+ -+ if (stack->low_power) { -+ nanosleep(&st, &st); -+ } -+} -+ -+static int32_t create_thread(uint16_t queue_id, char *thread_name, stack_thread_func func) -+{ -+ /* thread may run slow, if arg is temp var maybe have relese */ -+ static uint16_t queue[PROTOCOL_STACK_MAX]; -+ char name[PATH_MAX]; -+ pthread_t tid; -+ int32_t ret; -+ -+ if (queue_id >= PROTOCOL_STACK_MAX) { -+ LSTACK_LOG(ERR, LSTACK, "queue_id is %hu exceed max=%d\n", queue_id, PROTOCOL_STACK_MAX); -+ return -1; -+ } -+ queue[queue_id] = queue_id; -+ -+ ret = sprintf_s(name, sizeof(name), "%s%02hu", thread_name, queue[queue_id]); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, LSTACK, "set name failed\n"); -+ return -1; -+ } -+ -+ ret = pthread_create(&tid, NULL, func, &queue[queue_id]); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "pthread_create ret=%d\n", ret); -+ return -1; -+ } -+ -+ ret = pthread_setname_np(tid, name); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "pthread_setname_np name=%s ret=%d errno=%d\n", name, ret, errno); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static void* gazelle_wakeup_thread(void *arg) -+{ -+ uint16_t queue_id = *(uint16_t *)arg; -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -+ -+ struct cfg_params *cfg = get_global_cfg_params(); -+ int32_t lcore_id = cfg->wakeup[stack->queue_id]; -+ thread_affinity_init(lcore_id); -+ -+ struct timespec st = { -+ .tv_sec = 0, -+ .tv_nsec = 1 -+ }; -+ -+ LSTACK_LOG(INFO, LSTACK, "weakup_%02hu start\n", stack->queue_id); -+ -+ for (;;) { -+ if (cfg->low_power_mod != 0 && stack->low_power) { -+ nanosleep(&st, &st); -+ } -+ -+ sem_t *event_sem[WAKEUP_MAX_NUM]; -+ uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -+ for (uint32_t i = 0; i < num; i++) { -+ sem_post(event_sem[i]); -+ } -+ } -+ -+ return NULL; -+} -+ -+static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); -+ -+ set_stack_idx(queue_id); -+ stack->tid = rte_gettid(); -+ stack->queue_id = queue_id; -+ stack->port_id = stack_group->port_id; -+ stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; -+ stack->lwip_stats = &lwip_stats; -+ -+ init_list_node(&stack->recv_list); -+ init_list_node(&stack->send_list); -+ -+ sys_calibrate_tsc(); -+ stack_stat_init(); -+ -+ stack_group->stacks[queue_id] = stack; -+ -+ cpu_set_t cpuset; -+ CPU_ZERO(&cpuset); -+ CPU_SET(stack->cpu_id, &cpuset); -+ if (rte_thread_set_affinity(&cpuset) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -+ return -1; -+ } -+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -+ -+ stack->socket_id = numa_node_of_cpu(stack->cpu_id); -+ if (stack->socket_id < 0) { -+ LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n"); -+ return -1; -+ } -+ -+ if (pktmbuf_pool_init(stack, stack_group->stack_num) != 0) { -+ return -1; -+ } -+ -+ if (create_shared_ring(stack) != 0) { -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static void* gazelle_kernel_event(void *arg) -+{ -+ uint16_t queue_id = *(uint16_t *)arg; -+ -+ int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); -+ if (epoll_fd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "queue_id=%d epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -+ /* exit in main thread, avoid create mempool and exit at the same time */ -+ set_init_fail(); -+ sem_post(&get_protocol_stack_group()->all_init); -+ return NULL; -+ } -+ -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -+ stack->epollfd = epoll_fd; -+ -+ sem_post(&get_protocol_stack_group()->all_init); -+ LSTACK_LOG(INFO, LSTACK, "kernel_event_%02hu start\n", stack->queue_id); -+ -+ struct epoll_event events[KERNEL_EPOLL_MAX]; -+ for (;;) { -+ int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1); -+ if (event_num <= 0) { -+ continue; -+ } -+ -+ for (int32_t i = 0; i < event_num; i++) { -+ struct wakeup_poll *wakeup = events[i].data.ptr; -+ if (wakeup) { -+ __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE); -+ sem_post(&wakeup->event_sem); -+ } -+ } -+ } -+ -+ return NULL; -+} -+ -+static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack) -+{ -+ int32_t ret; -+ -+ if (stack_group->wakeup_enable) { -+ ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); -+ return ret; -+ } -+ } -+ -+ ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -+ } -+ return ret; -+} -+ -+void wait_sem_value(sem_t *sem, int32_t wait_value) -+{ -+ int32_t sem_val; -+ do { -+ sem_getvalue(sem, &sem_val); -+ } while (sem_val < wait_value); -+} -+ -+static struct protocol_stack * stack_thread_init(uint16_t queue_id) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ struct protocol_stack *stack = malloc(sizeof(*stack)); -+ if (stack == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); -+ return NULL; -+ } -+ -+ if (init_stack_value(stack, queue_id) != 0) { -+ free(stack); -+ return NULL; -+ } -+ -+ thread_affinity_init(stack->cpu_id); -+ -+ hugepage_init(); -+ -+ tcpip_init(NULL, NULL); -+ -+ if (use_ltran()) { -+ if (client_reg_thrd_ring() != 0) { -+ free(stack); -+ return NULL; -+ } -+ } -+ -+ sem_post(&stack_group->thread_phase1); -+ -+ if (!use_ltran()) { -+ wait_sem_value(&stack_group->ethdev_init, 1); -+ } -+ -+ if (ethdev_init(stack) != 0) { -+ free(stack); -+ return NULL; -+ } -+ -+ if (create_companion_thread(stack_group, stack) != 0) { -+ free(stack); -+ return NULL; -+ } -+ -+ return stack; -+} -+ -+static void* gazelle_stack_thread(void *arg) -+{ -+ uint16_t queue_id = *(uint16_t *)arg; -+ -+ struct protocol_stack *stack = stack_thread_init(queue_id); -+ if (stack == NULL) { -+ /* exit in main thread, avoid create mempool and exit at the same time */ -+ set_init_fail(); -+ sem_post(&get_protocol_stack_group()->all_init); -+ LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%hu\n", queue_id); -+ return NULL; -+ } -+ -+ sem_post(&get_protocol_stack_group()->all_init); -+ LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); -+ -+ for (;;) { -+ poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); -+ -+ eth_dev_poll(); -+ -+ read_recv_list(stack, READ_LIST_MAX); -+ -+ send_stack_list(stack, SEND_LIST_MAX); -+ -+ sys_timer_run(); -+ -+ if (get_global_cfg_params()->low_power_mod != 0) { -+ low_power_idling(stack); -+ } -+ } -+ -+ return NULL; -+} -+ -+static int32_t init_protocol_sem(void) -+{ -+ int32_t ret; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ -+ pthread_spin_init(&stack_group->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -+ -+ if (!use_ltran()) { -+ ret = sem_init(&stack_group->ethdev_init, 0, 0); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -+ return -1; -+ } -+ } -+ -+ ret = sem_init(&stack_group->thread_phase1, 0, 0); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -+ return -1; -+ } -+ -+ ret = sem_init(&stack_group->all_init, 0, 0); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+int32_t init_protocol_stack(void) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ int32_t ret; -+ -+ stack_group->stack_num = get_global_cfg_params()->num_cpu; -+ stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ stack_group->wakeup_list = NULL; -+ -+ if (init_protocol_sem() != 0) { -+ return -1; -+ } -+ -+ for (uint32_t i = 0; i < stack_group->stack_num; i++) { -+ ret = create_thread(i, "gazellestack", gazelle_stack_thread); -+ if (ret != 0) { -+ return ret; -+ } -+ } -+ -+ wait_sem_value(&stack_group->thread_phase1, stack_group->stack_num); -+ -+ ret = init_stack_numa_cpuset(); -+ if (ret < 0) { -+ return -1; -+ } -+ -+ return 0; -+} -+ -+void stack_arp(struct rpc_msg *msg) -+{ -+ struct rte_mbuf *mbuf = (struct rte_mbuf *)msg->args[MSG_ARG_0].p; -+ -+ eth_dev_recv(mbuf); -+} -+ -+void stack_socket(struct rpc_msg *msg) -+{ -+ msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); -+ if (msg->result < 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); -+ } -+} -+ -+void stack_close(struct rpc_msg *msg) -+{ -+ int32_t fd = msg->args[MSG_ARG_0].i; -+ -+ msg->result = lwip_close(fd); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+ -+ gazelle_clean_sock(fd); -+ -+ posix_api->close_fn(fd); -+} -+ -+void stack_bind(struct rpc_msg *msg) -+{ -+ msg->result = lwip_bind(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].socklen); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_listen(struct rpc_msg *msg) -+{ -+ int32_t fd = msg->args[MSG_ARG_0].i; -+ int32_t backlog = msg->args[MSG_ARG_1].i; -+ -+ struct lwip_sock *sock = get_socket_by_fd(fd); -+ if (sock == NULL) { -+ msg->result = -1; -+ return; -+ } -+ -+ /* new listen add to stack listen list */ -+ msg->result = lwip_listen(fd, backlog); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_accept(struct rpc_msg *msg) -+{ -+ int32_t fd = msg->args[MSG_ARG_0].i; -+ msg->result = -1; -+ -+ int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -+ if (accept_fd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -+ return; -+ } -+ -+ struct lwip_sock *sock = get_socket(accept_fd); -+ if (sock == NULL || sock->stack == NULL) { -+ lwip_close(accept_fd); -+ gazelle_clean_sock(accept_fd); -+ posix_api->close_fn(accept_fd); -+ LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -+ return; -+ } -+ -+ msg->result = accept_fd; -+ if (rte_ring_count(sock->conn->recvmbox->ring)) { -+ add_recv_list(accept_fd); -+ } -+} -+ -+void stack_connect(struct rpc_msg *msg) -+{ -+ msg->result = lwip_connect(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].socklen); -+ if (msg->result < 0) { -+ msg->result = -errno; -+ } -+} -+ -+void stack_getpeername(struct rpc_msg *msg) -+{ -+ msg->result = lwip_getpeername(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_getsockname(struct rpc_msg *msg) -+{ -+ msg->result = lwip_getsockname(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_getsockopt(struct rpc_msg *msg) -+{ -+ msg->result = lwip_getsockopt(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i, -+ msg->args[MSG_ARG_3].p, msg->args[MSG_ARG_4].p); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_setsockopt(struct rpc_msg *msg) -+{ -+ msg->result = lwip_setsockopt(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i, -+ msg->args[MSG_ARG_3].cp, msg->args[MSG_ARG_4].socklen); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_fcntl(struct rpc_msg *msg) -+{ -+ msg->result = lwip_fcntl(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].l); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_ioctl(struct rpc_msg *msg) -+{ -+ msg->result = lwip_ioctl(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].l, msg->args[MSG_ARG_2].p); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_recv(struct rpc_msg *msg) -+{ -+ msg->result = lwip_recv(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].size, -+ msg->args[MSG_ARG_3].i); -+} -+ -+void stack_sendmsg(struct rpc_msg *msg) -+{ -+ msg->result = lwip_sendmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].i); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+void stack_recvmsg(struct rpc_msg *msg) -+{ -+ msg->result = lwip_recvmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].i); -+ if (msg->result != 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -+ } -+} -+ -+/* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */ -+void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ struct rte_mbuf *mbuf_copy = NULL; -+ struct protocol_stack *stack = NULL; -+ int32_t ret; -+ -+ for (int32_t i = 0; i < stack_group->stack_num; i++) { -+ stack = stack_group->stacks[i]; -+ if (cur_stack == stack) { -+ continue; -+ } -+ -+ ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); -+ if (ret != 0) { -+ stack->stats.rx_allocmbuf_fail++; -+ return; -+ } -+ copy_mbuf(mbuf_copy, mbuf); -+ -+ ret = rpc_call_arp(stack, mbuf_copy); -+ if (ret != 0) { -+ return; -+ } -+ } -+} -+ -+/* when fd is listenfd, listenfd of all protocol stack thread will be closed */ -+int32_t stack_broadcast_close(int32_t fd) -+{ -+ struct lwip_sock *sock = get_socket(fd); -+ int32_t ret = 0; -+ -+ do { -+ sock = sock->listen_next; -+ if (rpc_call_close(fd)) { -+ ret = -1; -+ } -+ -+ if (sock == NULL) { -+ break; -+ } -+ fd = sock->conn->socket; -+ } while (sock); -+ -+ return ret; -+} -+ -+/* choice one stack listen */ -+int32_t stack_single_listen(int32_t fd, int32_t backlog) -+{ -+ return rpc_call_listen(fd, backlog); -+} -+ -+/* listen sync to all protocol stack thread, so that any protocol stack thread can build connect */ -+int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) -+{ -+ struct protocol_stack *cur_stack = get_protocol_stack_by_fd(fd); -+ struct protocol_stack *stack = NULL; -+ struct sockaddr addr; -+ socklen_t addr_len = sizeof(addr); -+ int32_t ret, clone_fd; -+ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, %d get sock null\n", get_stack_tid(), fd); -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ ret = rpc_call_getsockname(fd, &addr, &addr_len); -+ if (ret != 0) { -+ return ret; -+ } -+ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ for (int32_t i = 0; i < stack_group->stack_num; ++i) { -+ stack = stack_group->stacks[i]; -+ if (stack != cur_stack) { -+ clone_fd = rpc_call_shadow_fd(stack, fd, &addr, sizeof(addr)); -+ if (clone_fd < 0) { -+ stack_broadcast_close(fd); -+ return clone_fd; -+ } -+ } else { -+ clone_fd = fd; -+ } -+ -+ ret = rpc_call_listen(clone_fd, backlog); -+ if (ret < 0) { -+ stack_broadcast_close(fd); -+ return ret; -+ } -+ } -+ return 0; -+} -+ -+static struct lwip_sock *get_min_accept_sock(int32_t fd) -+{ -+ struct lwip_sock *sock = get_socket(fd); -+ struct lwip_sock *min_sock = NULL; -+ -+ while (sock) { -+ if (!NETCONN_IS_ACCEPTIN(sock)) { -+ sock = sock->listen_next; -+ continue; -+ } -+ -+ if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) { -+ min_sock = sock; -+ } -+ -+ sock = sock->listen_next; -+ } -+ -+ return min_sock; -+} -+ -+static void inline del_accept_in_event(struct lwip_sock *sock) -+{ -+ pthread_spin_lock(&sock->wakeup->event_list_lock); -+ -+ if (!NETCONN_IS_ACCEPTIN(sock)) { -+ sock->events &= ~EPOLLIN; -+ if (sock->events == 0) { -+ list_del_node_null(&sock->event_list); -+ } -+ } -+ -+ pthread_spin_unlock(&sock->wakeup->event_list_lock); -+} -+ -+/* ergodic the protocol stack thread to find the connection, because all threads are listening */ -+int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) -+{ -+ int32_t ret = -1; -+ -+ struct lwip_sock *sock = get_socket(fd); -+ if (sock == NULL) { -+ errno = EINVAL; -+ return -1; -+ } -+ -+ struct lwip_sock *min_sock = get_min_accept_sock(fd); -+ if (min_sock && min_sock->conn) { -+ ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen); -+ } -+ -+ if (min_sock && min_sock->wakeup && min_sock->wakeup->type == WAKEUP_EPOLL) { -+ del_accept_in_event(min_sock); -+ } -+ -+ if (ret < 0) { -+ errno = EAGAIN; -+ } -+ return ret; -+} -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 06fac5c..ca7ce52 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -24,6 +24,7 @@ - #include "dpdk_common.h" - #include "gazelle_dfx_msg.h" - #include "lstack_thread_rpc.h" -+#include "lstack_protocol_stack.h" - #include "lstack_stack_stat.h" - #include "posix/lstack_epoll.h" - -@@ -81,7 +82,10 @@ static void set_latency_start_flag(bool start) - - for (uint32_t i = 0; i < stack_group->stack_num; i++) { - struct protocol_stack *stack = stack_group->stacks[i]; -- memset_s(&stack->latency, sizeof(struct gazelle_stack_latency), 0, sizeof(stack->latency)); -+ int32_t ret = memset_s(&stack->latency, sizeof(struct gazelle_stack_latency), 0, sizeof(stack->latency)); -+ if (ret != 0) { -+ LSTACK_LOG(ERR, LSTACK, "memset_s faile\n"); -+ } - stack->latency.start_time = get_current_time(); - stack->latency.lwip_latency.latency_min = ~((uint64_t)0); - stack->latency.read_latency.latency_min = ~((uint64_t)0); -@@ -109,7 +113,7 @@ void unregister_wakeup(struct wakeup_poll *wakeup) - struct wakeup_poll *node = stack_group->wakeup_list; - struct wakeup_poll *pre = NULL; - -- while(node && node != wakeup) { -+ while (node && node != wakeup) { - pre = node; - node = node->next; - } -@@ -168,9 +172,12 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - - lstack_get_low_power_info(&dfx->low_power_info); - -- memcpy_s(&dfx->data.pkts.stack_stat, sizeof(struct gazelle_stack_stat), &stack->stats, -- sizeof(struct gazelle_stack_stat)); -- -+ int32_t ret = memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); -+ if (ret != EOK) { -+ LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret); -+ return; -+ } -+ - get_wakeup_stat(stack, &dfx->data.pkts.wakeup_stat); - - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; -@@ -191,6 +198,7 @@ static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protoc - enum GAZELLE_STAT_MODE stat_mode) - { - int32_t rpc_call_result; -+ int32_t ret; - - switch (stat_mode) { - case GAZELLE_STAT_LSTACK_SHOW: -@@ -198,8 +206,11 @@ static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protoc - get_stack_stats(dfx, stack); - break; - case GAZELLE_STAT_LSTACK_SHOW_SNMP: -- memcpy_s(&dfx->data.snmp, sizeof(dfx->data.snmp), &stack->lwip_stats->mib2, -+ ret = memcpy_s(&dfx->data.snmp, sizeof(dfx->data.snmp), &stack->lwip_stats->mib2, - sizeof(stack->lwip_stats->mib2)); -+ if (ret != EOK) { -+ LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret); -+ } - break; - case GAZELLE_STAT_LSTACK_SHOW_CONN: - rpc_call_result = rpc_call_conntable(stack, dfx->data.conn.conn_list, GAZELLE_LSTACK_MAX_CONN); -@@ -208,7 +219,10 @@ static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protoc - dfx->data.conn.total_conn_num = (rpc_call_result < 0) ? 0 : rpc_call_result; - break; - case GAZELLE_STAT_LSTACK_SHOW_LATENCY: -- memcpy_s(&dfx->data.latency, sizeof(dfx->data.latency), &stack->latency, sizeof(stack->latency)); -+ ret = memcpy_s(&dfx->data.latency, sizeof(dfx->data.latency), &stack->latency, sizeof(stack->latency)); -+ if (ret != EOK) { -+ LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret); -+ } - break; - case GAZELLE_STAT_LTRAN_START_LATENCY: - set_latency_start_flag(true); -@@ -248,8 +262,6 @@ int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode) - - for (uint32_t i = 0; i < stack_group->stack_num; i++) { - struct protocol_stack *stack = stack_group->stacks[i]; -- -- memset_s(&dfx, sizeof(dfx), 0, sizeof(dfx)); - get_stack_dfx_data(&dfx, stack, stat_mode); - - if (!use_ltran() && -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 8937920..58c4b05 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -45,8 +45,7 @@ static inline __attribute__((always_inline)) struct rpc_msg *get_rpc_msg(struct - return &rpc_pool->msgs[prod]; - } - --static inline __attribute__((always_inline)) --struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) -+static struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - { - struct rpc_msg *msg = NULL; - -@@ -76,8 +75,7 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) - return msg; - } - --static inline __attribute__((always_inline)) --void rpc_msg_free(struct rpc_msg *msg) -+static inline __attribute__((always_inline)) void rpc_msg_free(struct rpc_msg *msg) - { - pthread_spin_destroy(&msg->lock); - -@@ -87,15 +85,13 @@ void rpc_msg_free(struct rpc_msg *msg) - atomic_fetch_add(&msg->pool->cons, 1); - } - --static inline __attribute__((always_inline)) --void rpc_call(lockless_queue *queue, struct rpc_msg *msg) -+static inline __attribute__((always_inline)) void rpc_call(lockless_queue *queue, struct rpc_msg *msg) - { - pthread_spin_trylock(&msg->lock); - lockless_queue_mpsc_push(queue, &msg->queue_node); - } - --static inline __attribute__((always_inline)) --int32_t rpc_sync_call(lockless_queue *queue, struct rpc_msg *msg) -+static inline __attribute__((always_inline)) int32_t rpc_sync_call(lockless_queue *queue, struct rpc_msg *msg) - { - int32_t ret; - -@@ -430,12 +426,12 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - return rpc_sync_call(&stack->rpc_queue, msg); - } - --ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) -+void rpc_call_send(int fd, const void *buf, size_t len, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send); - if (msg == NULL) { -- return -1; -+ return; - } - - msg->args[MSG_ARG_0].i = fd; -@@ -444,8 +440,6 @@ ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - - msg->self_release = 0; - rpc_call(&stack->rpc_queue, msg); -- -- return 0; - } - - int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index aeffbb3..1a6ef39 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -14,10 +14,10 @@ - #define _GAZELLE_NET_CFG_H_ - #include - --#include -- - #include - -+#include "gazelle_opt.h" -+ - #define BASE_BIN_SCALE 2 - #define BASE_OCT_SCALE 8 - #define BASE_DEC_SCALE 10 -@@ -61,7 +61,7 @@ struct cfg_params { - ip4_addr_t host_addr; - ip4_addr_t netmask; - ip4_addr_t gateway_addr; -- struct rte_ether_addr ethdev; -+ uint8_t mac_addr[ETHER_ADDR_LEN]; - uint16_t num_cpu; - uint32_t cpus[CFG_MAX_CPUS]; - uint16_t num_wakeup; -diff --git a/src/lstack/include/lstack_compiler.h b/src/lstack/include/lstack_compiler.h -deleted file mode 100644 -index c4880a5..0000000 ---- a/src/lstack/include/lstack_compiler.h -+++ /dev/null -@@ -1,46 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef _GAZELLE_COMPILER_H_ --#define _GAZELLE_COMPILER_H_ -- --#ifdef __GNUC__ -- --#ifndef likely --#define likely(x) __builtin_expect(!!(x), 1) --#endif -- --#ifndef unlikely --#define unlikely(x) __builtin_expect(!!(x), 0) --#endif -- --#ifndef __clz__ --#define __clz__(x) __builtin_clz(x) --#endif -- --#else // __GNUC__ -- --#define likely(x) (x) --#define unlikely(x) (x) -- --#ifndef __clz__ --#error "You have to provide __clz__ to return the number "\ --"of leading 0-bits in x, starting at the most signification bit position." --#endif -- --#endif // __GNUC__ -- --#ifndef ACCESS_ONCE --#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) --#endif -- --#endif /* GAZELLE_COMPILER_H */ -diff --git a/src/lstack/include/lstack_control_plane.h b/src/lstack/include/lstack_control_plane.h -index 1fa84e6..d631ea6 100644 ---- a/src/lstack/include/lstack_control_plane.h -+++ b/src/lstack/include/lstack_control_plane.h -@@ -13,8 +13,6 @@ - #ifndef _GAZELLE_CONTROL_PLANE_H_ - #define _GAZELLE_CONTROL_PLANE_H_ - --#include "lstack_thread_rpc.h" -- - #define CONTROL_THREAD_NAME "control_thread" - - enum vdev_request { -@@ -25,6 +23,7 @@ enum vdev_request { - VDEV_NONE, - }; - -+struct rpc_msg; - int client_reg_thrd_ring(void); - int32_t control_init_client(bool is_reconnect); - void control_client_thread(void *arg); -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 6ffcc41..f0bf4a1 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -13,15 +13,7 @@ - #ifndef _GAZELLE_DPDK_H_ - #define _GAZELLE_DPDK_H_ - --#include --#include -- --#include --#include "lstack_lockless_queue.h" --#include "lstack_vdev.h" --#include "gazelle_reg_msg.h" --#include "dpdk_common.h" --struct protocol_stack; -+#include "gazelle_opt.h" - - #define RX_NB_MBUF ((5 * MAX_CLIENTS) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) - #define RX_MBUF_CACHE_SZ (VDEV_RX_QUEUE_SZ) -@@ -42,21 +34,12 @@ struct protocol_stack; - #define CALL_MSG_RING_SIZE (unsigned long long)32 - #define CALL_CACHE_SZ 0 - --/* Layout: -- * | rte_mbuf | pbuf | custom_free_function | payload | -- **/ --static inline struct rte_mbuf *pbuf_to_mbuf(const struct pbuf *p) --{ -- return ((struct rte_mbuf *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE)); --} --static inline struct pbuf_custom *mbuf_to_pbuf(const struct rte_mbuf *m) --{ -- return ((struct pbuf_custom *)((uint8_t *)(m) + sizeof(struct rte_mbuf) + GAZELLE_MBUFF_PRIV_SIZE)); --} -- - int thread_affinity_default(void); - int thread_affinity_init(int cpu_id); - -+struct protocol_stack; -+struct rte_mempool; -+struct rte_ring; - int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num); - int32_t dpdk_eal_init(void); - int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num); -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index 0e8400f..91f5f13 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -13,17 +13,8 @@ - #ifndef __GAZELLE_ETHDEV_H__ - #define __GAZELLE_ETHDEV_H__ - --#include --#include -- --#include "gazelle_dfx_msg.h" --#include "lstack_protocol_stack.h" -- --#define RTE_TEST_TX_DESC_DEFAULT 512 --#define RTE_TEST_RX_DESC_DEFAULT 128 -- --#define DPDK_PKT_BURST_SIZE 512 -- -+struct protocol_stack; -+struct rte_mbuf; - struct eth_dev_ops { - uint32_t (*rx_poll)(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t max_mbuf); - uint32_t (*tx_xmit)(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts); -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index ba57541..c62e99d 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -13,16 +13,15 @@ - #ifndef __GAZELLE_LWIP_H__ - #define __GAZELLE_LWIP_H__ - --#include "lstack_thread_rpc.h" --#include "dpdk_common.h" --#include "lwipsock.h" -- -- - #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) - #define NETCONN_IS_DATAIN(sock) ((gazelle_ring_readable_count((sock)->recv_ring) || (sock)->recv_lastdata)) - #define NETCONN_IS_DATAOUT(sock) gazelle_ring_readover_count((sock)->send_ring) - #define NETCONN_IS_OUTIDLE(sock) gazelle_ring_readable_count((sock)->send_ring) - -+struct lwip_sock; -+struct rte_mempool; -+struct rpc_msg; -+struct rte_mbuf; - void create_shadow_fd(struct rpc_msg *msg); - void gazelle_init_sock(int32_t fd); - int32_t gazelle_socket(int domain, int type, int protocol); -@@ -30,7 +29,7 @@ void gazelle_clean_sock(int32_t fd); - struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags); - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len); - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); --ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags); -+ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, uint8_t apiflags); - void read_recv_list(struct protocol_stack *stack, uint32_t max_num); - void send_stack_list(struct protocol_stack *stack, uint32_t send_max); - void add_recv_list(int32_t fd); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 0faeccf..39d29d7 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -14,13 +14,13 @@ - #define __GAZELLE_PROTOCOL_STACK_H__ - - #include -+ - #include - #include --#include --#include "dpdk_common.h" --#include "lstack_thread_rpc.h" -+ - #include "gazelle_dfx_msg.h" - #include "lstack_lockless_queue.h" -+#include "gazelle_opt.h" - - #define SOCK_RECV_RING_SIZE (128) - #define SOCK_RECV_FREE_THRES (32) -@@ -28,6 +28,10 @@ - #define SOCK_SEND_REPLENISH_THRES (16) - #define WAKEUP_MAX_NUM (32) - -+struct rte_mempool; -+struct rte_ring; -+struct rte_mbuf; -+ - struct protocol_stack { - uint32_t tid; - uint16_t queue_id; -@@ -64,7 +68,6 @@ struct protocol_stack { - }; - - struct eth_params; --#define PROTOCOL_STACK_MAX 32 - struct protocol_stack_group { - uint16_t stack_num; - uint16_t port_id; -@@ -92,7 +95,7 @@ struct protocol_stack *get_bind_protocol_stack(void); - struct protocol_stack_group *get_protocol_stack_group(void); - - int32_t init_protocol_stack(void); --int32_t bind_to_stack_numa(struct protocol_stack *stack); -+void bind_to_stack_numa(struct protocol_stack *stack); - int32_t init_dpdk_ethdev(void); - - void wait_sem_value(sem_t *sem, int32_t wait_value); -diff --git a/src/lstack/include/lstack_signal.h b/src/lstack/include/lstack_signal.h -deleted file mode 100644 -index 2541a37..0000000 ---- a/src/lstack/include/lstack_signal.h -+++ /dev/null -@@ -1,17 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef _GAZELLE_SIGNAL_ --#define _GAZELLE_SIGNAL_ -- --void lstack_signal_init(void); --#endif // _GAZELLE_SIGNAL_ -diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h -index e152fe6..aacade1 100644 ---- a/src/lstack/include/lstack_stack_stat.h -+++ b/src/lstack/include/lstack_stack_stat.h -@@ -13,10 +13,12 @@ - #ifndef GAZELLE_STACK_STAT_H - #define GAZELLE_STACK_STAT_H - --#include --#include --#include --#include "gazelle_dfx_msg.h" -+struct gazelle_stack_latency; -+struct pbuf; -+struct gazelle_stat_low_power_info; -+struct wakeup_poll; -+enum GAZELLE_LATENCY_TYPE; -+enum GAZELLE_STAT_MODE; - - void calculate_lstack_latency(struct gazelle_stack_latency *stack_latency, const struct pbuf *pbuf, - enum GAZELLE_LATENCY_TYPE type); -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 35e6b1e..3732167 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -16,7 +16,6 @@ - #include - #include - --#include "lstack_dpdk.h" - #include "lstack_lockless_queue.h" - - #define MSG_ARG_0 (0) -@@ -50,6 +49,7 @@ struct rpc_msg { - }; - - struct protocol_stack; -+struct rte_mbuf; - void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); -@@ -66,7 +66,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen - int32_t rpc_call_listen(int s, int backlog); - int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen); --ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags); -+void rpc_call_send(int fd, const void *buf, size_t len, int flags); - int32_t rpc_call_sendmsg(int fd, const struct msghdr *msg, int flags); - int32_t rpc_call_recvmsg(int fd, struct msghdr *msg, int flags); - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen); -diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h -index 31a997d..5836257 100644 ---- a/src/lstack/include/lstack_vdev.h -+++ b/src/lstack/include/lstack_vdev.h -@@ -13,23 +13,9 @@ - #ifndef _GAZELLE_VDEV_H_ - #define _GAZELLE_VDEV_H_ - --#include "lstack_ethdev.h" --#include "gazelle_reg_msg.h" -- --#define DEFAULT_RING_SIZE (512) --#define DEFAULT_BACKUP_RING_SIZE_FACTOR (16) -- --#define VDEV_RX_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_EVENT_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_REG_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_CALL_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_WAKEUP_QUEUE_SZ (DEFAULT_RING_SIZE) --#define VDEV_IDLE_QUEUE_SZ (DEFAULT_RING_SIZE) -- --#define VDEV_TX_QUEUE_SZ (DEFAULT_RING_SIZE) --#define FREE_RX_QUEUE_SZ (DPDK_PKT_BURST_SIZE) -- - struct eth_dev_ops; -+struct gazelle_quintuple; -+enum reg_ring_type; - void vdev_dev_ops_init(struct eth_dev_ops **dev_ops); - int vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple); - -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index e9f9b91..a94b49f 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -13,22 +13,26 @@ - #ifndef _GAZELLE_EPOLL_H_ - #define _GAZELLE_EPOLL_H_ - --#ifdef __cplusplus --extern "C" { --#endif -- - #include - #include - #include - #include --#include - --#include "lstack_protocol_stack.h" -+#include -+ -+#include "gazelle_dfx_msg.h" -+#include "gazelle_opt.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif - - enum wakeup_type { - WAKEUP_EPOLL = 0, - WAKEUP_POLL, - }; -+ -+struct protocol_stack; - struct wakeup_poll { - /* stack thread read frequently */ - sem_t event_sem __rte_cache_aligned; -@@ -55,6 +59,8 @@ struct wakeup_poll { - pthread_spinlock_t event_list_lock; - }; - -+struct netconn; -+void add_epoll_event(struct netconn *conn, uint32_t event); - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event *events, int32_t maxevents, int32_t timeout); -diff --git a/src/lstack/include/posix/lstack_fcntl.h b/src/lstack/include/posix/lstack_fcntl.h -deleted file mode 100644 -index d1087a6..0000000 ---- a/src/lstack/include/posix/lstack_fcntl.h -+++ /dev/null -@@ -1,28 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef _GAZELLE_FCNTL_H_ --#define _GAZELLE_FCNTL_H_ -- --#ifdef __cplusplus --extern "C" { --#endif -- --int lwip_fcntl(int s, int cmd, int val); --int lwip_ioctl(int s, int cmd, ...); -- --#ifdef __cplusplus --} --#endif -- --#endif /* _GAZELLE_FCNTL_H_ */ -- -diff --git a/src/lstack/include/posix/lstack_fork.h b/src/lstack/include/posix/lstack_fork.h -deleted file mode 100644 -index 939534a..0000000 ---- a/src/lstack/include/posix/lstack_fork.h -+++ /dev/null -@@ -1,17 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef _GAZELLE_FORK_ --#define _GAZELLE_FORK_ -- --pid_t lstack_fork(void); --#endif // _GAZELLE_FORK_ -diff --git a/src/lstack/include/posix/lstack_socket.h b/src/lstack/include/posix/lstack_socket.h -index 776a6ab..a3ce1eb 100644 ---- a/src/lstack/include/posix/lstack_socket.h -+++ b/src/lstack/include/posix/lstack_socket.h -@@ -36,6 +36,9 @@ ssize_t lwip_read(int s, void *mem, size_t len); - ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags, void *from, void *fromlen); - ssize_t lwip_recv(int s, void *mem, size_t len, int flags); - -+int lwip_fcntl(int s, int cmd, int val); -+int lwip_ioctl(int s, int cmd, ...); -+ - #ifdef __cplusplus - } - #endif -diff --git a/src/lstack/include/posix/lstack_unistd.h b/src/lstack/include/posix/lstack_unistd.h -index cdd46c9..484a792 100644 ---- a/src/lstack/include/posix/lstack_unistd.h -+++ b/src/lstack/include/posix/lstack_unistd.h -@@ -13,11 +13,12 @@ - #ifndef _GAZELLE_UNISTD_H_ - #define _GAZELLE_UNISTD_H_ - --#include "lstack_fork.h" - #ifdef __cplusplus - extern "C" { - #endif - -+pid_t lstack_fork(void); -+void lstack_signal_init(void); - int lstack_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - - #ifdef __cplusplus -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index fdca602..b53068d 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -14,6 +14,7 @@ use_ltran=1 - kni_switch=0 - - low_power_mode=0 -+listen_shadow=0 - - num_cpus="2" - num_wakeup="3" -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 0f30d76..28bf32d 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -25,6 +25,8 @@ - #include "lstack_log.h" - #include "lstack_dpdk.h" - #include "lstack_lwip.h" -+#include "dpdk_common.h" -+#include "lstack_protocol_stack.h" - #include "lstack_ethdev.h" - - #define PKTMBUF_MALLOC_FLAG NULL -@@ -153,13 +155,13 @@ static err_t eth_dev_init(struct netif *netif) - netif->linkoutput = eth_dev_output; - - int32_t ret; -- ret = memcpy_s(netif->hwaddr, sizeof(netif->hwaddr), cfg->ethdev.addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = memcpy_s(netif->hwaddr, sizeof(netif->hwaddr), cfg->mac_addr, ETHER_ADDR_LEN); - if (ret != EOK) { - LSTACK_LOG(ERR, LSTACK, "memcpy_s fail ret=%d\n", ret); - return ERR_MEM; - } - -- netif->hwaddr_len = RTE_ETHER_ADDR_LEN; -+ netif->hwaddr_len = ETHER_ADDR_LEN; - - return ERR_OK; - } -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 287ac8f..31c1843 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -10,21 +10,23 @@ - * See the Mulan PSL v2 for more details. - */ - -+#include - #include - #include - #include -- -+#include - #include - #include - #include - --#include -- - #include "lstack_cfg.h" - #include "lstack_dpdk.h" - #include "lstack_ethdev.h" - #include "lstack_control_plane.h" - #include "lstack_log.h" -+#include "dpdk_common.h" -+#include "lstack_protocol_stack.h" -+#include "gazelle_reg_msg.h" - #include "lstack_lwip.h" - #include "lstack_vdev.h" - -diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h -index 4663257..41d4cfb 100644 ---- a/src/ltran/ltran_base.h -+++ b/src/ltran/ltran_base.h -@@ -13,61 +13,29 @@ - #ifndef __GAZELLE_BASE_H__ - #define __GAZELLE_BASE_H__ - --#include --#include --#include --#include -- --#include - #include --#include -- --#include "ltran_opt.h" --#include "ltran_errno.h" --#include "gazelle_dfx_msg.h" -- --#define GAZELLE_OK 0 --#define GAZELLE_ERR (-1) --#define GAZELLE_QUIT 1 -- --#define GAZELLE_ON 1 --#define GAZELLE_OFF 0 - --#define GAZELLE_TRUE 1 --#define GAZELLE_FALSE 0 -+#include "gazelle_opt.h" - -- --#define GAZELLE_CMD_BUFFER_SIZE _POSIX_ARG_MAX --#define GAZELLE_PATH_BUFFER_SIZE PATH_MAX -+#define GAZELLE_CMD_BUFFER_SIZE _POSIX_ARG_MAX -+#define GAZELLE_PATH_BUFFER_SIZE PATH_MAX - #define GAZELLE_PARAM_BUFFER_SIZE 32 - - #define GAZELLE_MAX_DPDK_ARGS_NUM 32 - #define GAZELLE_MAX_ADDR_NUM 1024 --#define GAZELLE_MAX_BOND_NUM 2 - #define GAZELLE_MAX_ETHERPORTS 32 - #define GAZELLE_MAX_NAME_LEN 256 - #define GAZELLE_MAX_RING_NAME_LEN 64 - #define GAZELLE_MAX_CMD_NUM 1024 --#define GAZELLE_MAX_PORT_NUM 16 - - #define GAZELLE_CLIENT_INFO_CHECKSUM_NUM 137 - - #define GAZELLE_MAX_INSTANCE_HTABLE_SIZE 256 --#define GAZELLE_MAX_INSTANCE_ARRAY_SIZE 32 --#define GAZELLE_MAX_INSTANCE_NUM 32 -- --#define GAZELLE_MAX_STACK_ARRAY_SIZE GAZELLE_CLIENT_NUM_MAX --#define GAZELLE_MAX_STACK_HTABLE_SIZE 32 --#define GAZELLE_MAX_STACK_NUM 128 -+#define GAZELLE_MAX_INSTANCE_ARRAY_SIZE GAZELLE_NULL_CLIENT - - #define GAZELLE_MAX_TCP_SOCK_ARRAY_SIZE 256 --#define GAZELLE_MAX_TCP_SOCK_HTABLE_SIZE 256 --#define GAZELLE_MAX_TCP_SOCK_NUM (GAZELLE_MAX_STACK_NUM * 32) - --#define GAZELLE_STACK_MAX_TCP_CON_NUM (1024*1024*1024) --#define GAZELLE_MAX_CONN_HTABLE_SIZE 2048 --/* same as define (MAX_CLIENTS + RESERVED_CLIENTS) in lwip/lwipopts.h */ --#define GAZELLE_MAX_CONN_NUM (GAZELLE_MAX_STACK_NUM * (20000 + 2000)) -+#define GAZELLE_STACK_MAX_TCP_CON_NUM (1024 * 1024 * 1024) - - #define GAZELLE_SUBNET_CHECK_OFFSET 20 - #define GAZELLE_SUBNET_LENGTH_MIN 1 -@@ -83,6 +51,42 @@ - #define GAZELLE_BOND_PORT_MASK_MAX 0xff - #define GAZELLE_BOND_PORT_DEFAULT 0xffff - -+#define PROGRAM_NAME "ltran" -+#define VER_FMT "gazelle version: %s\n" -+#define VER_NAME "1.0.0" -+ -+#define DEFAULT_LTRAN_CONF_PATH "/etc/gazelle/ltran.conf" -+ -+#define GAZELLE_MBUFS_RX_COUNT (300 * 1024) -+#define GAZELLE_MBUFS_TX_COUNT (30 * 1024) -+#define GAZELLE_MBUFS_CACHE_SIZE 512 -+ -+#define GAZELLE_RX_QUEUES 1 -+#define GAZELLE_TX_QUEUES 1 -+#define GAZELLE_RX_DESC_DEFAULT 512 -+#define GAZELLE_TX_DESC_DEFAULT 512 -+ -+#define GAZELLE_KNI_MAX_PACKET_SIZE 2048 -+#define GAZELLE_KNI_ETHERNET_HEADER_SIZE 14 -+#define GAZELLE_KNI_ETHERNET_FCS_SIZE 4 -+ -+#define GAZELLE_PKT_MBUF_RX_POOL_NAME_FMT "rx_pool%u" -+#define GAZELLE_PKT_MBUF_TX_POOL_NAME_FMT "tx_pool%u" -+#define GAZELLE_PKT_MBUF_POOL_NAME_LENGTH 64 -+ -+#define GAZELLE_BOND_NAME_LENGTH 64 -+#define GAZELLE_BOND_DEV_NAME_FMT "net_bonding%hu" -+#define GAZELLE_BOND_QUEUE_MIN 1 -+#define GAZELLE_BOND_QUEUE_MAX 64 -+ -+#define GAZELLE_CLIENT_RING_NAME_FMT "MProc_Client_%u_mbuf_queue" -+#define GAZELLE_CLIENT_DROP_RING_SIZE 20000 -+ -+#define GAZELLE_LTRAN_LOG_FILE "/var/run/gazelle/ltran.log" -+ -+// CONFIG OF DFX -+#define GAZELLE_DFX_REQ_INTERVAL_S 1 -+ - #define SEC_TO_USEC 1000000 - - #define GAZELLE_CONN_TIMEOUT 5 -@@ -92,8 +96,8 @@ - #define GAZELLE_TCP_CONN_SCAN_INTERVAL_MIN_S 0 - #define GAZELLE_TCP_CONN_SCAN_INTERVAL_MAX_S 86400 // 1 day 24*60*60 = 86400 - --#define GAZELLE_INET_ADDRSTRLEN 16 -+#define GAZELLE_INET_ADDRSTRLEN 16 - --#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock" -+#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock" - - #endif /* ifndef __GAZELLE_BASE_H__ */ -diff --git a/src/ltran/ltran_config.c b/src/ltran/ltran_config.c -index d9c1bd7..e9f06a1 100644 ---- a/src/ltran/ltran_config.c -+++ b/src/ltran/ltran_config.c -@@ -17,7 +17,8 @@ - #include - - #include "ltran_log.h" --#include "ltran_config.h" -+#include "ltran_base.h" -+#include "ltran_param.h" - - #define NO_ARGS 0 - #define HAS_ARGS 1 -diff --git a/src/ltran/ltran_config.h b/src/ltran/ltran_config.h -deleted file mode 100644 -index 645dc11..0000000 ---- a/src/ltran/ltran_config.h -+++ /dev/null -@@ -1,20 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef __GAZELLE_CONFIG_H__ --#define __GAZELLE_CONFIG_H__ -- --#include "ltran_param.h" -- --int32_t ltran_config_init(int32_t argc, char *argv[]); -- --#endif /* ifndef __GAZELLE_CONFIG_H__ */ -\ No newline at end of file -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 2b71021..9da6b7f 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -25,6 +25,7 @@ - #include - - #include "ltran_stat.h" -+#include "ltran_base.h" - #include "gazelle_dfx_msg.h" - - /* seeing show_usage() */ -@@ -39,14 +40,16 @@ - #define GAZELLE_LTRAN_PARAM_NUM 3 - #define GAZELLE_LSTACK_PARAM_NUM 4 - --#define GAZELLE_LTRAN_SET_MINNUM 5 --#define GAZELLE_LSTACK_SET_MINNUM 6 -+#define GAZELLE_LTRAN_SET_MINNUM 5 -+#define GAZELLE_LSTACK_SET_MINNUM 6 - - #define GAZELLE_CMD_MAX 5 - --#define GAZELLE_RESULT_LEN 8291 -+#define GAZELLE_RESULT_LEN 8291 - #define GAZELLE_MAX_LATENCY_TIME 1800 // max latency time 30mins - -+#define GAZELLE_DECIMAL 10 -+ - static int32_t g_unix_fd = -1; - static int32_t g_ltran_rate_show_flag = GAZELLE_OFF; // not show when first get total statistics - static struct gazelle_stat_ltran_total g_last_ltran_total; -@@ -431,8 +434,6 @@ static void gazelle_print_ltran_stat_latency(void *buf, const struct gazelle_sta - } else { - printf(" total: 0\n"); - } -- -- return; - } - - static void gazelle_print_ltran_stat_client(void *buf, const struct gazelle_stat_msg_request *req_msg) -@@ -491,7 +492,7 @@ static void gazelle_print_ltran_stat_burst(void *buf, const struct gazelle_stat_ - for (uint32_t j = 1; j <= GAZELLE_PACKET_READ_SIZE; j++) { - diff = port_stat->rx_iter_arr[j] - last_port_stat->rx_iter_arr[j]; - (sum == 0) ? (percent = 0) : (percent = diff * percent_sign / sum); -- printf("Burst Packets[%2d]: %-15"PRIu64" Percent: %3"PRIu64"%%\n", j, diff, percent); -+ printf("Burst Packets[%2u]: %-15"PRIu64" Percent: %3"PRIu64"%%\n", j, diff, percent); - } - } - } else { -@@ -535,7 +536,6 @@ static void gazelle_print_lstack_stat_brief(struct gazelle_stat_lstack_total *st - break; - } - } while (true); -- return; - } - - static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) -@@ -555,7 +555,7 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.app_write_idlefail); - printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list_cnt); - printf("send_list: %-18"PRIu64" ", lstack_stat->data.pkts.send_list_cnt); -- printf("conn_num: %-19"PRIu16" \n", lstack_stat->data.pkts.conn_num); -+ printf("conn_num: %-19hu \n", lstack_stat->data.pkts.conn_num); - printf("wakeup_events: %-14"PRIu64" ", lstack_stat->data.pkts.stack_stat.wakeup_events); - printf("app_events: %-17"PRIu64" ", lstack_stat->data.pkts.wakeup_stat.app_events); - printf("read_null: %-18"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.read_null); -@@ -598,7 +598,6 @@ static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lsta - break; - } - } while (true); -- return; - } - - static void gazelle_print_lstack_stat_total(void *buf, const struct gazelle_stat_msg_request *req_msg) -@@ -610,7 +609,6 @@ static void gazelle_print_lstack_stat_total(void *buf, const struct gazelle_stat - } - - gazelle_print_lstack_stat_detail((struct gazelle_stack_dfx_data *)buf, req_msg); -- return; - } - - static void parse_thread_latency_result(const struct stack_latency *latency, char *result, size_t max_len, -@@ -718,7 +716,6 @@ static void gazelle_print_lstack_stat_lpm(void *buf, const struct gazelle_stat_m - (uint32_t)dfx_data->low_power_info.lpm_rx_pkts, - dfx_data->low_power_info.lpm_detect_ms, - dfx_data->low_power_info.lpm_pkts_in_detect); -- return; - } - - static void gazelle_print_lstack_stat_rate(void *buf, const struct gazelle_stat_msg_request *req_msg) -@@ -776,7 +773,6 @@ static void gazelle_print_lstack_stat_rate(void *buf, const struct gazelle_stat_ - return; - } - } while (true); -- return; - } - - static void gazelle_print_lstack_stat_snmp_core(const struct gazelle_stack_dfx_data *stat, -@@ -848,7 +844,6 @@ static void gazelle_print_lstack_stat_snmp(void *buf, const struct gazelle_stat_ - return; - } - } while (true); -- return; - } - - static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_msg_request *req_msg) -@@ -874,13 +869,13 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%-7d%s:%hu\t %s:%hu\t %s\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%s:%hu\t %s:%hu\t %s\n", i, conn_info->recv_cnt, - conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt, -- conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-57u%s:%hu\t 0.0.0.0:*\t\t LISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-50u%s:%hu\t 0.0.0.0:*\t\t LISTEN\n", i, conn_info->recv_cnt, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", -@@ -905,7 +900,6 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - return; - } - } while (true); -- return; - } - - static void show_usage(void) -@@ -967,7 +961,7 @@ static int32_t parse_dfx_ltran_set_args(int32_t argc, char *argv[], struct gazel - static int32_t parse_dfx_ltran_show_args(int32_t argc, char *argv[], struct gazelle_stat_msg_request *req_msg) - { - int32_t cmd_index = 0; -- int32_t delay = 1; -+ long int delay = 1; - - if (argc == GAZELLE_LTRAN_PARAM_NUM) { - req_msg[cmd_index++].stat_mode = GAZELLE_STAT_LTRAN_SHOW; -@@ -1003,8 +997,9 @@ static int32_t parse_dfx_ltran_show_args(int32_t argc, char *argv[], struct gaze - req_msg[cmd_index++].stat_mode = GAZELLE_STAT_LTRAN_STOP_LATENCY; - req_msg[cmd_index++].stat_mode = GAZELLE_STAT_LTRAN_SHOW_LATENCY; - if (argc > GAZELLE_LSTACK_PARAM_NUM) { -- delay = atoi(argv[GAZELLE_OPTIONS1_ARG_IDX]); -- if (delay <= 0) { -+ char *end = NULL; -+ delay = strtol(argv[GAZELLE_OPTIONS1_ARG_IDX], &end, GAZELLE_DECIMAL); -+ if (delay <= 0 || (end == NULL) || (*end != '\0')) { - return -1; - } - if (delay > GAZELLE_MAX_LATENCY_TIME) { -@@ -1066,8 +1061,10 @@ static int32_t parse_dfx_lstack_set_args(int32_t argc, char *argv[], struct gaze - } - - if (strcmp(param, "lowpower") == 0) { -- req_msg[cmd_index].data.low_power_mod = (uint16_t)atoi(argv[GAZELLE_OPT_LPM_ARG_IDX1]); -- if (req_msg[cmd_index].data.low_power_mod > 1) { -+ char *end = NULL; -+ req_msg[cmd_index].data.low_power_mod = -+ (uint16_t)strtol(argv[GAZELLE_OPT_LPM_ARG_IDX1], &end, GAZELLE_DECIMAL); -+ if (req_msg[cmd_index].data.low_power_mod > 1 || (end == NULL) || (*end != '\0')) { - printf("low_power_mod input invaild\n"); - return cmd_index; - } -@@ -1080,7 +1077,7 @@ static int32_t parse_dfx_lstack_set_args(int32_t argc, char *argv[], struct gaze - static int32_t parse_dfx_lstack_show_args(int32_t argc, char *argv[], struct gazelle_stat_msg_request *req_msg) - { - int32_t cmd_index = 0; -- int32_t delay = 1; -+ long int delay = 1; - - if (argc == GAZELLE_LSTACK_PARAM_NUM) { - req_msg[cmd_index++].stat_mode = GAZELLE_STAT_LSTACK_SHOW; -@@ -1107,8 +1104,9 @@ static int32_t parse_dfx_lstack_show_args(int32_t argc, char *argv[], struct gaz - } - - if (argc > GAZELLE_OPTIONS2_ARG_IDX) { -- delay = atoi(argv[GAZELLE_OPTIONS2_ARG_IDX]); -- if (delay <= 0) { -+ char *end = NULL; -+ delay = strtol(argv[GAZELLE_OPTIONS2_ARG_IDX], &end, GAZELLE_DECIMAL); -+ if (delay <= 0 || (end == NULL) || (*end != '\0')) { - return -1; - } - if (delay > GAZELLE_MAX_LATENCY_TIME) { -@@ -1189,8 +1187,6 @@ static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32 - printf("connect ltran failed. errno: 111 ret=-1\n"); - return -1; - } -- -- return -1; - } - - int32_t dfx_loop(struct gazelle_stat_msg_request *req_msg, int32_t req_msg_num) -diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c -index 03c692d..45bf2ef 100644 ---- a/src/ltran/ltran_ethdev.c -+++ b/src/ltran/ltran_ethdev.c -@@ -28,6 +28,9 @@ - #include "dpdk_common.h" - #include "ltran_param.h" - #include "ltran_log.h" -+#include "ltran_base.h" -+#include "gazelle_opt.h" -+#include "ltran_errno.h" - #include "gazelle_reg_msg.h" - - uint32_t g_bond_num = 0; -@@ -134,8 +137,7 @@ static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index, u - { - uint32_t num_mbufs = GAZELLE_MBUFS_RX_COUNT * scale; - -- char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH]; -- (void)memset_s(mbuf_pool_name, sizeof(mbuf_pool_name), 0, sizeof(mbuf_pool_name)); -+ char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH] = {0}; - - int32_t ret = snprintf_s(mbuf_pool_name, sizeof(mbuf_pool_name), sizeof(mbuf_pool_name) - 1, - GAZELLE_PKT_MBUF_RX_POOL_NAME_FMT, bond_port_index); -@@ -153,8 +155,7 @@ static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index, u - { - const uint32_t num_mbufs = GAZELLE_MBUFS_TX_COUNT * scale; - -- char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH]; -- (void)memset_s(mbuf_pool_name, sizeof(mbuf_pool_name), 0, sizeof(mbuf_pool_name)); -+ char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH] = {0}; - - int32_t ret = snprintf_s(mbuf_pool_name, sizeof(mbuf_pool_name), sizeof(mbuf_pool_name) - 1, - GAZELLE_PKT_MBUF_TX_POOL_NAME_FMT, bond_port_index); -@@ -263,7 +264,7 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo - - int32_t ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, &tx_ring_size); - if (ret != 0) { -- LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed in slave port initialize. errno: %d, port: %d \n", ret, -+ LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed in slave port initialize. errno: %d, port: %hu \n", ret, - port_num); - return GAZELLE_ERR; - } -@@ -273,7 +274,7 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo - ret = rte_eth_rx_queue_setup(port_num, queue_id, rx_ring_size, (uint32_t)rte_eth_dev_socket_id(port_num), NULL, - pktmbuf_rxpool); - if (ret < 0) { -- LTRAN_ERR("rte_eth_rx_queue_setup failed in slave port initialize. errno: %d, port: %d\n", ret, port_num); -+ LTRAN_ERR("rte_eth_rx_queue_setup failed in slave port initialize. errno: %d, port: %hu\n", ret, port_num); - return GAZELLE_ERR; - } - } -@@ -282,7 +283,7 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo - ret = rte_eth_tx_queue_setup(port_num, queue_id, tx_ring_size, (uint32_t)rte_eth_dev_socket_id(port_num), - &dev_info.default_txconf); - if (ret < 0) { -- LTRAN_ERR("rte_eth_tx_queue_setup failed in slave port initialize. errno: %d, port: %d\n", ret, port_num); -+ LTRAN_ERR("rte_eth_tx_queue_setup failed in slave port initialize. errno: %d, port: %hu\n", ret, port_num); - return GAZELLE_ERR; - } - } -@@ -358,14 +359,14 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id - - int32_t ret = ltran_eth_bond_slave(port_info, port_num, bond_port_id); - if (ret < 0) { -- LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %d, errno: %d \n", port_num, ret); -+ LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %hu, errno: %d \n", port_num, ret); - return GAZELLE_ERR; - } - - struct rte_eth_dev_info dev_info; - if (rte_eth_dev_info_get(bond_port_id, &dev_info) != 0) { - LTRAN_ERR("faile rte_eth_dev_info_get\n"); -- return GAZELLE_ERR; -+ return GAZELLE_ERR; - } - - struct rte_eth_conf port_conf = {0}; -@@ -376,13 +377,13 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id - - ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf); - if (ret != 0) { -- LTRAN_ERR("rte_eth_dev_configure failed with bond port num: %d, errno: %d \n", port_num, ret); -+ LTRAN_ERR("rte_eth_dev_configure failed with bond port num: %hu, errno: %d \n", port_num, ret); - return GAZELLE_ERR; - } - - ret = rte_eth_dev_adjust_nb_rx_tx_desc(bond_port_id, &rx_ring_size, &tx_ring_size); - if (ret != 0) { -- LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed with bond port num: %d, errno: %d \n", port_num, ret); -+ LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed with bond port num: %hu, errno: %d \n", port_num, ret); - return GAZELLE_ERR; - } - LTRAN_DEBUG("Bond port adujst rx_ring_size: %hu, tx_ring_size: %hu. bond port num: %hu \n", -@@ -390,13 +391,13 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id - - ret = ltran_eth_rx_queue_setup(bond_port_id, pktmbuf_rxpool, rx_queue_num, rx_ring_size); - if (ret < 0) { -- LTRAN_ERR("rte_eth_rx_queue_setup failed in bond port initialize. errno: %d, port: %d \n", ret, port_num); -+ LTRAN_ERR("rte_eth_rx_queue_setup failed in bond port initialize. errno: %d, port: %hu \n", ret, port_num); - return GAZELLE_ERR; - } - - ret = ltran_eth_tx_queue_setup(port_num, bond_port_id, tx_queue_num, tx_ring_size); - if (ret < 0) { -- LTRAN_ERR("rte_eth_tx_queue_setup failed in bond port initialize. errno: %d, port: %d \n", ret, port_num); -+ LTRAN_ERR("rte_eth_tx_queue_setup failed in bond port initialize. errno: %d, port: %hu \n", ret, port_num); - return GAZELLE_ERR; - } - return GAZELLE_OK; -@@ -419,7 +420,7 @@ static int32_t ltran_single_bond_port_init(uint16_t port_num, struct rte_mempool - - ret = rte_eth_bond_create(bond_port_name, (uint8_t)ltran_config->bond.mode, (uint8_t)rte_socket_id()); - if (ret < 0) { -- LTRAN_ERR("rte_eth_bond_create failed with bond port num: %d, errno: %d\n", port_num, ret); -+ LTRAN_ERR("rte_eth_bond_create failed with bond port num: %hu, errno: %d\n", port_num, ret); - return GAZELLE_ERR; - } - bond_port_id = (uint16_t)ret; -@@ -432,20 +433,20 @@ static int32_t ltran_single_bond_port_init(uint16_t port_num, struct rte_mempool - struct rte_ether_addr addr = ltran_config->bond.mac[port_num]; - ret = rte_eth_bond_mac_address_set(bond_port_id, &addr); - if (ret < 0) { -- LTRAN_ERR("rte_eth_bond_mac_address_set failed in bond port initialize. errno: %d, port: %d\n", ret, port_num); -+ LTRAN_ERR("rte_eth_bond_mac_address_set failed in bond port initialize. errno: %d, port: %hu\n", ret, port_num); - return GAZELLE_ERR; - } - - ret = rte_eth_bond_link_monitoring_set(bond_port_id, (uint32_t)ltran_config->bond.miimon); - if (ret < 0) { -- LTRAN_ERR("rte_eth_bond_link_monitoring_set failed in bond port initialize. errno: %d, port: %d\n", ret, -+ LTRAN_ERR("rte_eth_bond_link_monitoring_set failed in bond port initialize. errno: %d, port: %hu\n", ret, - port_num); - return GAZELLE_ERR; - } - - ret = rte_eth_dev_start(bond_port_id); - if (ret < 0) { -- LTRAN_ERR("rte_eth_dev_start failed in bond port initialize. errno: %d, port: %d\n", ret, port_num); -+ LTRAN_ERR("rte_eth_dev_start failed in bond port initialize. errno: %d, port: %hu\n", ret, port_num); - return GAZELLE_ERR; - } - -diff --git a/src/ltran/ltran_ethdev.h b/src/ltran/ltran_ethdev.h -index de7cfbb..f720c55 100644 ---- a/src/ltran/ltran_ethdev.h -+++ b/src/ltran/ltran_ethdev.h -@@ -13,21 +13,23 @@ - #ifndef __GAZELLE_ETHDEV_H__ - #define __GAZELLE_ETHDEV_H__ - --#include -+#include - --#include "ltran_base.h" -+#include "gazelle_opt.h" - - struct port_info { - uint16_t num_ports; -- uint16_t id[RTE_MAX_ETHPORTS]; -+ uint16_t id[GAZELLE_MAX_ETHPORTS]; - }; - -+struct rte_kni; - uint32_t get_bond_num(void); - struct rte_kni* get_gazelle_kni(void); - void set_bond_num(const uint32_t bond_num); - struct port_info* get_port_info(void); - uint16_t* get_bond_port(void); - -+struct rte_mempool; - struct rte_mempool** get_pktmbuf_txpool(void); - struct rte_mempool** get_pktmbuf_rxpool(void); - -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index 776692d..fb864b3 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -28,11 +28,12 @@ - #include "ltran_tcp_conn.h" - #include "ltran_tcp_sock.h" - #include "ltran_stat.h" -+#include "ltran_stack.h" -+#include "ltran_base.h" - #include "ltran_log.h" - #include "ltran_param.h" - #include "ltran_ethdev.h" - #include "ltran_timer.h" -- - #include "ltran_forward.h" - - #define POINTER_PER_CACHELINE (RTE_CACHE_LINE_SIZE / sizeof(void *)) -@@ -60,7 +61,7 @@ static void calculate_ltran_latency(struct gazelle_stack *stack, const struct rt - - // time stamp must > start time - if (*priv < get_start_time_stamp()) { -- memset_s(priv, GAZELLE_MBUFF_PRIV_SIZE, 0, GAZELLE_MBUFF_PRIV_SIZE); -+ *priv = 0; - return; - } - -@@ -82,7 +83,6 @@ static __rte_always_inline void flush_rx_mbuf(struct gazelle_stack *stack, struc - calculate_ltran_latency(stack, src); - } - rte_pktmbuf_free(src); -- src = NULL; - } - - static __rte_always_inline void backup_bufs_enque_rx_ring(struct gazelle_stack *stack) -@@ -334,7 +334,7 @@ static __rte_always_inline int32_t ipv4_handle(struct rte_mbuf *m, struct rte_ip - return ret; - } - --static __rte_always_inline int32_t arp_handle(struct rte_mbuf *m) -+static __rte_always_inline void arp_handle(struct rte_mbuf *m) - { - uint32_t i; - struct gazelle_stack** stack_array = NULL; -@@ -354,7 +354,7 @@ static __rte_always_inline int32_t arp_handle(struct rte_mbuf *m) - instance = gazelle_instance_map_by_ip(get_instance_mgr(), arph->arp_data.arp_tip); - - if (instance == NULL) { -- return GAZELLE_ERR; -+ return; - } - - stack_array = instance->stack_array; -@@ -363,15 +363,13 @@ static __rte_always_inline int32_t arp_handle(struct rte_mbuf *m) - m_copy = rte_pktmbuf_alloc(m->pool); - if (m_copy == NULL) { - LTRAN_ERR("copy mbuf failed in arp_handle. \n"); -- return GAZELLE_ERR; -+ return; - } - copy_mbuf(m_copy, m); - // send and free m_copy in enqueue_rx_packet - enqueue_rx_packet(stack_array[i], m_copy); - } - } -- -- return GAZELLE_OK; - } - - static __rte_always_inline void upstream_forward_one(struct rte_mbuf *m) -@@ -512,7 +510,7 @@ static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stac - void *pkts[PACKET_READ_SIZE]; - struct gazelle_tcp_sock_htable *sock_htable = gazelle_get_tcp_sock_htable(); - -- if (rte_ring_cn_count(stack->reg_ring) == 0) { -+ if (gazelle_ring_readable_count(stack->reg_ring) == 0) { - return; - } - -@@ -567,7 +565,6 @@ static __rte_always_inline void upstream_forward_loop(uint32_t port_id, uint32_t - uint64_t time_stamp = 0; - - struct rte_mbuf *buf[GAZELLE_PACKET_READ_SIZE] __rte_cache_aligned; -- memset_s(buf, sizeof(buf), 0, sizeof(buf)); - for (loop_cnt = 0; loop_cnt < UPSTREAM_LOOP_TIMES; loop_cnt++) { - if (get_start_latency_flag() == GAZELLE_ON) { - time_stamp = get_current_time(); -diff --git a/src/ltran/ltran_forward.h b/src/ltran/ltran_forward.h -index c8703a2..0657b69 100644 ---- a/src/ltran/ltran_forward.h -+++ b/src/ltran/ltran_forward.h -@@ -13,18 +13,7 @@ - #ifndef __GAZELLE_FORWORD_H__ - #define __GAZELLE_FORWORD_H__ - --#include "ltran_stack.h" --#include "ltran_base.h" -- - void upstream_forward(const uint16_t *port); - int32_t downstream_forward(uint16_t *port); - --static __rte_always_inline unsigned rte_ring_cn_count(const struct rte_ring *r) --{ -- const uint32_t old_head = r->prod.tail; -- rte_smp_rmb(); -- -- return r->cons.head - old_head; --} -- - #endif /* ifndef __GAZELLE_FORWORD_H__ */ -diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c -index 15f4bb4..5560d0c 100644 ---- a/src/ltran/ltran_instance.c -+++ b/src/ltran/ltran_instance.c -@@ -10,20 +10,26 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_instance.h" -- - #include - #include - #include - #include - #include -+#include -+ -+#include - - #include "ltran_stack.h" - #include "ltran_tcp_sock.h" - #include "ltran_param.h" - #include "ltran_stat.h" - #include "ltran_log.h" -+#include "ltran_base.h" -+#include "gazelle_opt.h" -+#include "ltran_errno.h" -+#include "gazelle_dfx_msg.h" - #include "gazelle_base_func.h" -+#include "ltran_instance.h" - - volatile unsigned long g_tx_loop_count __rte_cache_aligned; - volatile unsigned long g_rx_loop_count __rte_cache_aligned; -@@ -71,11 +77,10 @@ struct gazelle_instance_mgr *gazelle_instance_mgr_create(void) - { - struct gazelle_instance_mgr *mgr; - -- mgr = malloc(sizeof(struct gazelle_instance_mgr)); -+ mgr = calloc(1, sizeof(struct gazelle_instance_mgr)); - if (mgr == NULL) { - return NULL; - } -- (void)memset_s(mgr, sizeof(struct gazelle_instance_mgr), 0, sizeof(struct gazelle_instance_mgr)); - - mgr->net_mask = htonl(get_ltran_config()->dispatcher.ipv4_net_mask); - mgr->subnet_size = (uint32_t)(get_ltran_config()->dispatcher.ipv4_subnet_size); -@@ -134,6 +139,9 @@ struct gazelle_instance *gazelle_instance_map_by_ip(const struct gazelle_instanc - uint32_t ip_idx = ntohl(ip & mgr->net_mask); - if (ip_idx < mgr->subnet_size) { - uint8_t cl_idx = mgr->ipv4_to_client[ip_idx]; -+ if (cl_idx == GAZELLE_NULL_CLIENT) { -+ return NULL; -+ } - return mgr->instances[cl_idx]; - } - return NULL; -@@ -183,11 +191,10 @@ struct gazelle_instance *gazelle_instance_add_by_pid(struct gazelle_instance_mgr - continue; - } - -- instance = malloc(sizeof(struct gazelle_instance)); -+ instance = calloc(1, sizeof(struct gazelle_instance)); - if (instance == NULL) { - return NULL; - } -- (void)memset_s(instance, sizeof(struct gazelle_instance), 0, sizeof(struct gazelle_instance)); - - instance->pid = pid; - mgr->instance_cur_tick[i]++; -@@ -235,9 +242,12 @@ static int32_t instance_info_set(struct gazelle_instance *instance, const struct - return GAZELLE_ERR; - } - -- memset_s(instance->stack_array, sizeof(instance->stack_array), 0, sizeof(instance->stack_array)); -+ ret = memset_s(instance->stack_array, sizeof(instance->stack_array), 0, sizeof(instance->stack_array)); -+ if (ret != EOK) { -+ return GAZELLE_ERR; -+ } - -- ret = memcpy_s(instance->ethdev.addr_bytes, RTE_ETHER_ADDR_LEN, conf->ethdev.addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = memcpy_s(instance->mac_addr, ETHER_ADDR_LEN, conf->mac_addr, ETHER_ADDR_LEN); - if (ret != EOK) { - return GAZELLE_ERR; - } -@@ -245,19 +255,19 @@ static int32_t instance_info_set(struct gazelle_instance *instance, const struct - return GAZELLE_OK; - } - --int32_t instance_match_bond_port(const struct rte_ether_addr *mac) -+int32_t instance_match_bond_port(const uint8_t *mac_addr) - { - int32_t bond_index; - - for (bond_index = 0; bond_index < GAZELLE_MAX_BOND_NUM; bond_index++) { -- if (is_same_mac_addr(mac, &(get_ltran_config()->bond.mac[bond_index]))) { -+ if (is_same_mac_addr(mac_addr, get_ltran_config()->bond.mac[bond_index].addr_bytes)) { - return bond_index; - } - } - -- LTRAN_ERR("match_bond_port failed: [bond] mac=%02X:%02X:%02X:%02X:%02X:%02X\n", -- mac->addr_bytes[0], mac->addr_bytes[1], mac->addr_bytes[2], /* 0 1 2 is mac byte */ -- mac->addr_bytes[3], mac->addr_bytes[4], mac->addr_bytes[5]); /* 3 4 5 is mac byte */ -+ LTRAN_ERR("match_bond_port failed: [bond] mac=%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", -+ mac_addr[0], mac_addr[1], mac_addr[2], /* 0 1 2 is mac byte */ -+ mac_addr[3], mac_addr[4], mac_addr[5]); /* 3 4 5 is mac byte */ - return -1; - } - -@@ -300,7 +310,7 @@ static int32_t instance_info_check(const struct client_proc_conf *conf) - return GAZELLE_ERR; - } - -- if (instance_match_bond_port(&conf->ethdev) < 0) { -+ if (instance_match_bond_port(conf->mac_addr) < 0) { - return GAZELLE_ERR; - } - -@@ -447,13 +457,11 @@ static void remove_virtual_area(uintptr_t addr, size_t size) - - int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg) - { -- struct reg_response_msg send_msg; -+ struct reg_response_msg send_msg = {0}; - struct client_proc_conf *conf = &recv_msg->msg.proc; - struct gazelle_instance *instance = NULL; - struct ltran_config *ltran_config = get_ltran_config(); - -- (void)memset_s(&send_msg, sizeof(send_msg), 0, sizeof(send_msg)); -- - int32_t ret = instance_info_check(conf); - if (ret != GAZELLE_OK) { - goto END; -diff --git a/src/ltran/ltran_instance.h b/src/ltran/ltran_instance.h -index 4caa9b7..a8808df 100644 ---- a/src/ltran/ltran_instance.h -+++ b/src/ltran/ltran_instance.h -@@ -14,11 +14,13 @@ - #define __GAZELLE_INSTANCE_H__ - - #include -+#include -+#include - --#include "ltran_base.h" -+#include "gazelle_opt.h" - #include "gazelle_reg_msg.h" --#include "ltran_stack.h" - -+struct gazelle_stack; - struct gazelle_instance { - // key - uint32_t pid; -@@ -37,7 +39,7 @@ struct gazelle_instance { - enum request_type reg_state; - uintptr_t base_virtaddr; - uint64_t socket_size; -- struct rte_ether_addr ethdev; -+ uint8_t mac_addr[ETHER_ADDR_LEN]; - char file_prefix[PATH_MAX]; - }; - -@@ -85,7 +87,7 @@ int32_t gazelle_instance_map_set(struct gazelle_instance_mgr *mgr, const struct - struct gazelle_instance *gazelle_instance_add_by_pid(struct gazelle_instance_mgr *mgr, uint32_t pid); - - int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg); --int32_t instance_match_bond_port(const struct rte_ether_addr *mac); -+int32_t instance_match_bond_port(const uint8_t *mac); - int32_t handle_reg_msg_proc_reconn(int32_t fd, const struct reg_request_msg *recv_msg); - int32_t handle_reg_msg_proc_att(int32_t fd, struct reg_request_msg *recv_msg); - void handle_instance_logout(uint32_t pid); -diff --git a/src/ltran/ltran_log.h b/src/ltran/ltran_log.h -index 42cd9e5..a641ae0 100644 ---- a/src/ltran/ltran_log.h -+++ b/src/ltran/ltran_log.h -@@ -14,9 +14,7 @@ - #define __GAZELLE_LOG_H__ - - #include --#include - --#include "ltran_base.h" - #define RTE_LOGTYPE_LTRAN RTE_LOGTYPE_USER1 - - #define LTRAN_DEBUG(fmt, ...) \ -diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c -index 251ca20..0562ce1 100644 ---- a/src/ltran/ltran_monitor.c -+++ b/src/ltran/ltran_monitor.c -@@ -10,8 +10,6 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_monitor.h" -- - #include - #include - #include -@@ -25,12 +23,15 @@ - #include - #include - #include -+#include - - #include "ltran_base.h" - #include "ltran_log.h" - #include "ltran_stat.h" - #include "ltran_instance.h" - #include "gazelle_dfx_msg.h" -+#include "gazelle_base_func.h" -+#include "ltran_monitor.h" - - #define GAZELLE_LISTEN_BACKLOG 5 - -@@ -103,12 +104,14 @@ static struct sockfd_data *sockfd_data_alloc(enum sockfd_type type, int32_t fd) - static inline void sockfd_data_free(struct sockfd_data *data) - { - close(data->fd); -- (void)memset_s(data, sizeof(struct sockfd_data), 0, sizeof(*data)); -+ if (memset_s(data, sizeof(struct sockfd_data), 0, sizeof(*data)) != 0) { -+ LTRAN_ERR("memset_s fail"); -+ } - } - - static int32_t unix_server_create(const char *path, int32_t *server_fd) - { -- struct sockaddr_un addr; -+ struct sockaddr_un addr = {0}; - int32_t fd = -1; - int32_t ret; - -@@ -123,7 +126,6 @@ static int32_t unix_server_create(const char *path, int32_t *server_fd) - return GAZELLE_ERR; - } - -- (void)memset_s(&addr, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_UNIX; - ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), path, sizeof(addr.sun_path) - 1); - if (ret != 0) { -diff --git a/src/ltran/ltran_opt.h b/src/ltran/ltran_opt.h -deleted file mode 100644 -index 1117898..0000000 ---- a/src/ltran/ltran_opt.h -+++ /dev/null -@@ -1,54 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ -- --#ifndef __GAZELLE_OPT_H__ --#define __GAZELLE_OPT_H__ -- --#define PROGRAM_NAME "ltran" --#define VER_FMT "gazelle version: %s\n" --#define VER_NAME "1.0.0" -- --#define DEFAULT_LTRAN_CONF_PATH "/etc/gazelle/ltran.conf" -- --#define GAZELLE_PACKET_READ_SIZE 32 -- --#define GAZELLE_MBUFS_RX_COUNT (300 * 1024) --#define GAZELLE_MBUFS_TX_COUNT (30 * 1024) --#define GAZELLE_MBUFS_CACHE_SIZE 512 -- --#define GAZELLE_RX_QUEUES 1 --#define GAZELLE_TX_QUEUES 1 --#define GAZELLE_RX_DESC_DEFAULT 512 --#define GAZELLE_TX_DESC_DEFAULT 512 -- --#define GAZELLE_KNI_MAX_PACKET_SIZE 2048 --#define GAZELLE_KNI_ETHERNET_HEADER_SIZE 14 --#define GAZELLE_KNI_ETHERNET_FCS_SIZE 4 -- --#define GAZELLE_PKT_MBUF_RX_POOL_NAME_FMT "rx_pool%u" --#define GAZELLE_PKT_MBUF_TX_POOL_NAME_FMT "tx_pool%u" --#define GAZELLE_PKT_MBUF_POOL_NAME_LENGTH 64 -- --#define GAZELLE_BOND_NAME_LENGTH 64 --#define GAZELLE_BOND_DEV_NAME_FMT "net_bonding%hu" --#define GAZELLE_BOND_QUEUE_MIN 1 --#define GAZELLE_BOND_QUEUE_MAX 64 -- --#define GAZELLE_CLIENT_RING_NAME_FMT "MProc_Client_%u_mbuf_queue" --#define GAZELLE_CLIENT_DROP_RING_SIZE 20000 -- --#define GAZELLE_LTRAN_LOG_FILE "/var/run/gazelle/ltran.log" -- --// CONFIG OF DFX --#define GAZELLE_DFX_REQ_INTERVAL_S 1 -- --#endif /* ifndef __GAZELLE_OPT_H__ */ -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index cd65531..40ee8d3 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -10,8 +10,6 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_param.h" -- - #include - #include - #include -@@ -20,9 +18,13 @@ - #include - #include - #include -+#include - -+#include "ltran_param.h" -+#include "ltran_errno.h" -+#include "ltran_base.h" - #include "ltran_log.h" --#include "gazelle_parse_config.h" -+#include "gazelle_dfx_msg.h" - #include "gazelle_base_func.h" - - #define HEX_BASE 16 -@@ -47,7 +49,7 @@ struct ltran_config* get_ltran_config(void) - return &g_ltran_config; - } - --static int32_t parse_str2mac(char *mac_str, struct rte_ether_addr *ether_addr) -+static int32_t parse_str2mac(char *mac_str, uint8_t *ether_addr) - { - const char *delim = ":"; - char *token = NULL; -@@ -68,15 +70,15 @@ static int32_t parse_str2mac(char *mac_str, struct rte_ether_addr *ether_addr) - return GAZELLE_ERR; - } - -- if (i >= RTE_ETHER_ADDR_LEN) { -+ if (i >= ETHER_ADDR_LEN) { - gazelle_set_errno(GAZELLE_EPARAM); - return GAZELLE_ERR; - } - token = strtok_s(NULL, delim, &tmp); -- ether_addr->addr_bytes[i++] = (uint8_t)one_bit_mac; -+ ether_addr[i++] = (uint8_t)one_bit_mac; - } - -- if (i != RTE_ETHER_ADDR_LEN) { -+ if (i != ETHER_ADDR_LEN) { - gazelle_set_errno(GAZELLE_EMAC); - return GAZELLE_ERR; - } -@@ -225,7 +227,7 @@ static int32_t parse_dispatch_max_client(const config_t *config, const char *key - return GAZELLE_ERR; - } - -- if ((max_client < GAZELLE_CLIENT_NUM_MIN) || (max_client > GAZELLE_CLIENT_NUM_MAX)) { -+ if ((max_client < GAZELLE_CLIENT_NUM_MIN) || (max_client > GAZELLE_CLIENT_NUM)) { - gazelle_set_errno(GAZELLE_ERANGE); - return GAZELLE_ERR; - } -@@ -392,8 +394,8 @@ static int32_t check_bond_dup_mac(const struct ltran_config *ltran_config) - uint32_t i, j; - for (i = 0; i < ltran_config->bond.mac_num; i++) { - for (j = i + 1; j < ltran_config->bond.mac_num; j++) { -- if (is_same_mac_addr(<ran_config->bond.mac[i], <ran_config->bond.mac[j])) { -- syslog(LOG_ERR, "Err: MAC address must be unique, same MAC %02X:%02X:%02X:%02X:%02X:%02X\n", -+ if (is_same_mac_addr(ltran_config->bond.mac[i].addr_bytes, ltran_config->bond.mac[j].addr_bytes)) { -+ syslog(LOG_ERR, "Err:MAC address must be unique, same MAC %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", - ltran_config->bond.mac[i].addr_bytes[0], /* 0 byte index */ - ltran_config->bond.mac[i].addr_bytes[1], /* 1 byte index */ - ltran_config->bond.mac[i].addr_bytes[2], /* 2 byte index */ -@@ -468,7 +470,7 @@ static int32_t parse_bond_macs(const config_t *config, const char *key, struct l - parse_bond_macs_separate(bond_macs_str, bond_mac_cache, GAZELLE_MAX_BOND_NUM, &bond_mac_cache_count); - - for (int32_t j = 0; j < bond_mac_cache_count; j++) { -- ret = parse_str2mac(bond_mac_cache[j], <ran_config->bond.mac[ltran_config->bond.mac_num]); -+ ret = parse_str2mac(bond_mac_cache[j], ltran_config->bond.mac[ltran_config->bond.mac_num].addr_bytes); - if (ret != GAZELLE_OK) { - break; - } -@@ -559,7 +561,12 @@ int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config * - config_init(&config); - int32_t ret; - -- memset_s(ltran_config, sizeof(struct ltran_config), 0, sizeof(struct ltran_config)); -+ ret = memset_s(ltran_config, sizeof(struct ltran_config), 0, sizeof(struct ltran_config)); -+ if (ret != 0) { -+ config_destroy(&config); -+ syslog(LOG_ERR, "memset_s failed\n"); -+ return ret; -+ } - ret = config_read_file(&config, conf_file_path); - if (ret == 0) { - config_destroy(&config); -@@ -582,10 +589,10 @@ int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config * - return GAZELLE_OK; - } - --bool is_same_mac_addr(const struct rte_ether_addr *smac, const struct rte_ether_addr *dmac) -+bool is_same_mac_addr(const uint8_t *smac, const uint8_t *dmac) - { -- for (int32_t i = 0; i < RTE_ETHER_ADDR_LEN; i++) { -- if (smac->addr_bytes[i] != dmac->addr_bytes[i]) { -+ for (int32_t i = 0; i < ETHER_ADDR_LEN; i++) { -+ if (smac[i] != dmac[i]) { - return false; - } - } -diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h -index 442694c..3ec6451 100644 ---- a/src/ltran/ltran_param.h -+++ b/src/ltran/ltran_param.h -@@ -16,9 +16,7 @@ - #include - #include - --#include "ltran_stat.h" --#include "ltran_instance.h" --#include "ltran_base.h" -+#include "gazelle_opt.h" - - struct ltran_config { - struct { -@@ -62,7 +60,8 @@ struct ltran_config { - - int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config); - void param_resource_destroy(struct ltran_config *ltran_config); --bool is_same_mac_addr(const struct rte_ether_addr *smac, const struct rte_ether_addr *dmac); -+bool is_same_mac_addr(const uint8_t *smac, const uint8_t *dmac); - struct ltran_config* get_ltran_config(void); -+int32_t ltran_config_init(int32_t argc, char *argv[]); - - #endif /* ifndef __GAZELLE_PARAM_H__ */ -diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c -index 987673e..2049003 100644 ---- a/src/ltran/ltran_stack.c -+++ b/src/ltran/ltran_stack.c -@@ -10,10 +10,13 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_stack.h" -+#include -+ - #include "ltran_instance.h" - #include "ltran_log.h" -+#include "ltran_jhash.h" - #include "gazelle_base_func.h" -+#include "ltran_stack.h" - - struct gazelle_stack_htable *g_stack_htable = NULL; - struct gazelle_stack_htable *gazelle_get_stack_htable(void) -@@ -120,12 +123,11 @@ struct gazelle_stack *gazelle_stack_add_by_tid(struct gazelle_stack_htable *stac - return NULL; - } - -- stack = malloc(sizeof(struct gazelle_stack)); -+ stack = calloc(1, sizeof(struct gazelle_stack)); - if (stack == NULL) { - LTRAN_ERR("malloc fail.\n"); - return NULL; - } -- (void)memset_s(stack, sizeof(struct gazelle_stack), 0, sizeof(*stack)); - - stack->index = -1; - stack->tid = tid; -diff --git a/src/ltran/ltran_stack.h b/src/ltran/ltran_stack.h -index 211f2b5..693bb33 100644 ---- a/src/ltran/ltran_stack.h -+++ b/src/ltran/ltran_stack.h -@@ -15,9 +15,11 @@ - - #include - --#include "ltran_jhash.h" - #include "ltran_stat.h" - -+struct rte_ring; -+struct rte_mbuf; -+ - struct gazelle_stack { - // key - int32_t index; -diff --git a/src/ltran/ltran_stat.c b/src/ltran/ltran_stat.c -index c6805a6..af79b76 100644 ---- a/src/ltran/ltran_stat.c -+++ b/src/ltran/ltran_stat.c -@@ -25,6 +25,8 @@ - #include "gazelle_dfx_msg.h" - #include "ltran_timer.h" - #include "ltran_ethdev.h" -+#include "ltran_base.h" -+#include "ltran_stack.h" - #include "dpdk_common.h" - #include "ltran_forward.h" - -@@ -98,8 +100,6 @@ static int32_t gazelle_filling_ltran_stat_total(struct gazelle_stat_ltran_total - return GAZELLE_ERR; - } - -- (void)memset_s(stat, sizeof(struct gazelle_stat_ltran_total), 0, sizeof(struct gazelle_stat_ltran_total)); -- - for (uint32_t i = 0; i < port_num; i++) { - stat->port_list[i].tx = total_stat->port_stats[i].tx; - stat->port_list[i].rx = total_stat->port_stats[i].rx; -@@ -131,10 +131,8 @@ static int32_t gazelle_filling_ltran_stat_client(struct gazelle_stat_ltran_clien - return GAZELLE_ERR; - } - -- (void)memset_s(stat, sizeof(struct gazelle_stat_ltran_client), 0, sizeof(struct gazelle_stat_ltran_client)); -- - int32_t bond_index; -- for (int32_t i = 0; i < GAZELLE_MAX_CLIENT; i++) { -+ for (int32_t i = 0; i < GAZELLE_CLIENT_NUM; i++) { - instance = total_stat->instances[i]; - if (instance != NULL) { - stat->client_info[stat->client_num].id = i; -@@ -150,7 +148,7 @@ static int32_t gazelle_filling_ltran_stat_client(struct gazelle_stat_ltran_clien - stat->client_info[stat->client_num].state = GAZELLE_CLIENT_STATE_CONNECTING; - break; - case RQT_REG_THRD_RING: -- bond_index = instance_match_bond_port(&instance->ethdev); -+ bond_index = instance_match_bond_port(instance->mac_addr); - stat->client_info[stat->client_num].bond_port = bond_port[bond_index]; - stat->client_info[stat->client_num].state = GAZELLE_CLIENT_STATE_NORMAL; - break; -@@ -171,8 +169,6 @@ static int32_t gazelle_filling_lstack_stat_total(struct gazelle_stat_lstack_tota - return GAZELLE_ERR; - } - -- (void)memset_s(stat, sizeof(struct gazelle_stat_lstack_total), 0, sizeof(struct gazelle_stat_lstack_total)); -- - stat->tid = stack->tid; - stat->index = (uint32_t)stack->index; - stat->rx = stack->stack_stats.rx; -@@ -189,7 +185,7 @@ static int32_t gazelle_filling_lstack_stat_total(struct gazelle_stat_lstack_tota - stat->backup_mbuf_cnt = stack->backup_pkt_cnt; - stat->latency_pkts = stack->stack_stats.latency_pkts; - stat->latency_total = stack->stack_stats.latency_total; -- stat->reg_ring_cnt = rte_ring_cn_count(stack->reg_ring); -+ stat->reg_ring_cnt = gazelle_ring_readable_count(stack->reg_ring); - stat->rx_ring_cnt = gazelle_ring_readover_count(stack->rx_ring); - stat->tx_ring_cnt = gazelle_ring_readable_count(stack->tx_ring); - -@@ -286,7 +282,7 @@ void handle_resp_ltran_conn(int32_t fd) - void handle_resp_ltran_client(int32_t fd) - { - int32_t ret; -- struct gazelle_stat_ltran_client stat; -+ struct gazelle_stat_ltran_client stat = {0}; - ret = gazelle_filling_ltran_stat_client(&stat, get_instance_mgr()); - if (ret != GAZELLE_OK) { - LTRAN_ERR("filling ltran stat total failed. ret=%d\n", ret); -@@ -323,7 +319,7 @@ void set_ltran_log_level(struct gazelle_stat_msg_request *msg) - - void handle_resp_ltran_latency(int32_t fd) - { -- struct gazelle_stat_lstack_total stat; -+ struct gazelle_stat_lstack_total stat = {0}; - struct gazelle_instance *instance = NULL; - struct gazelle_instance_mgr *instance_mgr = get_instance_mgr(); - int32_t ret; -@@ -428,7 +424,7 @@ void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg) - void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t fd) - { - int32_t lstack_fd; -- struct gazelle_stack_dfx_data stat; -+ struct gazelle_stack_dfx_data stat = {0}; - int32_t cmd_fd = fd; - int32_t ret; - -@@ -439,7 +435,6 @@ void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int - - (void)write_specied_len(lstack_fd, (const char *)msg, sizeof(struct gazelle_stat_msg_request)); - -- (void)memset_s(&stat, sizeof(struct gazelle_stack_dfx_data), 0, sizeof(stat)); - while (stat.eof == 0) { - ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat)); - if (ret != GAZELLE_OK) { -diff --git a/src/ltran/ltran_stat.h b/src/ltran/ltran_stat.h -index 3bef714..494c83e 100644 ---- a/src/ltran/ltran_stat.h -+++ b/src/ltran/ltran_stat.h -@@ -13,10 +13,11 @@ - #ifndef __GAZELLE_STAT_H__ - #define __GAZELLE_STAT_H__ - --#include - #include - --#include "ltran_base.h" -+#include -+ -+#include "gazelle_opt.h" - - /* - * When doing reads from the NIC or the client queues, -@@ -105,7 +106,7 @@ struct gazelle_stat_lstack_total { - - /* forward statistics structure */ - struct statistics { -- struct gazelle_stat_ltran_port port_stats[RTE_MAX_ETHPORTS]; -+ struct gazelle_stat_ltran_port port_stats[GAZELLE_MAX_ETHPORTS]; - }; - - /* ltran statistics structure */ -@@ -116,7 +117,7 @@ struct gazelle_stat_ltran_total { - - struct gazelle_stat_ltran_ip { - uint32_t ip_num; -- struct in_addr ip_list[GAZELLE_MAX_CLIENT]; -+ struct in_addr ip_list[GAZELLE_CLIENT_NUM_ALL]; - }; - - struct gazelle_stat_client_info { -@@ -131,7 +132,7 @@ struct gazelle_stat_client_info { - - struct gazelle_stat_ltran_client { - uint32_t client_num; -- struct gazelle_stat_client_info client_info[GAZELLE_MAX_CLIENT]; -+ struct gazelle_stat_client_info client_info[GAZELLE_CLIENT_NUM_ALL]; - }; - - int32_t get_start_latency_flag(void); -@@ -142,6 +143,7 @@ void set_ltran_stop_flag(int32_t flag); - int32_t get_ltran_stop_flag(void); - struct statistics *get_statistics(void); - -+struct gazelle_stat_msg_request; - void handle_resp_ltran_latency(int32_t fd); - void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg); - void handle_resp_ltran_sock(int32_t fd); -diff --git a/src/ltran/ltran_tcp_conn.c b/src/ltran/ltran_tcp_conn.c -index 0bc7589..faa42e1 100644 ---- a/src/ltran/ltran_tcp_conn.c -+++ b/src/ltran/ltran_tcp_conn.c -@@ -10,7 +10,11 @@ - * See the Mulan PSL v2 for more details. - */ - -+#include -+ - #include -+ -+#include "ltran_jhash.h" - #include "ltran_instance.h" - #include "ltran_tcp_conn.h" - -diff --git a/src/ltran/ltran_tcp_conn.h b/src/ltran/ltran_tcp_conn.h -index 2e11b07..2b6e6ea 100644 ---- a/src/ltran/ltran_tcp_conn.h -+++ b/src/ltran/ltran_tcp_conn.h -@@ -14,9 +14,10 @@ - #define __GAZELLE_TCP_CONN_H__ - - #include --#include "gazelle_reg_msg.h" --#include "ltran_stack.h" --#include "ltran_tcp_sock.h" -+#include -+#include -+ -+#include "gazelle_opt.h" - - struct gazelle_tcp_conn { - uint32_t tid; -diff --git a/src/ltran/ltran_tcp_sock.c b/src/ltran/ltran_tcp_sock.c -index c107196..e3b696b 100644 ---- a/src/ltran/ltran_tcp_sock.c -+++ b/src/ltran/ltran_tcp_sock.c -@@ -10,10 +10,16 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_tcp_sock.h" -+#include -+ -+#include -+ - #include "ltran_tcp_conn.h" - #include "ltran_instance.h" -+#include "ltran_base.h" -+#include "ltran_jhash.h" - #include "gazelle_base_func.h" -+#include "ltran_tcp_sock.h" - - struct gazelle_tcp_sock_htable *g_tcp_sock_htable = NULL; - struct gazelle_tcp_sock_htable *gazelle_get_tcp_sock_htable(void) -@@ -139,11 +145,10 @@ struct gazelle_tcp_sock *gazelle_sock_add_by_ipporttid(struct gazelle_tcp_sock_h - return NULL; - } - -- tcp_sock = malloc(sizeof(struct gazelle_tcp_sock)); -+ tcp_sock = calloc(1, sizeof(struct gazelle_tcp_sock)); - if (tcp_sock == NULL) { - return NULL; - } -- (void)memset_s(tcp_sock, sizeof(struct gazelle_tcp_sock), 0, sizeof(*tcp_sock)); - - tcp_sock->ip = ip; - tcp_sock->tid = tid; -@@ -159,7 +164,7 @@ struct gazelle_tcp_sock *gazelle_sock_add_by_ipporttid(struct gazelle_tcp_sock_h - return tcp_sock; - } - --int32_t gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_htable, uint32_t ip, uint16_t port, -+void gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_htable, uint32_t ip, uint16_t port, - uint32_t tid) - { - struct gazelle_tcp_sock *tcp_sock = NULL; -@@ -169,7 +174,7 @@ int32_t gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_h - - tcp_sock_hbucket = gazelle_hbucket_get_by_ipport(tcp_sock_htable, ip, port); - if (tcp_sock_hbucket == NULL) { -- return -1; -+ return; - } - - head = &tcp_sock_hbucket->chain; -@@ -180,14 +185,13 @@ int32_t gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_h - } - - if (tcp_sock == NULL) { -- return -1; -+ return; - } - - hlist_del_init(&tcp_sock->tcp_sock_node); - free(tcp_sock); - tcp_sock_htable->cur_tcp_sock_num--; - tcp_sock_hbucket->chain_size--; -- return 0; - } - - struct gazelle_tcp_sock *gazelle_sock_get_by_min_conn(struct gazelle_tcp_sock_htable *tcp_sock_htable, -diff --git a/src/ltran/ltran_tcp_sock.h b/src/ltran/ltran_tcp_sock.h -index 8172713..a6e9571 100644 ---- a/src/ltran/ltran_tcp_sock.h -+++ b/src/ltran/ltran_tcp_sock.h -@@ -15,8 +15,11 @@ - - #include - #include --#include "ltran_stack.h" -+#include - -+#include "gazelle_opt.h" -+ -+struct gazelle_stack; - struct gazelle_tcp_sock { - // key - uint32_t ip; -@@ -54,7 +57,7 @@ void gazelle_tcp_sock_htable_destroy(void); - struct gazelle_tcp_sock_htable *gazelle_tcp_sock_htable_create(uint32_t max_tcp_sock_num); - struct gazelle_tcp_sock *gazelle_sock_get_by_min_conn(struct gazelle_tcp_sock_htable *tcp_sock_htable, - uint32_t ip, uint16_t port); --int32_t gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_htable, uint32_t ip, uint16_t port, -+void gazelle_sock_del_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_htable, uint32_t ip, uint16_t port, - uint32_t tid); - struct gazelle_tcp_sock *gazelle_sock_add_by_ipporttid(struct gazelle_tcp_sock_htable *tcp_sock_htable, uint32_t ip, - uint16_t port, uint32_t tid); -diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c -index 1327203..3ee266c 100644 ---- a/src/ltran/ltran_timer.c -+++ b/src/ltran/ltran_timer.c -@@ -10,18 +10,20 @@ - * See the Mulan PSL v2 for more details. - */ - --#include "ltran_timer.h" -- - #include - #include -+ - #include - #include - #include -+#include - - #include "ltran_param.h" - #include "ltran_log.h" - #include "ltran_tcp_sock.h" -+#include "ltran_tcp_conn.h" - #include "ltran_instance.h" -+#include "ltran_timer.h" - - static uint64_t g_cycles_per_us = 0; - -diff --git a/src/ltran/ltran_timer.h b/src/ltran/ltran_timer.h -index 2cfc19a..abc08b9 100644 ---- a/src/ltran/ltran_timer.h -+++ b/src/ltran/ltran_timer.h -@@ -13,8 +13,8 @@ - #ifndef __GAZELLE_TIMER_H__ - #define __GAZELLE_TIMER_H__ - --#include "ltran_tcp_conn.h" --#include "ltran_tcp_sock.h" -+struct gazelle_tcp_conn_htable; -+struct gazelle_tcp_sock_htable; - - unsigned long get_current_time(void); - void calibrate_time(void); -diff --git a/src/ltran/main.c b/src/ltran/main.c -index 328ca89..691595e 100644 ---- a/src/ltran/main.c -+++ b/src/ltran/main.c -@@ -19,9 +19,10 @@ - #include - - #include "dpdk_common.h" --#include "ltran_config.h" - #include "ltran_log.h" -+#include "ltran_param.h" - #include "ltran_stat.h" -+#include "ltran_stack.h" - #include "ltran_ethdev.h" - #include "ltran_instance.h" - #include "ltran_monitor.h" -@@ -108,7 +109,13 @@ static int32_t ltran_core_init(int32_t argc, char *argv[]) - return ret; - } - -- set_instance_mgr(gazelle_instance_mgr_create()); -+ struct gazelle_instance_mgr *mgr = gazelle_instance_mgr_create(); -+ if (mgr == NULL) { -+ syslog(LOG_ERR, "create gazelle_instance_mgr failed\n"); -+ closelog(); -+ return -1; -+ } -+ set_instance_mgr(mgr); - gazelle_set_stack_htable(gazelle_stack_htable_create(GAZELLE_MAX_STACK_NUM)); - gazelle_set_tcp_conn_htable(gazelle_tcp_conn_htable_create(GAZELLE_MAX_CONN_NUM)); - gazelle_set_tcp_sock_htable(gazelle_tcp_sock_htable_create(GAZELLE_MAX_TCP_SOCK_NUM)); --- -2.23.0 - diff --git a/0069-clean-code.patch b/0069-clean-code.patch deleted file mode 100644 index aee8340..0000000 --- a/0069-clean-code.patch +++ /dev/null @@ -1,1163 +0,0 @@ -From 212a9409b71d6699607388a3ae27e59097cce2e4 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 14 Jul 2022 22:57:05 +0800 -Subject: [PATCH 16/19] clean code - ---- - examples/inc/parameter.h | 15 +- - examples/inc/utilities.h | 4 +- - examples/main.c | 2 - - examples/src/parameter.c | 79 +- - src/lstack/core/lstack_protocol_stack.c.orig | 825 ------------------- - 5 files changed, 55 insertions(+), 870 deletions(-) - delete mode 100644 src/lstack/core/lstack_protocol_stack.c.orig - -diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h -index fe0dce0..d25a13a 100644 ---- a/examples/inc/parameter.h -+++ b/examples/inc/parameter.h -@@ -29,8 +29,7 @@ - #define PARAM_DEFAULT_VERIFY (false) ///< default flag of message verifying - #define PARAM_DEFAULT_RINGPMD (false) ///< default flag of ring PMD of dpdk - --enum --{ -+enum { - #define PARAM_NAME_AS ("as") ///< name of parameter type - PARAM_NUM_AS = 'a', - #define PARAM_NAME_IP ("ip") ///< name of parameter IP -@@ -64,8 +63,7 @@ enum - * @brief program option description - * The program option description. - */ --struct ProgramOption --{ -+struct ProgramOption { - const char *name; ///< name of program option - int32_t has_arg; ///< whether program option takes an argument, one of no, required, and optional - int32_t *flag; ///< if not `NULL`, set `*flag` to `val` when option found -@@ -76,8 +74,7 @@ struct ProgramOption - * @brief porgram parameter - * The porgram's parameters. - */ --struct ProgramParams --{ -+struct ProgramParams { - char* as; ///< as server or client - char* ip; ///< IP address - uint32_t port; ///< port -@@ -93,7 +90,7 @@ struct ProgramParams - - /** - * @brief initialize the parameters -- * This function initializes the parameters of main function. -+ * This function initializes the parameters of main function. - * @param params the parameters pointer - */ - void program_params_init(struct ProgramParams *params); -@@ -106,7 +103,7 @@ void program_params_help(void); - - /** - * @brief parse the parameters -- * This function parses the parameters of main function. -+ * This function parses the parameters of main function. - * @param params the parameters pointer - * @param argc the count of arguments - * @param argv the value of arguments -@@ -116,7 +113,7 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char * - - /** - * @brief print the parameters -- * This function prints the parameters of main function. -+ * This function prints the parameters of main function. - * @param params the parameters pointer - */ - void program_params_print(struct ProgramParams *params); -diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h -index b594469..f9064c5 100644 ---- a/examples/inc/utilities.h -+++ b/examples/inc/utilities.h -@@ -40,13 +40,13 @@ - printf("\n[error]: "); \ - printf(format, ##__VA_ARGS__); \ - printf("\n"); \ -- } while(0) -+ } while (0) - #define PRINT_WARNNING(format, ...) do \ - { \ - printf("\n[warnning]: "); \ - printf(format, ##__VA_ARGS__); \ - printf("\n"); \ -- } while(0) -+ } while (0) - #define PRINT_SERVER(format, ...) do \ - { \ - printf(": "); \ -diff --git a/examples/main.c b/examples/main.c -index a7daded..f050dc5 100644 ---- a/examples/main.c -+++ b/examples/main.c -@@ -10,11 +10,9 @@ - * See the Mulan PSL v2 for more details. - */ - -- - #include "utilities.h" - #include "parameter.h" - -- - static struct ProgramParams prog_params; - - -diff --git a/examples/src/parameter.c b/examples/src/parameter.c -index ff3bcbc..996188b 100644 ---- a/examples/src/parameter.c -+++ b/examples/src/parameter.c -@@ -30,8 +30,7 @@ const char prog_short_opts[] = \ - ; - - // program long options --const struct ProgramOption prog_long_opts[] = \ --{ -+const struct ProgramOption prog_long_opts[] = { \ - {PARAM_NAME_AS, REQUIRED_ARGUMETN, NULL, PARAM_NUM_AS}, - {PARAM_NAME_IP, REQUIRED_ARGUMETN, NULL, PARAM_NUM_IP}, - {PARAM_NAME_PORT, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PORT}, -@@ -47,35 +46,40 @@ const struct ProgramOption prog_long_opts[] = \ - - - // get long options --int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, int *long_idx); -+int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, -+ int *long_idx); - - - // set `as` parameter --void program_param_prase_as(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_as(struct ProgramParams *params, char *arg, const char *name) - { - if (strcmp(arg, "server") == 0 || strcmp(arg, "client") == 0) { - params->as = arg; - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `ip` parameter --void program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name) - { - if (inet_addr(arg) != INADDR_NONE) { - params->ip = arg; - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `port` parameter --void program_param_prase_port(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_port(struct ProgramParams *params, char *arg, const char *name) - { - int32_t port_arg = atoi(optarg); - if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX) == true) { -@@ -83,24 +87,28 @@ void program_param_prase_port(struct ProgramParams *params, char *arg, const cha - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `model` parameter --void program_param_prase_model(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_model(struct ProgramParams *params, char *arg, const char *name) - { - if (strcmp(optarg, "mum") == 0 || strcmp(optarg, "mud") == 0) { - params->model = optarg; - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `connect_num` parameter --void program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name) - { - int32_t connectnum_arg = atoi(optarg); - if (connectnum_arg > 0) { -@@ -108,12 +116,14 @@ void program_param_prase_connectnum(struct ProgramParams *params, char *arg, con - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `thread_num` parameter --void program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name) - { - int32_t threadnum_arg = atoi(optarg); - if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX) == true) { -@@ -121,24 +131,28 @@ void program_param_prase_threadnum(struct ProgramParams *params, char *arg, cons - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `api` parameter --void program_param_prase_api(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_api(struct ProgramParams *params, char *arg, const char *name) - { - if (strcmp(optarg, "unix") == 0 || strcmp(optarg, "posix") == 0) { - params->api = optarg; - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // set `pktlen` parameter --void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name) -+int32_t program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name) - { - int32_t pktlen_arg = atoi(optarg); - if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX) == true) { -@@ -146,8 +160,10 @@ void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const c - } - else { - PRINT_ERROR("illigal argument -- %s \n", name); -- exit(PROGRAM_ABORT); -+ return PROGRAM_ABORT; - } -+ -+ return PROGRAM_OK; - } - - // initialize the parameters -@@ -192,41 +208,40 @@ void program_params_help(void) - // parse the parameters - int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[]) - { -- int32_t c; -+ int32_t ret = PROGRAM_OK; - -- while (true) { -+ while (ret == PROGRAM_OK) { - int32_t opt_idx = 0; - -- c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); -- -+ int32_t c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); - if (c == -1) { - break; - } - - switch (c) { - case (PARAM_NUM_AS): -- program_param_prase_as(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_as(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_IP): -- program_param_prase_ip(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_ip(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_PORT): -- program_param_prase_port(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_port(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_MODEL): -- program_param_prase_model(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_model(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_CONNECT_NUM): -- program_param_prase_connectnum(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_connectnum(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_THREAD_NUM): -- program_param_prase_threadnum(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_threadnum(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_API): -- program_param_prase_api(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_api(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_PKTLEN): -- program_param_prase_pktlen(params, optarg, prog_long_opts[opt_idx].name); -+ ret = program_param_prase_pktlen(params, optarg, prog_long_opts[opt_idx].name); - break; - case (PARAM_NUM_VERIFY): - params->verify = true; -@@ -245,7 +260,7 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char * - } - } - -- return PROGRAM_OK; -+ return ret; - } - - // print the parameters -diff --git a/src/lstack/core/lstack_protocol_stack.c.orig b/src/lstack/core/lstack_protocol_stack.c.orig -deleted file mode 100644 -index 4755b8a..0000000 ---- a/src/lstack/core/lstack_protocol_stack.c.orig -+++ /dev/null -@@ -1,825 +0,0 @@ --/* --* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. --* gazelle is licensed under the Mulan PSL v2. --* You can use this software according to the terms and conditions of the Mulan PSL v2. --* You may obtain a copy of Mulan PSL v2 at: --* http://license.coscl.org.cn/MulanPSL2 --* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR --* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR --* PURPOSE. --* See the Mulan PSL v2 for more details. --*/ --#define _GNU_SOURCE --#include --#include -- --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#include "gazelle_base_func.h" --#include "lstack_thread_rpc.h" --#include "dpdk_common.h" --#include "lstack_log.h" --#include "lstack_lwip.h" --#include "lstack_protocol_stack.h" --#include "lstack_cfg.h" --#include "lstack_control_plane.h" --#include "posix/lstack_epoll.h" --#include "lstack_stack_stat.h" -- --#define READ_LIST_MAX 32 --#define SEND_LIST_MAX 32 --#define HANDLE_RPC_MSG_MAX 32 --#define KERNEL_EPOLL_MAX 256 -- --static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; --static struct protocol_stack_group g_stack_group = {0}; -- --void set_init_fail(void); --typedef void *(*stack_thread_func)(void *arg); -- -- --int32_t bind_to_stack_numa(struct protocol_stack *stack) --{ -- int32_t ret; -- pthread_t tid = pthread_self(); -- -- ret = pthread_setaffinity_np(tid, sizeof(stack->idle_cpuset), &stack->idle_cpuset); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %d failed\n", rte_gettid(), stack->queue_id); -- return -1; -- } -- -- return 0; --} -- --static inline void set_stack_idx(uint16_t idx) --{ -- g_stack_idx = idx; --} -- --long get_stack_tid(void) --{ -- static PER_THREAD int32_t g_stack_tid = 0; -- -- if (g_stack_tid == 0) { -- g_stack_tid = rte_gettid(); -- } -- -- return g_stack_tid; --} -- --struct protocol_stack_group *get_protocol_stack_group(void) --{ -- return &g_stack_group; --} -- --struct protocol_stack *get_protocol_stack(void) --{ -- if (g_stack_idx >= PROTOCOL_STACK_MAX) { -- return NULL; -- } -- return g_stack_group.stacks[g_stack_idx]; --} -- --struct protocol_stack *get_protocol_stack_by_fd(int32_t fd) --{ -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- return NULL; -- } -- -- return sock->stack; --} -- --struct protocol_stack *get_bind_protocol_stack(void) --{ -- static PER_THREAD struct protocol_stack *bind_stack = NULL; -- -- /* same app communication thread bind same stack */ -- if (bind_stack) { -- return bind_stack; -- } -- -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- uint16_t index = 0; -- -- /* close listen shadow, per app communication thread select only one stack */ -- if (get_global_cfg_params()->listen_shadow == false) { -- static uint16_t stack_index = 0; -- index = atomic_fetch_add(&stack_index, 1); -- if (index >= stack_group->stack_num) { -- LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num); -- return NULL; -- } -- /* use listen shadow, app communication thread maybe more than stack num, select the least load stack */ -- } else { -- for (uint16_t i = 1; i < stack_group->stack_num; i++) { -- if (stack_group->stacks[i]->conn_num < stack_group->stacks[index]->conn_num) { -- index = i; -- } -- } -- } -- -- bind_stack = stack_group->stacks[index]; -- return stack_group->stacks[index]; --} -- --static uint32_t get_protocol_traffic(struct protocol_stack *stack) --{ -- if (use_ltran()) { -- return rte_ring_count(stack->rx_ring) + rte_ring_count(stack->tx_ring); -- } -- -- /* only lstack mode, have not appropriate method to get traffic */ -- return LSTACK_LPM_RX_PKTS + 1; --} -- --void low_power_idling(struct protocol_stack *stack) --{ -- static PER_THREAD uint32_t last_cycle_ts = 0; -- static PER_THREAD uint64_t last_cycle_pkts = 0; -- struct timespec st = { -- .tv_sec = 0, -- .tv_nsec = 1 -- }; -- -- /* CPU delegation strategy in idling scenarios: -- 1. In the detection period, if the number of received packets is less than the threshold, -- set the CPU decentralization flag; -- 2. If the number of received packets exceeds the threshold, the authorization mark will end; -- 3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */ -- if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) { -- nanosleep(&st, &st); -- stack->low_power = true; -- return; -- } -- -- if (last_cycle_ts == 0) { -- last_cycle_ts = sys_now(); -- } -- -- uint64_t now_pkts = get_protocol_stack()->stats.rx; -- uint32_t now_ts = sys_now(); -- if (((now_ts - last_cycle_ts) > LSTACK_LPM_DETECT_MS) || -- ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) { -- if ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT) { -- stack->low_power = true; -- } else { -- stack->low_power = false; -- } -- -- last_cycle_ts = now_ts; -- last_cycle_pkts = now_pkts; -- } -- -- if (stack->low_power) { -- nanosleep(&st, &st); -- } --} -- --static int32_t create_thread(uint16_t queue_id, char *thread_name, stack_thread_func func) --{ -- /* thread may run slow, if arg is temp var maybe have relese */ -- static uint16_t queue[PROTOCOL_STACK_MAX]; -- char name[PATH_MAX]; -- pthread_t tid; -- int32_t ret; -- -- if (queue_id >= PROTOCOL_STACK_MAX) { -- LSTACK_LOG(ERR, LSTACK, "queue_id is %hu exceed max=%d\n", queue_id, PROTOCOL_STACK_MAX); -- return -1; -- } -- queue[queue_id] = queue_id; -- -- ret = sprintf_s(name, sizeof(name), "%s%02hu", thread_name, queue[queue_id]); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "set name failed\n"); -- return -1; -- } -- -- ret = pthread_create(&tid, NULL, func, &queue[queue_id]); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "pthread_create ret=%d\n", ret); -- return -1; -- } -- -- ret = pthread_setname_np(tid, name); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "pthread_setname_np name=%s ret=%d errno=%d\n", name, ret, errno); -- return -1; -- } -- -- return 0; --} -- --static void* gazelle_wakeup_thread(void *arg) --{ -- uint16_t queue_id = *(uint16_t *)arg; -- struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -- -- struct cfg_params *cfg = get_global_cfg_params(); -- int32_t lcore_id = cfg->wakeup[stack->queue_id]; -- thread_affinity_init(lcore_id); -- -- struct timespec st = { -- .tv_sec = 0, -- .tv_nsec = 1 -- }; -- -- LSTACK_LOG(INFO, LSTACK, "weakup_%02hu start\n", stack->queue_id); -- -- for (;;) { -- if (cfg->low_power_mod != 0 && stack->low_power) { -- nanosleep(&st, &st); -- } -- -- sem_t *event_sem[WAKEUP_MAX_NUM]; -- uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -- for (uint32_t i = 0; i < num; i++) { -- sem_post(event_sem[i]); -- } -- } -- -- return NULL; --} -- --static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) --{ -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- memset_s(stack, sizeof(*stack), 0, sizeof(*stack)); -- -- set_stack_idx(queue_id); -- stack->tid = rte_gettid(); -- stack->queue_id = queue_id; -- stack->port_id = stack_group->port_id; -- stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; -- stack->lwip_stats = &lwip_stats; -- -- init_list_node(&stack->recv_list); -- init_list_node(&stack->send_list); -- -- sys_calibrate_tsc(); -- stack_stat_init(); -- -- stack_group->stacks[queue_id] = stack; -- -- cpu_set_t cpuset; -- CPU_ZERO(&cpuset); -- CPU_SET(stack->cpu_id, &cpuset); -- if (rte_thread_set_affinity(&cpuset) != 0) { -- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -- return -1; -- } -- RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -- -- stack->socket_id = numa_node_of_cpu(stack->cpu_id); -- if (stack->socket_id < 0) { -- LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n"); -- return -1; -- } -- -- if (pktmbuf_pool_init(stack, stack_group->stack_num) != 0) { -- return -1; -- } -- -- if (create_shared_ring(stack) != 0) { -- return -1; -- } -- -- return 0; --} -- --static void* gazelle_kernel_event(void *arg) --{ -- uint16_t queue_id = *(uint16_t *)arg; -- -- int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); -- if (epoll_fd < 0) { -- LSTACK_LOG(ERR, LSTACK, "queue_id=%d epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -- /* exit in main thread, avoid create mempool and exit at the same time */ -- set_init_fail(); -- sem_post(&get_protocol_stack_group()->all_init); -- return NULL; -- } -- -- struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -- stack->epollfd = epoll_fd; -- -- sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(INFO, LSTACK, "kernel_event_%02hu start\n", stack->queue_id); -- -- struct epoll_event events[KERNEL_EPOLL_MAX]; -- for (;;) { -- int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1); -- if (event_num <= 0) { -- continue; -- } -- -- for (int32_t i = 0; i < event_num; i++) { -- struct wakeup_poll *wakeup = events[i].data.ptr; -- if (wakeup) { -- __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE); -- sem_post(&wakeup->event_sem); -- } -- } -- } -- -- return NULL; --} -- --static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack) --{ -- int32_t ret; -- -- if (stack_group->wakeup_enable) { -- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); -- return ret; -- } -- } -- -- ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -- } -- return ret; --} -- --void wait_sem_value(sem_t *sem, int32_t wait_value) --{ -- int32_t sem_val; -- do { -- sem_getvalue(sem, &sem_val); -- } while (sem_val < wait_value); --} -- --static struct protocol_stack * stack_thread_init(uint16_t queue_id) --{ -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- struct protocol_stack *stack = malloc(sizeof(*stack)); -- if (stack == NULL) { -- LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); -- return NULL; -- } -- -- if (init_stack_value(stack, queue_id) != 0) { -- free(stack); -- return NULL; -- } -- -- thread_affinity_init(stack->cpu_id); -- -- hugepage_init(); -- -- tcpip_init(NULL, NULL); -- -- if (use_ltran()) { -- if (client_reg_thrd_ring() != 0) { -- free(stack); -- return NULL; -- } -- } -- -- sem_post(&stack_group->thread_phase1); -- -- if (!use_ltran()) { -- wait_sem_value(&stack_group->ethdev_init, 1); -- } -- -- if (ethdev_init(stack) != 0) { -- free(stack); -- return NULL; -- } -- -- if (create_companion_thread(stack_group, stack) != 0) { -- free(stack); -- return NULL; -- } -- -- return stack; --} -- --static void* gazelle_stack_thread(void *arg) --{ -- uint16_t queue_id = *(uint16_t *)arg; -- -- struct protocol_stack *stack = stack_thread_init(queue_id); -- if (stack == NULL) { -- /* exit in main thread, avoid create mempool and exit at the same time */ -- set_init_fail(); -- sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%hu\n", queue_id); -- return NULL; -- } -- -- sem_post(&get_protocol_stack_group()->all_init); -- LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); -- -- for (;;) { -- poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); -- -- eth_dev_poll(); -- -- read_recv_list(stack, READ_LIST_MAX); -- -- send_stack_list(stack, SEND_LIST_MAX); -- -- sys_timer_run(); -- -- if (get_global_cfg_params()->low_power_mod != 0) { -- low_power_idling(stack); -- } -- } -- -- return NULL; --} -- --static int32_t init_protocol_sem(void) --{ -- int32_t ret; -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- pthread_spin_init(&stack_group->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -- -- if (!use_ltran()) { -- ret = sem_init(&stack_group->ethdev_init, 0, 0); -- if (ret < 0) { -- LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -- return -1; -- } -- } -- -- ret = sem_init(&stack_group->thread_phase1, 0, 0); -- if (ret < 0) { -- LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -- return -1; -- } -- -- ret = sem_init(&stack_group->all_init, 0, 0); -- if (ret < 0) { -- LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno); -- return -1; -- } -- -- return 0; --} -- --int32_t init_protocol_stack(void) --{ -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- int32_t ret; -- -- stack_group->stack_num = get_global_cfg_params()->num_cpu; -- stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -- stack_group->wakeup_list = NULL; -- -- if (init_protocol_sem() != 0) { -- return -1; -- } -- -- for (uint32_t i = 0; i < stack_group->stack_num; i++) { -- ret = create_thread(i, "gazellestack", gazelle_stack_thread); -- if (ret != 0) { -- return ret; -- } -- } -- -- wait_sem_value(&stack_group->thread_phase1, stack_group->stack_num); -- -- ret = init_stack_numa_cpuset(); -- if (ret < 0) { -- return -1; -- } -- -- return 0; --} -- --void stack_arp(struct rpc_msg *msg) --{ -- struct rte_mbuf *mbuf = (struct rte_mbuf *)msg->args[MSG_ARG_0].p; -- -- eth_dev_recv(mbuf); --} -- --void stack_socket(struct rpc_msg *msg) --{ -- msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); -- if (msg->result < 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); -- } --} -- --void stack_close(struct rpc_msg *msg) --{ -- int32_t fd = msg->args[MSG_ARG_0].i; -- -- msg->result = lwip_close(fd); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } -- -- gazelle_clean_sock(fd); -- -- posix_api->close_fn(fd); --} -- --void stack_bind(struct rpc_msg *msg) --{ -- msg->result = lwip_bind(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].socklen); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_listen(struct rpc_msg *msg) --{ -- int32_t fd = msg->args[MSG_ARG_0].i; -- int32_t backlog = msg->args[MSG_ARG_1].i; -- -- struct lwip_sock *sock = get_socket_by_fd(fd); -- if (sock == NULL) { -- msg->result = -1; -- return; -- } -- -- /* new listen add to stack listen list */ -- msg->result = lwip_listen(fd, backlog); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_accept(struct rpc_msg *msg) --{ -- int32_t fd = msg->args[MSG_ARG_0].i; -- msg->result = -1; -- -- int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (accept_fd < 0) { -- LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -- return; -- } -- -- struct lwip_sock *sock = get_socket(accept_fd); -- if (sock == NULL || sock->stack == NULL) { -- lwip_close(accept_fd); -- gazelle_clean_sock(accept_fd); -- posix_api->close_fn(accept_fd); -- LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); -- return; -- } -- -- msg->result = accept_fd; -- if (rte_ring_count(sock->conn->recvmbox->ring)) { -- add_recv_list(accept_fd); -- } --} -- --void stack_connect(struct rpc_msg *msg) --{ -- msg->result = lwip_connect(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].socklen); -- if (msg->result < 0) { -- msg->result = -errno; -- } --} -- --void stack_getpeername(struct rpc_msg *msg) --{ -- msg->result = lwip_getpeername(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_getsockname(struct rpc_msg *msg) --{ -- msg->result = lwip_getsockname(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_getsockopt(struct rpc_msg *msg) --{ -- msg->result = lwip_getsockopt(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i, -- msg->args[MSG_ARG_3].p, msg->args[MSG_ARG_4].p); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_setsockopt(struct rpc_msg *msg) --{ -- msg->result = lwip_setsockopt(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i, -- msg->args[MSG_ARG_3].cp, msg->args[MSG_ARG_4].socklen); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_fcntl(struct rpc_msg *msg) --{ -- msg->result = lwip_fcntl(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].l); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_ioctl(struct rpc_msg *msg) --{ -- msg->result = lwip_ioctl(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].l, msg->args[MSG_ARG_2].p); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_recv(struct rpc_msg *msg) --{ -- msg->result = lwip_recv(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].size, -- msg->args[MSG_ARG_3].i); --} -- --void stack_sendmsg(struct rpc_msg *msg) --{ -- msg->result = lwip_sendmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].i); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_recvmsg(struct rpc_msg *msg) --{ -- msg->result = lwip_recvmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].i); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --/* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */ --void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack) --{ -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- struct rte_mbuf *mbuf_copy = NULL; -- struct protocol_stack *stack = NULL; -- int32_t ret; -- -- for (int32_t i = 0; i < stack_group->stack_num; i++) { -- stack = stack_group->stacks[i]; -- if (cur_stack == stack) { -- continue; -- } -- -- ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); -- if (ret != 0) { -- stack->stats.rx_allocmbuf_fail++; -- return; -- } -- copy_mbuf(mbuf_copy, mbuf); -- -- ret = rpc_call_arp(stack, mbuf_copy); -- if (ret != 0) { -- return; -- } -- } --} -- --/* when fd is listenfd, listenfd of all protocol stack thread will be closed */ --int32_t stack_broadcast_close(int32_t fd) --{ -- struct lwip_sock *sock = get_socket(fd); -- int32_t ret = 0; -- -- do { -- sock = sock->listen_next; -- if (rpc_call_close(fd)) { -- ret = -1; -- } -- -- if (sock == NULL) { -- break; -- } -- fd = sock->conn->socket; -- } while (sock); -- -- return ret; --} -- --/* choice one stack listen */ --int32_t stack_single_listen(int32_t fd, int32_t backlog) --{ -- return rpc_call_listen(fd, backlog); --} -- --/* listen sync to all protocol stack thread, so that any protocol stack thread can build connect */ --int32_t stack_broadcast_listen(int32_t fd, int32_t backlog) --{ -- struct protocol_stack *cur_stack = get_protocol_stack_by_fd(fd); -- struct protocol_stack *stack = NULL; -- struct sockaddr addr; -- socklen_t addr_len = sizeof(addr); -- int32_t ret, clone_fd; -- -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %d get sock null\n", get_stack_tid(), fd); -- GAZELLE_RETURN(EINVAL); -- } -- -- ret = rpc_call_getsockname(fd, &addr, &addr_len); -- if (ret != 0) { -- return ret; -- } -- -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- for (int32_t i = 0; i < stack_group->stack_num; ++i) { -- stack = stack_group->stacks[i]; -- if (stack != cur_stack) { -- clone_fd = rpc_call_shadow_fd(stack, fd, &addr, sizeof(addr)); -- if (clone_fd < 0) { -- stack_broadcast_close(fd); -- return clone_fd; -- } -- } else { -- clone_fd = fd; -- } -- -- ret = rpc_call_listen(clone_fd, backlog); -- if (ret < 0) { -- stack_broadcast_close(fd); -- return ret; -- } -- } -- return 0; --} -- --static struct lwip_sock *get_min_accept_sock(int32_t fd) --{ -- struct lwip_sock *sock = get_socket(fd); -- struct lwip_sock *min_sock = NULL; -- -- while (sock) { -- if (!NETCONN_IS_ACCEPTIN(sock)) { -- sock = sock->listen_next; -- continue; -- } -- -- if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) { -- min_sock = sock; -- } -- -- sock = sock->listen_next; -- } -- -- return min_sock; --} -- --static void inline del_accept_in_event(struct lwip_sock *sock) --{ -- pthread_spin_lock(&sock->wakeup->event_list_lock); -- -- if (!NETCONN_IS_ACCEPTIN(sock)) { -- sock->events &= ~EPOLLIN; -- if (sock->events == 0) { -- list_del_node_null(&sock->event_list); -- } -- } -- -- pthread_spin_unlock(&sock->wakeup->event_list_lock); --} -- --/* ergodic the protocol stack thread to find the connection, because all threads are listening */ --int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) --{ -- int32_t ret = -1; -- -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- errno = EINVAL; -- return -1; -- } -- -- struct lwip_sock *min_sock = get_min_accept_sock(fd); -- if (min_sock && min_sock->conn) { -- ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen); -- } -- -- if (min_sock && min_sock->wakeup && min_sock->wakeup->type == WAKEUP_EPOLL) { -- del_accept_in_event(min_sock); -- } -- -- if (ret < 0) { -- errno = EAGAIN; -- } -- return ret; --} --- -2.23.0 - diff --git a/0070-Support-build-gazelle-with-clang.patch b/0070-Support-build-gazelle-with-clang.patch deleted file mode 100644 index bdfd77c..0000000 --- a/0070-Support-build-gazelle-with-clang.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 6331e41c9b6abf156a8de3c87c09131c6d3d84ba Mon Sep 17 00:00:00 2001 -From: Honggang LI -Date: Fri, 15 Jul 2022 12:18:43 +0800 -Subject: [PATCH 17/19] Support build gazelle with clang - -Execute following bash command to build gazelle with clang: - -$ VERBOSE=1 CC=clang sh build/build.sh - -Signed-off-by: Honggang LI ---- - src/common/dpdk_common.h | 2 +- - src/common/gazelle_base_func.h | 3 +++ - src/lstack/Makefile | 8 ++++++-- - src/lstack/api/lstack_epoll.c | 2 +- - src/lstack/core/lstack_lwip.c | 2 +- - src/lstack/core/lstack_protocol_stack.c | 2 +- - src/lstack/core/lstack_thread_rpc.c | 2 +- - src/ltran/CMakeLists.txt | 6 +++++- - src/ltran/ltran_stack.c | 2 +- - 9 files changed, 20 insertions(+), 9 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 493b435..01c941d 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -29,7 +29,7 @@ - struct pbuf; - static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) - { -- return ((struct rte_mbuf *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE)); -+ return ((struct rte_mbuf *)(void *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE)); - } - static inline struct pbuf_custom *mbuf_to_pbuf(struct rte_mbuf *m) - { -diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h -index 9d7381e..fe3411a 100644 ---- a/src/common/gazelle_base_func.h -+++ b/src/common/gazelle_base_func.h -@@ -32,4 +32,7 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); - - int32_t check_and_set_run_dir(void); - -+#undef container_of -+#define container_of(ptr, type, field) ((type *)(void*)(((char *)(ptr)) - offsetof(type, field))) -+ - #endif /* ifndef __GAZELLE_BASE_FUNC_H__ */ -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index 98289d8..0fb4405 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -16,12 +16,16 @@ LIB_PATH ?= /usr/lib64 - - AR = ar - ARFLAGS = crDP --CC = gcc -+CC ?= gcc - OPTIMIZATION = -O2 -g - RM = rm -f - LDFLAGS = -shared -ldl -lm -lpthread -lrt -lnuma -lconfig -lboundscheck - --SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2 -+ifeq ($(CC),gcc) -+ SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2 -+else ifeq($(CC),clang) -+ SEC_FLAGS = -fstack-protector-strong -Werror -Wall -fPIC -+endif - - INC = -I$(LSTACK_DIR)/include \ - -I$(LSTACK_DIR)/../common \ -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 06a099d..310a0e7 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -187,7 +187,7 @@ static uint16_t find_max_cnt_stack(int32_t *stack_count, uint16_t stack_num, str - } - - /* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0. */ -- static uint16_t tick = 0; -+ static _Atomic uint16_t tick = 0; - if (all_same_cnt && stack_num) { - max_index = atomic_fetch_add(&tick, 1) % stack_num; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 9f51ebd..4c2f0ea 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -104,7 +104,7 @@ static void replenish_send_idlembuf(struct rte_ring *ring) - - void gazelle_init_sock(int32_t fd) - { -- static uint32_t name_tick = 0; -+ static _Atomic uint32_t name_tick = 0; - struct protocol_stack *stack = get_protocol_stack(); - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 577711a..a2dd62c 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -113,7 +113,7 @@ struct protocol_stack *get_bind_protocol_stack(void) - - /* close listen shadow, per app communication thread select only one stack */ - if (get_global_cfg_params()->listen_shadow == false) { -- static uint16_t stack_index = 0; -+ static _Atomic uint16_t stack_index = 0; - index = atomic_fetch_add(&stack_index, 1); - if (index >= stack_group->stack_num) { - LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num); -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 58c4b05..5a05c82 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -82,7 +82,7 @@ static inline __attribute__((always_inline)) void rpc_msg_free(struct rpc_msg *m - msg->self_release = 0; - msg->func = NULL; - -- atomic_fetch_add(&msg->pool->cons, 1); -+ atomic_fetch_add((_Atomic uint32_t *)&msg->pool->cons, 1); - } - - static inline __attribute__((always_inline)) void rpc_call(lockless_queue *queue, struct rpc_msg *msg) -diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt -index 970bc1b..9c6751c 100644 ---- a/src/ltran/CMakeLists.txt -+++ b/src/ltran/CMakeLists.txt -@@ -14,7 +14,11 @@ project(ltran) - set(COMMON_DIR ${PROJECT_SOURCE_DIR}/../common) - - set(CMAKE_VERBOSE_MAKEFILE ON) --set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC") -+if (CMAKE_C_COMPILER_ID STREQUAL "GNU") -+ set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC") -+elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") -+ set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -fPIE -pthread") -+endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D LTRAN_COMPILE") - - if($ENV{GAZELLE_COVERAGE_ENABLE}) -diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c -index 2049003..4be7c23 100644 ---- a/src/ltran/ltran_stack.c -+++ b/src/ltran/ltran_stack.c -@@ -88,7 +88,7 @@ const struct gazelle_stack *gazelle_stack_get_by_tid(const struct gazelle_stack_ - uint32_t index; - const struct gazelle_stack *stack = NULL; - const struct gazelle_stack_hbucket *stack_hbucket = NULL; -- const struct hlist_node *node = NULL; -+ struct hlist_node *node = NULL; - const struct hlist_head *head = NULL; - - index = tid_hash_fn(tid) % GAZELLE_MAX_STACK_HTABLE_SIZE; --- -2.23.0 - diff --git a/0071-Allow-dynamic-load-PMDs.patch b/0071-Allow-dynamic-load-PMDs.patch deleted file mode 100644 index c00607f..0000000 --- a/0071-Allow-dynamic-load-PMDs.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 15dbe826aef71330043818c9a6c187819823768a Mon Sep 17 00:00:00 2001 -From: Honggang LI -Date: Mon, 18 Jul 2022 10:57:34 +0800 -Subject: [PATCH 18/19] Allow dynamic load PMDs - -Signed-off-by: Honggang LI ---- - src/lstack/Makefile | 52 +++++++++---------- - 1 files changed, 26 insertions(+), 26 deletions(-) - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index 0fb4405..7ce35d4 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -57,32 +57,32 @@ include $(patsubst %, %/dir.mk, $(DIRS)) - OBJS = $(subst .c,.o,$(SRCS)) - - LWIP_LIB = $(LIB_PATH)/liblwip.a --LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.a \ -- $(LIB_PATH)/librte_pci.a \ -- $(LIB_PATH)/librte_cmdline.a \ -- $(LIB_PATH)/librte_hash.a \ -- $(LIB_PATH)/librte_mempool.a \ -- $(LIB_PATH)/librte_mempool_ring.a \ -- $(LIB_PATH)/librte_timer.a \ -- $(LIB_PATH)/librte_eal.a \ -- $(LIB_PATH)/librte_ring.a \ -- $(LIB_PATH)/librte_mbuf.a \ -- $(LIB_PATH)/librte_telemetry.a \ -- $(LIB_PATH)/librte_kni.a \ -- $(LIB_PATH)/librte_net_ixgbe.a \ -- $(LIB_PATH)/librte_kvargs.a \ -- $(LIB_PATH)/librte_net_hinic.a \ -- $(LIB_PATH)/librte_net_i40e.a \ -- $(LIB_PATH)/librte_net_virtio.a \ -- $(LIB_PATH)/librte_bus_vdev.a \ -- $(LIB_PATH)/librte_net.a \ -- $(LIB_PATH)/librte_rcu.a \ -- $(LIB_PATH)/librte_ethdev.a \ -- $(LIB_PATH)/librte_pdump.a \ -- $(LIB_PATH)/librte_bpf.a \ -- $(LIB_PATH)/librte_pcapng.a \ -- $(LIB_PATH)/librte_security.a \ -- $(LIB_PATH)/librte_cryptodev.a -+LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.so \ -+ $(LIB_PATH)/librte_pci.so \ -+ $(LIB_PATH)/librte_cmdline.so \ -+ $(LIB_PATH)/librte_hash.so \ -+ $(LIB_PATH)/librte_mempool.so \ -+ $(LIB_PATH)/librte_mempool_ring.so \ -+ $(LIB_PATH)/librte_timer.so \ -+ $(LIB_PATH)/librte_eal.so \ -+ $(LIB_PATH)/librte_ring.so \ -+ $(LIB_PATH)/librte_mbuf.so \ -+ $(LIB_PATH)/librte_telemetry.so \ -+ $(LIB_PATH)/librte_kni.so \ -+ $(LIB_PATH)/librte_net_ixgbe.so \ -+ $(LIB_PATH)/librte_kvargs.so \ -+ $(LIB_PATH)/librte_net_hinic.so \ -+ $(LIB_PATH)/librte_net_i40e.so \ -+ $(LIB_PATH)/librte_net_virtio.so \ -+ $(LIB_PATH)/librte_bus_vdev.so \ -+ $(LIB_PATH)/librte_net.so \ -+ $(LIB_PATH)/librte_rcu.so \ -+ $(LIB_PATH)/librte_ethdev.so \ -+ $(LIB_PATH)/librte_pdump.so \ -+ $(LIB_PATH)/librte_bpf.so \ -+ $(LIB_PATH)/librte_pcapng.so \ -+ $(LIB_PATH)/librte_security.so \ -+ $(LIB_PATH)/librte_cryptodev.so - - - DEP_LIBS = $(LWIP_LIB) $(LIBRTE_LIB) --- -2.23.0 - diff --git a/0072-support-epoll-oneshot.patch b/0072-support-epoll-oneshot.patch deleted file mode 100644 index dfe4116..0000000 --- a/0072-support-epoll-oneshot.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 8870ece28ab3b467c43c1231177d826fd7907801 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 26 Jul 2022 21:03:23 +0800 -Subject: [PATCH] support epoll oneshot - ---- - src/lstack/api/lstack_epoll.c | 13 +++++++++++++ - src/lstack/core/lstack_lwip.c | 1 - - 2 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 310a0e7..963a696 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -291,6 +291,12 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - - list_for_each_safe(node, temp, &wakeup->event_list) { - struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -+ -+ if (sock->epoll_events == 0) { -+ list_del_node_null(&sock->event_list); -+ continue; -+ } -+ - if (sock->conn && sock->conn->acceptmbox) { - accept_num++; - } -@@ -299,6 +305,13 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - list_del_node_null(&sock->event_list); - } - -+ /* EPOLLONESHOT: generate event after epoll_ctl add/mod event again -+ epoll_event set 0 avoid generating event util epoll_ctl set epoll_event a valu */ -+ if (sock->epoll_events & EPOLLONESHOT) { -+ list_del_node_null(&sock->event_list); -+ sock->epoll_events = 0; -+ } -+ - events[event_num].events = sock->events; - events[event_num].data = sock->ep_data; - event_num++; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 4c2f0ea..80d781f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -75,7 +75,6 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->stack = NULL; - sock->wakeup = NULL; - sock->listen_next = NULL; -- sock->wait_close = false; - sock->epoll_events = 0; - sock->events = 0; - --- -2.23.0 - diff --git a/0073-modify-readme-and-clean-code.patch b/0073-modify-readme-and-clean-code.patch deleted file mode 100644 index 5a6ba9e..0000000 --- a/0073-modify-readme-and-clean-code.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 1981869b950e5eaaebfa55bb938336e57e682d7c Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 26 Jul 2022 21:45:48 +0800 -Subject: [PATCH 04/20] modify readme and clean code - ---- - src/lstack/api/lstack_epoll.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 963a696..9c44f87 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -384,7 +384,7 @@ static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct prot - static void epoll_bind_statck(struct wakeup_poll *wakeup) - { - /* all fd is kernel, set rand stack */ -- if (wakeup->bind_stack == NULL && wakeup->max_stack== NULL) { -+ if (wakeup->bind_stack == NULL && wakeup->max_stack == NULL) { - update_epoll_max_stack(wakeup); - } - --- -2.23.0 - diff --git a/0074-ltran-support-muti-proc-with-same-ip.patch b/0074-ltran-support-muti-proc-with-same-ip.patch deleted file mode 100644 index 18bf4c5..0000000 --- a/0074-ltran-support-muti-proc-with-same-ip.patch +++ /dev/null @@ -1,835 +0,0 @@ -From 99c1b74a5dfe8ace8963e8015d581bd6cd6e092d Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 1 Aug 2022 15:32:49 +0800 -Subject: [PATCH 06/20] ltran support muti proc with same ip - ---- - src/common/dpdk_common.h | 2 - - src/common/gazelle_dfx_msg.h | 1 + - src/common/gazelle_parse_config.c | 11 ++++- - src/lstack/core/lstack_cfg.c | 14 ++----- - src/lstack/core/lstack_stack_stat.c | 4 +- - src/ltran/ltran_dfx.c | 23 +++++++--- - src/ltran/ltran_errno.c | 1 - - src/ltran/ltran_forward.c | 57 +++++++++---------------- - src/ltran/ltran_instance.c | 65 ++++------------------------- - src/ltran/ltran_instance.h | 10 ++--- - src/ltran/ltran_monitor.c | 12 ++---- - src/ltran/ltran_param.c | 4 +- - src/ltran/ltran_stack.c | 2 - - src/ltran/ltran_stat.c | 57 ++++++------------------- - src/ltran/ltran_stat.h | 3 +- - src/ltran/ltran_tcp_conn.c | 3 -- - src/ltran/ltran_tcp_sock.c | 2 - - 17 files changed, 82 insertions(+), 189 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 01c941d..987fbdd 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -62,8 +62,6 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf - dst_data = (uint8_t *)PTR_TO_PRIVATE(dst); - src_data = (uint8_t *)PTR_TO_PRIVATE(src); - rte_memcpy(dst_data, src_data, GAZELLE_MBUFF_PRIV_SIZE); -- -- return; - } - - static __rte_always_inline void time_stamp_into_mbuf(uint32_t rx_count, struct rte_mbuf *buf[], uint64_t time_stamp) -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 68b6364..4d838c0 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -224,6 +224,7 @@ struct gazelle_in_addr { - struct gazelle_stat_msg_request { - enum GAZELLE_STAT_MODE stat_mode; - struct gazelle_in_addr ip; -+ uint32_t pid; - - union stat_param { - char log_level[GAZELLE_LOG_LEVEL_MAX]; -diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c -index 4e96fcc..8556e37 100644 ---- a/src/common/gazelle_parse_config.c -+++ b/src/common/gazelle_parse_config.c -@@ -32,20 +32,27 @@ static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size) - - elem = strtok_s(args, delim, &next_token); - start = strtol(elem, &endptr, 0); -+ if (endptr == elem) { -+ return cnt; -+ } - - elem = strtok_s(NULL, delim, &next_token); - if (elem == NULL) { - /* just a single data */ -- array[cnt++] = start; -+ array[cnt++] = (uint32_t)start; - return cnt; - } - end = strtol(elem, &endptr, 0); -+ if (endptr == elem) { -+ array[cnt++] = start; -+ return cnt; -+ } - - for (int64_t i = start; i <= end && cnt < array_size; i++) { - if (i < 0 || i > UINT_MAX) { - break; - } -- array[cnt++] = i; -+ array[cnt++] = (uint32_t)i; - } - - return cnt; -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index ee914c5..5cd326b 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -246,8 +246,8 @@ static int32_t parse_stack_cpu_number(void) - - static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t num) - { -- char path[PATH_MAX]; -- char strbuf[PATH_MAX]; -+ char path[PATH_MAX] = {0}; -+ char strbuf[PATH_MAX] = {0}; - - int32_t ret = snprintf_s(path, sizeof(path), PATH_MAX - 1, NUMA_CPULIST_PATH, socket_id); - if (ret < 0) { -@@ -330,7 +330,7 @@ static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vadd - viraddr = strtoull(arg, &end, BASE_HEX_SCALE); - - /* check for errors */ -- if ((errno != 0) || (arg[0] == '\0') || end == NULL || (*end != '\0')) { -+ if ((errno != 0) || (arg[0] == '\0') || (end == NULL) || (*end != '\0')) { - return -EINVAL; - } - -@@ -408,7 +408,6 @@ static void print_dpdk_param(void) - - static int32_t turn_args_to_config(int32_t argc, char **argv) - { -- char host_addr[PATH_MAX]; - int32_t ret; - int32_t idx; - -@@ -419,13 +418,8 @@ static int32_t turn_args_to_config(int32_t argc, char **argv) - // OPT_FILE_PREFIX - idx = get_param_idx(argc, argv, OPT_FILE_PREFIX); - if (idx < 0) { -- ret = sprintf_s(host_addr, sizeof(host_addr), "%s", inet_ntoa(g_config_params.host_addr)); -- if (ret < 0) { -- return -1; -- } -- - ret = sprintf_s(g_config_params.sec_attach_arg.file_prefix, sizeof(g_config_params.sec_attach_arg.file_prefix), -- "gazelle_%s", host_addr); -+ "gazelle_%d", getpid()); - if (ret < 0) { - return -1; - } -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index ca7ce52..09aa04c 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -172,12 +172,12 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - - lstack_get_low_power_info(&dfx->low_power_info); - -- int32_t ret = memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); -+ int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); - if (ret != EOK) { - LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret); - return; - } -- -+ - get_wakeup_stat(stack, &dfx->data.pkts.wakeup_stat); - - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 9da6b7f..3d977b5 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -860,7 +860,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); - printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt fd Local Address " -- " Foreign Address State\n"); -+ " Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { -@@ -869,13 +869,13 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%s:%hu\t %s:%hu\t %s\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%-7d%s:%hu %s:%hu %s\n", i, conn_info->recv_cnt, - conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt, -- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-50u%s:%hu\t 0.0.0.0:*\t\t LISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-57u%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", -@@ -1124,14 +1124,24 @@ static int32_t parse_dfx_lstack_args(int32_t argc, char *argv[], struct gazelle_ - { - int32_t num_cmd = 0; - struct in_addr ip; -+ uint32_t pid = 0; - - if (argc < GAZELLE_LSTACK_PARAM_NUM) { - return num_cmd; - } - -+ /* args3 have ',' is ip or is pid */ - char *param = argv[GAZELLE_OPTIONS_ARG_IDX]; -- if (inet_aton(param, &ip) == 0) { -- return num_cmd; -+ if (strstr(param, ".")) { -+ if (inet_aton(param, &ip) == 0) { -+ return num_cmd; -+ } -+ } else { -+ char *end = NULL; -+ pid = (uint32_t)strtoul(param, &end, 0); -+ if (end == NULL || *end != '\0') { -+ return num_cmd; -+ } - } - - param = argv[GAZELLE_COMMAND_ARG_IDX]; -@@ -1145,6 +1155,7 @@ static int32_t parse_dfx_lstack_args(int32_t argc, char *argv[], struct gazelle_ - - for (int32_t i = 0; i < num_cmd; i++) { - req_msg[i].ip.s_addr = ip.s_addr; -+ req_msg[i].pid = pid; - } - return num_cmd; - } -diff --git a/src/ltran/ltran_errno.c b/src/ltran/ltran_errno.c -index beaf30f..4bf7dcd 100644 ---- a/src/ltran/ltran_errno.c -+++ b/src/ltran/ltran_errno.c -@@ -22,6 +22,5 @@ int32_t gazelle_get_errno(void) - void gazelle_set_errno(const int32_t value) - { - g_gazelle_errno = value; -- return; - } - -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index fb864b3..1a92348 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -289,7 +289,7 @@ static struct gazelle_stack* get_icmp_handle_stack(const struct rte_mbuf *m) - struct gazelle_instance *instance = NULL; - - ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr)); -- instance = gazelle_instance_map_by_ip(get_instance_mgr(), ipv4_hdr->dst_addr); -+ instance = gazelle_instance_get_by_ip(get_instance_mgr(), ipv4_hdr->dst_addr); - if (instance == NULL) { - return NULL; - } -@@ -336,38 +336,30 @@ static __rte_always_inline int32_t ipv4_handle(struct rte_mbuf *m, struct rte_ip - - static __rte_always_inline void arp_handle(struct rte_mbuf *m) - { -- uint32_t i; -- struct gazelle_stack** stack_array = NULL; -- struct gazelle_instance *instance = NULL; -- struct rte_mbuf *m_copy = NULL; -- struct rte_arp_hdr *arph = NULL; -+ struct rte_arp_hdr *arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr)); - - get_statistics()->port_stats[g_port_index].arp_pkt++; - -- arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr)); -- /* in arp_handle, we do not check legality of the packet. just forward it to client. -- * this will not miss any packet to client(except some case discript below). -- * but maybe client recive more packet. */ -- /* we do NOT handle gratuitous ARP now and do NOT handle the case that recieving other request -- to update our arp table. It will cause more ARP packet, just this. */ -- -- instance = gazelle_instance_map_by_ip(get_instance_mgr(), arph->arp_data.arp_tip); -- -- if (instance == NULL) { -- return; -- } -+ /* arp pkt forward to every lwip stack */ -+ struct gazelle_instance_mgr *mgr = get_instance_mgr(); -+ for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) { -+ struct gazelle_instance *instance = mgr->instances[i]; -+ if (instance == NULL || instance->ip_addr.s_addr != arph->arp_data.arp_tip) { -+ continue; -+ } - -- stack_array = instance->stack_array; -- for (i = 0; i < instance->stack_cnt; i++) { -- if (stack_array[i] != NULL && INSTANCE_IS_ON(stack_array[i])) { -- m_copy = rte_pktmbuf_alloc(m->pool); -- if (m_copy == NULL) { -- LTRAN_ERR("copy mbuf failed in arp_handle. \n"); -- return; -+ struct gazelle_stack **stack_array = instance->stack_array; -+ for (uint32_t j = 0; j < instance->stack_cnt; j++) { -+ if (stack_array[j] != NULL && INSTANCE_IS_ON(stack_array[j])) { -+ struct rte_mbuf *m_copy = rte_pktmbuf_alloc(m->pool); -+ if (m_copy == NULL) { -+ LTRAN_ERR("copy mbuf failed in arp_handle. \n"); -+ return; -+ } -+ copy_mbuf(m_copy, m); -+ // send and free m_copy in enqueue_rx_packet -+ enqueue_rx_packet(stack_array[j], m_copy); - } -- copy_mbuf(m_copy, m); -- // send and free m_copy in enqueue_rx_packet -- enqueue_rx_packet(stack_array[i], m_copy); - } - } - } -@@ -404,7 +396,6 @@ forward_to_kni: - if (get_ltran_config()->dpdk.kni_switch == GAZELLE_ON) { - enqueue_rx_packet(get_kni_stack(), m); - } -- return; - } - - static __rte_always_inline void msg_to_quintuple(struct gazelle_quintuple *transfer_qtuple, -@@ -501,8 +492,6 @@ static void tcp_hash_table_modify(struct gazelle_stack *stack, const struct reg_ - LTRAN_ERR("unknown REG_RING type\n"); - break; - } -- -- return; - } - - static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stack) -@@ -529,7 +518,6 @@ static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stac - if (pthread_mutex_unlock(&sock_htable->mlock) != 0) { - LTRAN_WARN("write tcp_htable: unlock failed, errno %d\n", errno); - } -- return; - } - - -@@ -620,7 +608,6 @@ static __rte_always_inline void upstream_forward_loop(uint32_t port_id, uint32_t - - // After receiving packets from the NIC for 64 times, we sends the packets in the TX queue to each thread. - flush_all_stack(); -- return; - } - - void upstream_forward(const uint16_t *port) -@@ -660,7 +647,6 @@ void upstream_forward(const uint16_t *port) - } - - LTRAN_DEBUG("ltran rx loop stop.\n"); -- return; - } - - static __rte_always_inline void downstream_forward_one(struct gazelle_stack *stack, uint32_t port_id, uint32_t queue_id) -@@ -714,7 +700,6 @@ static __rte_always_inline void downstream_forward_one(struct gazelle_stack *sta - - get_statistics()->port_stats[g_port_index].tx_bytes += tx_bytes; - get_statistics()->port_stats[g_port_index].tx += tx_pkts; -- return; - } - - static __rte_always_inline void downstream_forward_loop(uint32_t port_id, uint32_t queue_id) -@@ -736,8 +721,6 @@ static __rte_always_inline void downstream_forward_loop(uint32_t port_id, uint32 - } - } - } -- -- return; - } - - int32_t downstream_forward(uint16_t *port) -diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c -index 5560d0c..648eb89 100644 ---- a/src/ltran/ltran_instance.c -+++ b/src/ltran/ltran_instance.c -@@ -43,7 +43,6 @@ static int32_t simple_response(int32_t fd, enum response_type type); - void set_tx_loop_count(void) - { - g_tx_loop_count++; -- return; - } - - unsigned long get_tx_loop_count(void) -@@ -54,7 +53,6 @@ unsigned long get_tx_loop_count(void) - void set_rx_loop_count(void) - { - g_rx_loop_count++; -- return; - } - - unsigned long get_rx_loop_count(void) -@@ -70,7 +68,6 @@ struct gazelle_instance_mgr *get_instance_mgr(void) - void set_instance_mgr(struct gazelle_instance_mgr *instance) - { - g_instance_mgr = instance; -- return; - } - - struct gazelle_instance_mgr *gazelle_instance_mgr_create(void) -@@ -86,16 +83,6 @@ struct gazelle_instance_mgr *gazelle_instance_mgr_create(void) - mgr->subnet_size = (uint32_t)(get_ltran_config()->dispatcher.ipv4_subnet_size); - mgr->max_instance_num = get_ltran_config()->dispatcher.num_clients; - -- mgr->ipv4_to_client = malloc(mgr->subnet_size * sizeof(*mgr->ipv4_to_client)); -- if (mgr->ipv4_to_client == NULL) { -- free(mgr); -- return NULL; -- } -- -- for (uint32_t i = 0; i < mgr->subnet_size; i++) { -- mgr->ipv4_to_client[i] = GAZELLE_NULL_CLIENT; -- } -- - return mgr; - } - -@@ -112,37 +99,16 @@ void gazelle_instance_mgr_destroy(void) - GAZELLE_FREE(mgr->instances[i]); - } - } -- GAZELLE_FREE(mgr->ipv4_to_client); -- GAZELLE_FREE(g_instance_mgr); --} -- --int32_t gazelle_instance_map_set(struct gazelle_instance_mgr *mgr, const struct gazelle_instance *instance) --{ -- if (instance == NULL) { -- return GAZELLE_ERR; -- } -- -- uint32_t ip_idx = instance->ip_addr.s_addr & mgr->net_mask; - -- for (uint8_t i = 0; i < GAZELLE_MAX_INSTANCE_ARRAY_SIZE; i++) { -- if (mgr->instances[i] == instance) { -- mgr->ipv4_to_client[ntohl(ip_idx)] = i; -- return GAZELLE_OK; -- } -- } -- -- return GAZELLE_ERR; -+ GAZELLE_FREE(g_instance_mgr); - } - --struct gazelle_instance *gazelle_instance_map_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip) -+struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip) - { -- uint32_t ip_idx = ntohl(ip & mgr->net_mask); -- if (ip_idx < mgr->subnet_size) { -- uint8_t cl_idx = mgr->ipv4_to_client[ip_idx]; -- if (cl_idx == GAZELLE_NULL_CLIENT) { -- return NULL; -+ for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) { -+ if (mgr->instances[i]->ip_addr.s_addr == ip) { -+ return mgr->instances[i]; - } -- return mgr->instances[cl_idx]; - } - return NULL; - } -@@ -304,8 +270,7 @@ static int32_t instance_info_check(const struct client_proc_conf *conf) - return GAZELLE_ERR; - } - -- if (gazelle_instance_map_by_ip(get_instance_mgr(), in.s_addr) || -- gazelle_instance_get_by_pid(get_instance_mgr(), conf->pid)) { -+ if (gazelle_instance_get_by_pid(get_instance_mgr(), conf->pid)) { - LTRAN_ERR("pid %u: ip %s already exist.\n", conf->pid, addr); - return GAZELLE_ERR; - } -@@ -564,12 +529,6 @@ int32_t handle_reg_msg_proc_att(int32_t fd, struct reg_request_msg *recv_msg) - goto END; - } - -- ret = gazelle_instance_map_set(get_instance_mgr(), instance); -- if (ret != GAZELLE_OK) { -- LTRAN_RTE_ERR("pid %u, gazelle_instance_map_set failed. ret=%d.\n", conf->pid, ret); -- goto END; -- } -- - ret = simple_response(fd, RSP_OK); - if (ret != 0) { - return GAZELLE_ERR; -@@ -680,7 +639,6 @@ static void handle_stack_logout(struct gazelle_instance *instance, const struct - gazelle_stack_del_by_tid(gazelle_get_stack_htable(), stack->tid); - - LTRAN_INFO("tid %u, stack logout successfully.\n", tid); -- return; - } - - static void handle_inst_logout_for_reg_thrd_ring(struct gazelle_instance *instance) -@@ -697,21 +655,15 @@ static void handle_inst_logout_for_reg_thrd_ring(struct gazelle_instance *instan - - handle_stack_logout(instance, stack); - } -- -- return; - } - --static int32_t handle_inst_logout_reg_proc_att(struct gazelle_instance *instance, -- struct gazelle_instance_mgr *instance_mgr) -+static int32_t handle_inst_logout_reg_proc_att(struct gazelle_instance *instance) - { - int32_t ret; - - instance->socket_size = 0; - instance->base_virtaddr = 0; - -- uint32_t ip_idx = instance->ip_addr.s_addr & instance_mgr->net_mask; -- instance_mgr->ipv4_to_client[ntohl(ip_idx)] = GAZELLE_NULL_CLIENT; -- - ret = rte_eal_sec_detach(instance->file_prefix, (int32_t)strlen(instance->file_prefix)); - if (ret < 0) { - LTRAN_RTE_ERR("rte_eal_sec_detach failed:%d.\n", ret); -@@ -725,7 +677,6 @@ static void handle_inst_logout_reg_proc_mem(struct gazelle_instance *instance) - remove_virtual_area(instance->base_virtaddr, (size_t)instance->socket_size); - - free(instance); -- return; - } - - void handle_instance_logout(uint32_t pid) -@@ -751,7 +702,7 @@ void handle_instance_logout(uint32_t pid) - handle_inst_logout_for_reg_thrd_ring(instance); - /* fallthrough */ - case RQT_REG_PROC_ATT: -- ret = handle_inst_logout_reg_proc_att(instance, instance_mgr); -+ ret = handle_inst_logout_reg_proc_att(instance); - /* fallthrough */ - case RQT_REG_PROC_MEM: - /* instance ptr has been free after this func */ -diff --git a/src/ltran/ltran_instance.h b/src/ltran/ltran_instance.h -index a8808df..2b888ec 100644 ---- a/src/ltran/ltran_instance.h -+++ b/src/ltran/ltran_instance.h -@@ -41,6 +41,8 @@ struct gazelle_instance { - uint64_t socket_size; - uint8_t mac_addr[ETHER_ADDR_LEN]; - char file_prefix[PATH_MAX]; -+ -+ struct gazelle_instance *next; - }; - - struct gazelle_instance_mgr { -@@ -53,11 +55,6 @@ struct gazelle_instance_mgr { - - struct gazelle_instance *instances[GAZELLE_MAX_INSTANCE_NUM]; - -- /* we use ip to decide witch client to deliver -- * all of the ip address should be in one subnet -- * ipv4_to_client[ip_int & mask] -- */ -- uint8_t *ipv4_to_client; - /* net byte order */ - uint32_t net_mask; - uint32_t subnet_size; -@@ -82,8 +79,7 @@ void gazelle_instance_mgr_destroy(void); - struct gazelle_instance_mgr *gazelle_instance_mgr_create(void); - - struct gazelle_instance *gazelle_instance_get_by_pid(const struct gazelle_instance_mgr *mgr, uint32_t pid); --struct gazelle_instance *gazelle_instance_map_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip); --int32_t gazelle_instance_map_set(struct gazelle_instance_mgr *mgr, const struct gazelle_instance *instance); -+struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip); - struct gazelle_instance *gazelle_instance_add_by_pid(struct gazelle_instance_mgr *mgr, uint32_t pid); - - int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg); -diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c -index 0562ce1..dfda93f 100644 ---- a/src/ltran/ltran_monitor.c -+++ b/src/ltran/ltran_monitor.c -@@ -286,8 +286,6 @@ static void dfx_server_msg_proc(uint32_t events, struct sockfd_data *data) - close(conn_fd); - return; - } -- -- return; - } - - static int32_t ltran_req_mode_process(int32_t fd, struct gazelle_stat_msg_request *req_msg) -@@ -311,12 +309,12 @@ static int32_t ltran_req_mode_process(int32_t fd, struct gazelle_stat_msg_reques - handle_resp_ltran_latency(fd); - break; - case GAZELLE_STAT_LTRAN_START_LATENCY: -- handle_cmd_to_lstack(req_msg); -+ handle_resp_lstack_transfer(req_msg, -1); - set_start_latency_flag(GAZELLE_ON); - break; - case GAZELLE_STAT_LTRAN_STOP_LATENCY: - set_start_latency_flag(GAZELLE_OFF); -- handle_cmd_to_lstack(req_msg); -+ handle_resp_lstack_transfer(req_msg, -1); - break; - case GAZELLE_STAT_LTRAN_QUIT: - set_ltran_stop_flag(GAZELLE_TRUE); -@@ -333,7 +331,7 @@ static int32_t lstack_req_mode_process(int32_t fd, const struct gazelle_stat_msg - { - switch (req_msg->stat_mode) { - case GAZELLE_STAT_LSTACK_LOG_LEVEL_SET: -- handle_cmd_to_lstack(req_msg); -+ handle_resp_lstack_transfer(req_msg, -1); - break; - case GAZELLE_STAT_LSTACK_SHOW_RATE: - handle_resp_lstack_total(req_msg, fd); -@@ -392,7 +390,6 @@ END: - /* always close cmd_fd */ - g_dfx_fd_cnt--; - sockfd_data_free(data); -- return; - } - - static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data) -@@ -433,8 +430,6 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data) - sockfd_data_free(event.data.ptr); - return; - } -- -- return; - } - - static void reg_conn_msg_proc(uint32_t events, struct sockfd_data *data) -@@ -480,7 +475,6 @@ END: - handle_instance_logout(data->pid); - } - sockfd_data_free(data); -- return; - } - - static void gazelle_ctl_loop(void) -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index 40ee8d3..75cc2f9 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -59,7 +59,7 @@ static int32_t parse_str2mac(char *mac_str, uint8_t *ether_addr) - char *tmp = NULL; - int32_t i = 0; - token = strtok_s(mac_str, delim, &tmp); -- while (token != NULL) { -+ while (token != NULL && *token != '\0') { - one_bit_mac = strtoul(token, &end, HEX_BASE); - if ((end == NULL) || (*end != '\0')) { - gazelle_set_errno(GAZELLE_EMAC); -@@ -419,7 +419,6 @@ static void macs_cache_free(char **bond_mac_cache, int32_t cnt, int32_t max_cnt) - for (int32_t i = 0; i < cnt; i++) { - GAZELLE_FREE(bond_mac_cache[i]); - } -- return; - } - - static void parse_bond_macs_separate(const char *bond_macs_str, char **bond_mac_cache, int32_t cache_cnt, -@@ -451,7 +450,6 @@ static void parse_bond_macs_separate(const char *bond_macs_str, char **bond_mac_ - } - - free(bond_macs); -- return; - } - - static int32_t parse_bond_macs(const config_t *config, const char *key, struct ltran_config *ltran_config) -diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c -index 4be7c23..1c0d4f7 100644 ---- a/src/ltran/ltran_stack.c -+++ b/src/ltran/ltran_stack.c -@@ -27,7 +27,6 @@ struct gazelle_stack_htable *gazelle_get_stack_htable(void) - void gazelle_set_stack_htable(struct gazelle_stack_htable *htable) - { - g_stack_htable = htable; -- return; - } - - struct gazelle_stack_hbucket *gazelle_stack_hbucket_get_by_tid(struct gazelle_stack_htable *stack_htable, uint32_t tid); -@@ -186,6 +185,5 @@ void gazelle_stack_del_by_tid(struct gazelle_stack_htable *stack_htable, uint32_ - stack_hbucket->chain_size--; - - free(stack); -- return; - } - -diff --git a/src/ltran/ltran_stat.c b/src/ltran/ltran_stat.c -index af79b76..50f65e3 100644 ---- a/src/ltran/ltran_stat.c -+++ b/src/ltran/ltran_stat.c -@@ -80,7 +80,6 @@ int32_t get_start_latency_flag(void) - void set_ltran_stop_flag(int32_t flag) - { - g_ltran_stop_flag = flag; -- return; - } - - int32_t get_ltran_stop_flag(void) -@@ -355,10 +354,9 @@ void handle_resp_ltran_latency(int32_t fd) - void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_t fd) - { - struct gazelle_stat_lstack_total stat = {0}; -- struct gazelle_instance *instance = NULL; -- int32_t ret; - -- instance = gazelle_instance_map_by_ip(get_instance_mgr(), msg->ip.s_addr); -+ struct gazelle_instance *instance = (msg->pid > 0) ? gazelle_instance_get_by_pid(get_instance_mgr(), msg->pid) : -+ gazelle_instance_get_by_ip(get_instance_mgr(), msg->ip.s_addr); - if (instance == NULL) { - LTRAN_ERR("Can't find the client ip to check\n"); - return; -@@ -369,7 +367,7 @@ void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_ - } - - for (uint32_t i = 0; i < instance->stack_cnt; i++) { -- ret = gazelle_filling_lstack_stat_total(&stat, instance->stack_array[i]); -+ int32_t ret = gazelle_filling_lstack_stat_total(&stat, instance->stack_array[i]); - if (ret != GAZELLE_OK) { - LTRAN_ERR("gazelle_filling_lstack_stat_total failed. ret=%d.\n", ret); - return; -@@ -387,61 +385,32 @@ void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_ - } - } - --static int32_t find_sockfd_by_ip(struct gazelle_in_addr ip) -+void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t dfx_fd) - { -- struct gazelle_instance *instance = NULL; -+ struct gazelle_stack_dfx_data stat = {0}; - -- instance = gazelle_instance_map_by_ip(get_instance_mgr(), ip.s_addr); -+ struct gazelle_instance *instance = (msg->pid > 0) ? gazelle_instance_get_by_pid(get_instance_mgr(), msg->pid) : -+ gazelle_instance_get_by_ip(get_instance_mgr(), msg->ip.s_addr); - if (instance == NULL) { -- LTRAN_WARN("get null instance by ip %u\n", ip.s_addr); -- return -1; -+ LTRAN_ERR("get null instance by ip %u pid %u\n", msg->ip.s_addr, msg->pid); -+ return; - } - -- return instance->sockfd; --} -- --void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg) --{ -- struct gazelle_stack_dfx_data stat = {0}; -- int32_t lstack_fd, ret; -- -- lstack_fd = find_sockfd_by_ip(msg->ip); -+ int32_t lstack_fd = instance->sockfd; - if (lstack_fd < 0) { - return; - } - - (void)write_specied_len(lstack_fd, (const char *)msg, sizeof(struct gazelle_stat_msg_request)); - -- /* wait lstack finish this cmd avoid two write to lstack */ - while (stat.eof == 0) { -- ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat)); -+ int32_t ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat)); - if (ret != GAZELLE_OK) { - return; - } -- } --} -- --void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t fd) --{ -- int32_t lstack_fd; -- struct gazelle_stack_dfx_data stat = {0}; -- int32_t cmd_fd = fd; -- int32_t ret; -- -- lstack_fd = find_sockfd_by_ip(msg->ip); -- if (lstack_fd < 0) { -- return; -- } - -- (void)write_specied_len(lstack_fd, (const char *)msg, sizeof(struct gazelle_stat_msg_request)); -- -- while (stat.eof == 0) { -- ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat)); -- if (ret != GAZELLE_OK) { -- return; -+ if (dfx_fd > 0) { -+ (void)write_specied_len(dfx_fd, (char *)&stat, sizeof(stat)); - } -- (void)write_specied_len(cmd_fd, (char *)&stat, sizeof(stat)); - } -- -- return; - } -diff --git a/src/ltran/ltran_stat.h b/src/ltran/ltran_stat.h -index 494c83e..f91b0c4 100644 ---- a/src/ltran/ltran_stat.h -+++ b/src/ltran/ltran_stat.h -@@ -145,14 +145,13 @@ struct statistics *get_statistics(void); - - struct gazelle_stat_msg_request; - void handle_resp_ltran_latency(int32_t fd); --void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg); - void handle_resp_ltran_sock(int32_t fd); - void handle_resp_ltran_total(int32_t fd); - void handle_resp_ltran_client(int32_t fd); - void handle_resp_ltran_conn(int32_t fd); - void handle_resp_lstack_latency(int32_t fd); - void set_ltran_log_level(struct gazelle_stat_msg_request *msg); --void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t fd); -+void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t dfx_fd); - void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_t fd); - - #endif /* ifndef __GAZELLE_STAT_H__ */ -diff --git a/src/ltran/ltran_tcp_conn.c b/src/ltran/ltran_tcp_conn.c -index faa42e1..e0ad562 100644 ---- a/src/ltran/ltran_tcp_conn.c -+++ b/src/ltran/ltran_tcp_conn.c -@@ -27,7 +27,6 @@ struct gazelle_tcp_conn_htable *gazelle_get_tcp_conn_htable(void) - void gazelle_set_tcp_conn_htable(struct gazelle_tcp_conn_htable *htable) - { - g_tcp_conn_htable = htable; -- return; - } - - struct gazelle_tcp_conn_htable *gazelle_tcp_conn_htable_create(uint32_t max_conn_num) -@@ -73,7 +72,6 @@ void gazelle_tcp_conn_htable_destroy(void) - - g_tcp_conn_htable = NULL; - rte_free(conn_htable); -- return; - } - - struct gazelle_tcp_conn_hbucket *gazelle_conn_hbucket_get(struct gazelle_tcp_conn_htable *conn_htable, -@@ -181,6 +179,5 @@ void gazelle_conn_del_by_quintuple(struct gazelle_tcp_conn_htable *conn_htable, - rte_free(conn); - conn_htable->cur_conn_num--; - conn_hbucket->chain_size--; -- return; - } - -diff --git a/src/ltran/ltran_tcp_sock.c b/src/ltran/ltran_tcp_sock.c -index e3b696b..7ba23f0 100644 ---- a/src/ltran/ltran_tcp_sock.c -+++ b/src/ltran/ltran_tcp_sock.c -@@ -30,7 +30,6 @@ struct gazelle_tcp_sock_htable *gazelle_get_tcp_sock_htable(void) - void gazelle_set_tcp_sock_htable(struct gazelle_tcp_sock_htable *htable) - { - g_tcp_sock_htable = htable; -- return; - } - - static struct gazelle_tcp_sock_hbucket *gazelle_hbucket_get_by_ipport(struct gazelle_tcp_sock_htable *tcp_sock_htable, -@@ -84,7 +83,6 @@ void gazelle_tcp_sock_htable_destroy(void) - } - - GAZELLE_FREE(g_tcp_sock_htable); -- return; - } - - static struct gazelle_tcp_sock_hbucket *gazelle_hbucket_get_by_ipport(struct gazelle_tcp_sock_htable *tcp_sock_htable, --- -2.23.0 - diff --git a/0075-fix-rpc-msg-out-of-bound.patch b/0075-fix-rpc-msg-out-of-bound.patch deleted file mode 100644 index 1da6c92..0000000 --- a/0075-fix-rpc-msg-out-of-bound.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 9404570889caba130960d55fdba39b8bffc61274 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 1 Aug 2022 17:27:49 +0800 -Subject: [PATCH 07/20] fix rpc msg out of bound - ---- - src/lstack/core/lstack_thread_rpc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 5a05c82..358ce54 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -24,6 +24,7 @@ - #include "lstack_thread_rpc.h" - - #define RPC_MSG_MAX 32 -+#define RPC_MSG_MASK (RPC_MSG_MAX - 1) - struct rpc_msg_pool { - struct rpc_msg msgs[RPC_MSG_MAX]; - uint32_t prod __rte_cache_aligned; -@@ -37,12 +38,12 @@ static inline __attribute__((always_inline)) struct rpc_msg *get_rpc_msg(struct - uint32_t cons = __atomic_load_n(&rpc_pool->cons, __ATOMIC_ACQUIRE); - uint32_t prod = rpc_pool->prod + 1; - -- if (prod == cons) { -+ if (prod - cons >= RPC_MSG_MAX) { - return NULL; - } - - rpc_pool->prod = prod; -- return &rpc_pool->msgs[prod]; -+ return &rpc_pool->msgs[prod & RPC_MSG_MASK]; - } - - static struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func) --- -2.23.0 - diff --git a/0076-fix-traversal-array-use-NULL-pointer.patch b/0076-fix-traversal-array-use-NULL-pointer.patch deleted file mode 100644 index d95aa36..0000000 --- a/0076-fix-traversal-array-use-NULL-pointer.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 44d9d6ed74efef409cd05dbd7d99aeaa70ffb359 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 1 Aug 2022 19:25:28 +0800 -Subject: [PATCH 08/20] fix traversal array use NULL pointer - ---- - src/ltran/ltran_instance.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c -index 648eb89..fc5b0fb 100644 ---- a/src/ltran/ltran_instance.c -+++ b/src/ltran/ltran_instance.c -@@ -106,6 +106,10 @@ void gazelle_instance_mgr_destroy(void) - struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip) - { - for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) { -+ if (mgr->instances[i] == NULL) { -+ continue; -+ } -+ - if (mgr->instances[i]->ip_addr.s_addr == ip) { - return mgr->instances[i]; - } --- -2.23.0 - diff --git a/0077-same-stack-thread-don-t-repeate-send-msg.patch b/0077-same-stack-thread-don-t-repeate-send-msg.patch deleted file mode 100644 index 1dc2366..0000000 --- a/0077-same-stack-thread-don-t-repeate-send-msg.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 9c3fe074be66abe142f19709bf7d1fe9793e104f Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 1 Aug 2022 22:34:13 +0800 -Subject: [PATCH 09/20] same stack thread don't repeate send msg - ---- - src/lstack/core/lstack_lwip.c | 13 +++++++------ - src/lstack/core/lstack_protocol_stack.c | 6 +++--- - src/lstack/core/lstack_thread_rpc.c | 8 +++++++- - src/lstack/include/lstack_protocol_stack.h | 5 +++-- - 4 files changed, 20 insertions(+), 12 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 80d781f..96c6c96 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -310,10 +310,8 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) - replenish_send_idlembuf(sock->send_ring); - } - -- if (len > 0) { -- if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -- add_epoll_event(sock->conn, EPOLLOUT); -- } -+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -+ add_epoll_event(sock->conn, EPOLLOUT); - } - } - -@@ -322,6 +320,9 @@ void stack_send(struct rpc_msg *msg) - int32_t fd = msg->args[MSG_ARG_0].i; - int32_t flags = msg->args[MSG_ARG_2].i; - -+ struct protocol_stack *stack = get_protocol_stack(); -+ __atomic_store_n(&stack->in_send, false, __ATOMIC_RELEASE); -+ - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { - msg->result = -1; -@@ -337,9 +338,9 @@ void stack_send(struct rpc_msg *msg) - /* have remain data add sendlist */ - if (NETCONN_IS_DATAOUT(sock)) { - if (list_is_null(&sock->send_list)) { -- list_add_node(&sock->stack->send_list, &sock->send_list); -+ list_add_node(&stack->send_list, &sock->send_list); - } -- sock->stack->stats.send_self_rpc++; -+ stack->stats.send_self_rpc++; - } - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index a2dd62c..4f1ad41 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -157,7 +157,7 @@ void low_power_idling(struct protocol_stack *stack) - 2. If the number of received packets exceeds the threshold, the authorization mark will end; - 3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */ - if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) { -- nanosleep(&st, &st); -+ nanosleep(&st, NULL); - stack->low_power = true; - return; - } -@@ -181,7 +181,7 @@ void low_power_idling(struct protocol_stack *stack) - } - - if (stack->low_power) { -- nanosleep(&st, &st); -+ nanosleep(&st, NULL); - } - } - -@@ -238,7 +238,7 @@ static void* gazelle_wakeup_thread(void *arg) - - for (;;) { - if (cfg->low_power_mod != 0 && stack->low_power) { -- nanosleep(&st, &st); -+ nanosleep(&st, NULL); - } - - sem_t *event_sem[WAKEUP_MAX_NUM]; -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 358ce54..d0f5257 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -429,7 +429,12 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - - void rpc_call_send(int fd, const void *buf, size_t len, int flags) - { -+ /* same stack don't repeat send msg */ - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -+ if (__atomic_load_n(&stack->in_send, __ATOMIC_ACQUIRE)) { -+ return; -+ } -+ - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send); - if (msg == NULL) { - return; -@@ -438,8 +443,9 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags) - msg->args[MSG_ARG_0].i = fd; - msg->args[MSG_ARG_1].size = len; - msg->args[MSG_ARG_2].i = flags; -- - msg->self_release = 0; -+ -+ stack->in_send = true; - rpc_call(&stack->rpc_queue, msg); - } - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 39d29d7..2a6aec7 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -50,7 +50,7 @@ struct protocol_stack { - struct reg_ring_msg *reg_buf; - - volatile bool low_power; -- volatile uint16_t conn_num __rte_cache_aligned; -+ volatile bool in_send __rte_cache_aligned; - lockless_queue rpc_queue __rte_cache_aligned; - char pad __rte_cache_aligned; - -@@ -62,9 +62,10 @@ struct protocol_stack { - struct list_node recv_list; - struct list_node send_list; - -+ volatile uint16_t conn_num; - struct stats_ *lwip_stats; - struct gazelle_stack_latency latency; -- struct gazelle_stack_stat stats __rte_cache_aligned; -+ struct gazelle_stack_stat stats; - }; - - struct eth_params; --- -2.23.0 - diff --git a/0078-fix-memcpy-out-bounds.patch b/0078-fix-memcpy-out-bounds.patch deleted file mode 100644 index a4d56e7..0000000 --- a/0078-fix-memcpy-out-bounds.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 4d5832685f7fbdb5314acdf04fbd0882357880ec Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 2 Aug 2022 19:32:54 +0800 -Subject: [PATCH 11/20] fix memcpy out bounds - ---- - src/lstack/core/lstack_stack_stat.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 09aa04c..e8c5bc3 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -172,7 +172,8 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - - lstack_get_low_power_info(&dfx->low_power_info); - -- int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts)); -+ int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(struct gazelle_stack_stat), -+ &stack->stats, sizeof(struct gazelle_stack_stat)); - if (ret != EOK) { - LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret); - return; --- -2.23.0 - diff --git a/0079-fix-miss-send-rpc-msg-err.patch b/0079-fix-miss-send-rpc-msg-err.patch deleted file mode 100644 index 2736abd..0000000 --- a/0079-fix-miss-send-rpc-msg-err.patch +++ /dev/null @@ -1,62 +0,0 @@ -From e0e21a4170ef062cb66288beb6800a7c43da7136 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 29 Aug 2022 16:54:20 +0800 -Subject: [PATCH 15/20] fix miss send rpc msg err - ---- - src/lstack/core/lstack_lwip.c | 1 - - src/lstack/core/lstack_thread_rpc.c | 5 ----- - src/lstack/include/lstack_protocol_stack.h | 1 - - 3 files changed, 7 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 96c6c96..35b67f5 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -321,7 +321,6 @@ void stack_send(struct rpc_msg *msg) - int32_t flags = msg->args[MSG_ARG_2].i; - - struct protocol_stack *stack = get_protocol_stack(); -- __atomic_store_n(&stack->in_send, false, __ATOMIC_RELEASE); - - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index d0f5257..a6e9725 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -429,11 +429,7 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - - void rpc_call_send(int fd, const void *buf, size_t len, int flags) - { -- /* same stack don't repeat send msg */ - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- if (__atomic_load_n(&stack->in_send, __ATOMIC_ACQUIRE)) { -- return; -- } - - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send); - if (msg == NULL) { -@@ -445,7 +441,6 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags) - msg->args[MSG_ARG_2].i = flags; - msg->self_release = 0; - -- stack->in_send = true; - rpc_call(&stack->rpc_queue, msg); - } - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 2a6aec7..36340ab 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -50,7 +50,6 @@ struct protocol_stack { - struct reg_ring_msg *reg_buf; - - volatile bool low_power; -- volatile bool in_send __rte_cache_aligned; - lockless_queue rpc_queue __rte_cache_aligned; - char pad __rte_cache_aligned; - --- -2.23.0 - diff --git a/0080-fix-proc-can-not-exit-due-to-lack-of-mem-startup-fai.patch b/0080-fix-proc-can-not-exit-due-to-lack-of-mem-startup-fai.patch deleted file mode 100644 index 7112bb2..0000000 --- a/0080-fix-proc-can-not-exit-due-to-lack-of-mem-startup-fai.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 5d10ccf130b742f4e910568b642ac351a489c072 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Fri, 2 Sep 2022 19:26:05 +0800 -Subject: [PATCH 17/20] fix proc can not exit due to lack of mem startup fail - ---- - src/lstack/core/lstack_protocol_stack.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 4f1ad41..3009286 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -373,10 +373,12 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - struct protocol_stack *stack = malloc(sizeof(*stack)); - if (stack == NULL) { - LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); -+ sem_post(&stack_group->thread_phase1); - return NULL; - } - - if (init_stack_value(stack, queue_id) != 0) { -+ sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } -@@ -389,6 +391,7 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - - if (use_ltran()) { - if (client_reg_thrd_ring() != 0) { -+ sem_post(&stack_group->thread_phase1); - free(stack); - return NULL; - } --- -2.23.0 - diff --git a/0081-read-data-with-err-event.patch b/0081-read-data-with-err-event.patch deleted file mode 100644 index 264db7f..0000000 --- a/0081-read-data-with-err-event.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 27f6745def82693c661aaf0a1a6353790955755c Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Sep 2022 20:51:41 +0800 -Subject: [PATCH 18/20] read data with err event - ---- - src/lstack/core/lstack_lwip.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 35b67f5..10c2cd9 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -577,7 +577,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - GAZELLE_RETURN(EINVAL); - } - -- if (sock->errevent > 0) { -+ if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) { - return 0; - } - --- -2.23.0 - diff --git a/0082-del-gazelle-ring-cons.tail-atomic-protect.patch b/0082-del-gazelle-ring-cons.tail-atomic-protect.patch deleted file mode 100644 index 7e714d6..0000000 --- a/0082-del-gazelle-ring-cons.tail-atomic-protect.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 138399196dcb2fb926cc2dbeedfcdb4bf1f1401b Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Sep 2022 21:31:15 +0800 -Subject: [PATCH 19/20] del gazelle ring cons.tail atomic protect - ---- - src/common/dpdk_common.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 987fbdd..1c3e7e8 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -141,7 +141,7 @@ static __rte_always_inline uint32_t gazelle_light_ring_dequeue_burst(struct rte_ - static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, void **obj_table, uint32_t n) - { - uint32_t head = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE); -- uint32_t tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ uint32_t tail = r->cons.tail; - - uint32_t entries = r->capacity + tail - head; - if (n > entries) { -@@ -158,8 +158,8 @@ static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, - - static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, void **obj_table, uint32_t n) - { -- uint32_t cons = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); - uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); -+ uint32_t cons = r->cons.tail; - - uint32_t entries = prod - cons; - if (n > entries) { -@@ -172,7 +172,7 @@ static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, - - __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); - -- __atomic_store_n(&r->cons.tail, cons + n, __ATOMIC_RELEASE); -+ r->cons.tail = cons + n; - - return n; - } --- -2.23.0 - diff --git a/0083-fix-send-return-vale.patch b/0083-fix-send-return-vale.patch deleted file mode 100644 index caec47f..0000000 --- a/0083-fix-send-return-vale.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 09ca97c3777c5459fa8717e3ce298a62ff0c84e6 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Sep 2022 21:50:27 +0800 -Subject: [PATCH 20/20] fix send return vale - ---- - src/lstack/core/lstack_lwip.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 10c2cd9..5174e4c 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -256,12 +256,12 @@ static inline void del_data_out_event(struct lwip_sock *sock) - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - { - if (sock->errevent > 0) { -- return 0; -+ GAZELLE_RETURN(ENOTCONN); - } - - uint32_t free_count = gazelle_ring_readable_count(sock->send_ring); - if (free_count == 0) { -- return -1; -+ return 0; - } - - struct pbuf *pbuf = NULL; -@@ -293,7 +293,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - } - } - -- return (send_len <= 0) ? -1 : send_len; -+ return send_len; - } - - static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) --- -2.23.0 - diff --git a/0084-add-examples.patch b/0084-add-examples.patch deleted file mode 100644 index 65ed826..0000000 --- a/0084-add-examples.patch +++ /dev/null @@ -1,2668 +0,0 @@ -From 814b66143605ad409be0f8aace468386f4fd891e Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 5 Sep 2022 15:39:12 +0800 -Subject: [PATCH] sync examples code - ---- - examples/CMakeLists.txt | 2 +- - examples/README.md | 178 +++++++++++- - examples/inc/bussiness.h | 122 +++++++++ - examples/inc/client.h | 121 ++++++++ - examples/inc/parameter.h | 11 +- - examples/inc/server.h | 231 ++++++++++++++++ - examples/inc/utilities.h | 82 +++++- - examples/main.c | 8 + - examples/src/bussiness.c | 234 ++++++++++++++++ - examples/src/client.c | 387 ++++++++++++++++++++++++++ - examples/src/parameter.c | 214 ++++++++------- - examples/src/server.c | 578 +++++++++++++++++++++++++++++++++++++++ - examples/src/utilities.c | 128 +++++++++ - 13 files changed, 2185 insertions(+), 111 deletions(-) - create mode 100644 examples/inc/bussiness.h - create mode 100644 examples/inc/client.h - create mode 100644 examples/inc/server.h - create mode 100644 examples/src/bussiness.c - create mode 100644 examples/src/client.c - create mode 100644 examples/src/server.c - create mode 100644 examples/src/utilities.c - -diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt -index b1c2b07..c38e6cb 100644 ---- a/examples/CMakeLists.txt -+++ b/examples/CMakeLists.txt -@@ -18,7 +18,7 @@ project(${PROJECT_NAME}) - message(STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR}) - message(STATUS "PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR}) - --set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -pthread") -+set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -pthread -lboundscheck") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D EXAMPLE_COMPILE") - - include_directories(${PROJECT_SOURCE_DIR}/inc) -diff --git a/examples/README.md b/examples/README.md -index 6f82bb2..4e165a4 100644 ---- a/examples/README.md -+++ b/examples/README.md -@@ -1,4 +1,6 @@ --# gazzle 示例程序 -+# gazzlle 示例程序 -+ -+## 功能 - - * 支持 TCP 、 unix 非阻塞通讯。 - * 支持多线程网络 IO 复用模型,线程之间相互独立。TCP 的 `listen` 、`epoll` 、`read` 、`write` 、`connect` 等接口都在同一线程内。`connect` 连接数可配。 -@@ -9,9 +11,93 @@ - ## 网络模型 - - * **单线程非阻塞**:采用同步非阻塞 IO 模型,在单线程中采用非阻塞的方式监听并发起 IO 请求,当内核中数据到达后读取数据、执行业务逻辑并发送。 -+ -+``` -+ 单线程非阻塞模型 -+ | -+ 创建套接字并监听 -+ | <-------+ -+ 读取数据 | -+ | | -+ 业务逻辑 | -+ | | -+ 发送数据 | -+ | | -+ +---------+ -+``` -+ - * **多线程非阻塞IO复用**:基于 `epoll` 实现多线程非阻塞 IO 模型。每个线程之间互不干涉。通过 `epoll` 监控多个当前线程负责的 fd ,当任何一个数据状态准备就绪时,返回并执行读写操作和对应的业务逻辑。 -+ -+``` -+ 多线程非阻塞IO复用模型 -+ | -+ 创建套接字并监听 -+ | -+ 创建若干个线程 -+ | -+ +------------+------------+------------+------------+ -+ | | | | | -+ 创建套接字并监听 ... ... 创建套接字并监听 ... -+ | | -+ 线程内部初始化 线程内部初始化 -+ epoll,并注册 epoll,并注册 -+ 套接字监听事件 套接字监听事件 -+ | <---------+ | <----------+ -+ +-----+-----+ | +-----+-----+ | -+ | | | | | | -+ (新连接) (新报文) | (新连接) (新报文) | -+ 建连并注 读取数据 | 建连并注 读取数据 | -+ 册新连接 业务逻辑 | 册新连接 业务逻辑 | -+ 监听事件 发送数据 | 监听事件 发送数据 | -+ | | | | | | -+ +-----+-----+ | +-----+-----+ | -+ | | | | -+ +-----------+ +-----------+ -+``` -+ - * **多线程非阻塞非对称**:采用基于 `epoll` 的单线程多路 IO 复用监听连接事件,并采用多线程的方式完成后续读写监听业务。 server 在启动监听之前,开辟一定数量的线程,用线程池管理。主线程创建监听 `fd` 之后,采用多路 IO 复用机制 (`epoll`) 进行 IO 状态监控。当监听到客户端的连接请求时,建立连接并将相关 `fd` 分发给线程池的某个线程进行监听。线程池中的每个线程都采用多路 IO 复用机制 (`epoll`) ,用来监听主线程中建立成功并分发下来的 `socket` 。 - -+``` -+ 多线程非阻塞非对称模型 +------------------------+ -+ | | | -+ 创建监听线程 | +-------------+--- ... -----+ -+ | | | | | -+ 创建套接字,初始化 | 初始化epoll ... ... 初始化epoll -+ eopll并且并注册套 | 并注册事件 并注册事件 -+ 接字监听事件 | | <-- + | <-- + -+ | | 读取数据 | 读取数据 | -+ 当有新连接时,创建工作线程 | 业务逻辑 | 业务逻辑 | -+ | | 发送数据 | 发送数据 | -+ +----------------+ | | | | -+ +-----+ +-----+ -+``` -+ -+* **客户端**:创建若干线程,每个线程创建若干 `socket` 与客户端建立连接,并使用 `epoll` 进行状态监控,建连后向服务端发送数据并等待服务端数据传回,当接受到服务端传回数据后进行校验,校验无误再次发送数据。 -+ -+``` -+ 多线程非阻塞IO复用模型 -+ | -+ 创建若干个线程 -+ +------------+------------+------------+------------+ -+ | | | | | -+ 线程内部初始化 线程内部初始化 -+ epoll ... ... epoll ... -+ | | -+ 依次创建套接字, 依次创建套接字, -+ 建连并注册事件 建连并注册事件 -+ | <---------+ | <---------+ -+ 发送数据 | 发送数据 | -+ 接收数据并校验 | 接收数据并校验 | -+ | | | | -+ +------------+ | +------------+ | -+ | | | | | | -+ 成功 失败 | 成功 失败 | -+ | | | | | | -+ 发送数据 终止 | 发送数据 终止 | -+ | | | | -+ +-----------------+ +-----------------+ -+``` -+ - ## 程序接口 - - * `-a, --as [server | client]`:作为服务端还是客户端。 -@@ -24,21 +110,103 @@ - * `mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。 - * `-t, --threadnum`:线程数设置。 - * `-c, --connectnum`:连接数设置。 --* `-A, --api [unix | posix]`:内部实现的接口类型。 -- * `unix`:基于 unix 接口实现。 -- * `posix`:基于 posix 接口实现。 -+* `-D, --domain [unix | posix]`:通信协议。 -+ * `unix`:基于 unix 协议实现。 -+ * `posix`:基于 posix 协议实现。 -+* `-A, --api [readwrite | recvsend | recvsendmsg]`:内部实现的接口类型。 -+ * `readwrite` :使用 `read` 和 `write` 接口。 -+ * `recvsend` :使用 `recv` 和 `send` 接口。 -+ * `recvsendmsg` :使用 `recvmsg` 和 `sendmsg` 接口。 - * `-P, --pktlen [xxxx]`:报文长度配置。 - * `-v, --verify`:是否校验报文。 - * `-r, --ringpmd`:是否基于dpdk ring PMD 收发环回。 -+* `-d, --debug`:是否打印调试信息。 - * `-h, --help`:获得帮助信息。 - - ## 使用 - -+ * **环境配置** -+ * 参考 https://gitee.com/openeuler/libboundscheck 。 -+ -+ * **编译** -+ - ``` - cd build - mkdir examples - cd examples - cmake ../../examples - make --./examples --help - ``` -+ -+ * **查看帮助信息** -+ -+ ``` -+ ./examples --help -+ -+ -a, --as [server | client]: set programas server or client. -+ server: as server. -+ client: as client. -+-i, --ip [???.???.???.???]: set ip address. -+-p, --port [????]: set port number in range of 1024 - 65535. -+-m, --model [mum | mud]: set the network model. -+ mum: multi thread, unblock, multiplexing IO network model. -+ mud: multi thread, unblock, dissymmetric network model. -+-t, --threadnum [???]: set thread number in range of 1 - 1000. -+-c, --connectnum [???]: set connection number of each thread. -+-D, --domain [unix | posix]: set domain type is server or client. -+ unix: use unix's api. -+ posix: use posix api. -+-A, --api [readwrite | recvsend | recvsendmsg]: set api type is server or client. -+ readwrite: use `read` and `write`. -+ recvsend: use `recv and `send`. -+ recvsendmsg: use `recvmsg` and `sendmsg`. -+-P, --pktlen [????]: set packet length in range of 2 - 10485760. -+-v, --verify: set to verifying the message packet. -+-r, --ringpmd: set to use ringpmd. -+-d, --debug: set to print the debug information. -+-h, --help: see helps. -+ ``` -+ -+ * 创建服务端 -+ -+``` -+./example --as server --verify -+ -+[program parameters]: -+--> [as]: server -+--> [server ip]: 127.0.0.1 -+--> [server port]: 5050 -+--> [model]: mum -+--> [thread number]: 8 -+--> [domain]: posix -+--> [api]: read & write -+--> [packet length]: 1024 -+--> [verify]: on -+--> [ringpmd]: off -+--> [debug]: off -+ -+[program informations]: -+--> : [connect num]: 0, [receive]: 0.000 B/s -+``` -+ -+ * 创建客户端 -+ -+``` -+./example --as client --verify -+ -+[program parameters]: -+--> [as]: client -+--> [server ip]: 127.0.0.1 -+--> [server port]: 5050 -+--> [thread number]: 8 -+--> [connection number]: 10 -+--> [domain]: posix -+--> [api]: read & write -+--> [packet length]: 1024 -+--> [verify]: on -+--> [ringpmd]: off -+--> [debug]: off -+ -+[program informations]: -+--> : [connect num]: 80, [send]: 357.959 MB/s -+``` -\ No newline at end of file -diff --git a/examples/inc/bussiness.h b/examples/inc/bussiness.h -new file mode 100644 -index 0000000..f16d771 ---- /dev/null -+++ b/examples/inc/bussiness.h -@@ -0,0 +1,122 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#ifndef __EXAMPLES_BUSSINESS_H__ -+#define __EXAMPLES_BUSSINESS_H__ -+ -+ -+#include "utilities.h" -+#include "parameter.h" -+ -+ -+#define BUSSINESS_MESSAGE_SIZE 26 ///< the size of business message -+ -+ -+/** -+ * @brief server handler -+ * The server handler. -+ */ -+struct ServerHandler -+{ -+ int32_t fd; ///< socket file descriptor -+}; -+ -+/** -+ * @brief client handler -+ * The client handler. -+ */ -+struct ClientHandler -+{ -+ int32_t fd; ///< socket file descriptor -+ uint32_t msg_idx; ///< the start charactors index of message -+}; -+ -+ -+/** -+ * @brief read by specify api -+ * This function processes the reading by specify api. -+ * @param fd the file descriptor -+ * @param buffer_in the input buffer -+ * @param length the length -+ * @param api the type of api -+ * @return the result -+ */ -+ int32_t read_api(int32_t fd, char *buffer_in, const uint32_t length, const char *api); -+ -+/** -+ * @brief write by specify api -+ * This function processes the writing by specify api. -+ * @param fd the file descriptor -+ * @param buffer_out the output buffer -+ * @param length the length -+ * @param api the type of api -+ * @return the result -+ */ -+ int32_t write_api(int32_t fd, char *buffer_out, const uint32_t length, const char *api); -+ -+/** -+ * @brief the business processsing of server -+ * This function processes the business of server. -+ * @param out the output string -+ * @param in the input string -+ * @param size the size of input and output -+ * @param verify if we verify or not -+ * @return the result -+ */ -+void server_bussiness(char *out, const char *in, uint32_t size); -+ -+/** -+ * @brief the business processsing of client -+ * This function processes the business of client. -+ * @param out the output string -+ * @param in the input string -+ * @param size the size of input and output -+ * @param verify if we verify or not -+ * @param msg_idx the start charactors index of message -+ * @return the result -+ */ -+int32_t client_bussiness(char *out, const char *in, uint32_t size, bool verify, uint32_t *msg_idx); -+ -+/** -+ * @brief server checks the information and answers -+ * This function checks the information and answers. -+ * @param server_handler server handler -+ * @param pktlen the length of package -+ * @param api the api -+ * @return the result -+ */ -+int32_t server_ans(struct ServerHandler *server_handler, uint32_t pktlen, const char* api); -+ -+/** -+ * @brief client asks server -+ * This function asks server. -+ * @param client_handler client handler -+ * @param pktlen the length of package -+ * @param api the api -+ * @return the result -+ */ -+int32_t client_ask(struct ClientHandler *client_handler, uint32_t pktlen, const char* api); -+ -+/** -+ * @brief client checks the information and answers -+ * This function checks the information and answers. -+ * @param client_handler client handler -+ * @param pktlen the length of package -+ * @param verify verify or not -+ * @param api the api -+ * @return the result -+ */ -+int32_t client_chkans(struct ClientHandler *client_handler, uint32_t pktlen, bool verify, const char* api); -+ -+ -+#endif // __EXAMPLES_BUSSINESS_H__ -diff --git a/examples/inc/client.h b/examples/inc/client.h -new file mode 100644 -index 0000000..d3ae017 ---- /dev/null -+++ b/examples/inc/client.h -@@ -0,0 +1,121 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#ifndef __EXAMPLES_CLIENT_H__ -+#define __EXAMPLES_CLIENT_H__ -+ -+ -+#include "utilities.h" -+#include "parameter.h" -+#include "bussiness.h" -+ -+ -+/** -+ * @brief client unit -+ * The information of each thread of client. -+ */ -+struct ClientUnit -+{ -+ struct ClientHandler *handlers; ///< the handlers -+ int32_t epfd; ///< the connect epoll file descriptor -+ struct epoll_event *epevs; ///< the epoll events -+ uint32_t curr_connect; ///< current connection number -+ uint64_t send_bytes; ///< total send bytes -+ in_addr_t ip; ///< server ip -+ uint16_t port; ///< server port -+ uint32_t connect_num; ///< total connection number -+ uint32_t pktlen; ///< the length of peckage -+ bool verify; ///< if we verify or not -+ char* domain; ///< the communication domain -+ char* api; ///< the type of api -+ bool debug; ///< if we print the debug information -+ struct ClientUnit *next; ///< next pointer -+}; -+ -+/** -+ * @brief client -+ * The information of client. -+ */ -+struct Client -+{ -+ struct ClientUnit *uints; ///< the server mum unit -+ bool debug; ///< if we print the debug information -+}; -+ -+ -+/** -+ * @brief the single thread, client prints informations -+ * The single thread, client prints informations. -+ * @param ch_str the charactor string -+ * @param act_str the action string -+ * @param ip the ip address -+ * @param port the port -+ * @param debug if debug or not -+ * @return the result pointer -+ */ -+void client_debug_print(const char *ch_str, const char *act_str, in_addr_t ip, uint16_t port, bool debug); -+ -+/** -+ * @brief the client prints informations -+ * The client prints informations. -+ * @param client the client information -+ */ -+void client_info_print(struct Client *client); -+ -+/** -+ * @brief the single thread, client try to connect to server, register to epoll -+ * The single thread, client try to connect to server, register to epoll. -+ * @param client_handler the client handler -+ * @param epoll_fd the epoll file descriptor -+ * @param ip ip address -+ * @param port port -+ * @param domain domain -+ * @return the result pointer -+ */ -+int32_t client_thread_try_connect(struct ClientHandler *client_handler, int32_t epoll_fd, in_addr_t ip, uint16_t port, const char *api); -+ -+/** -+ * @brief the single thread, client retry to connect to server, register to epoll -+ * The single thread, client retry to connect to server, register to epoll. -+ * @param client_unit the client unit -+ * @param client_handler the client handler -+ * @return the result pointer -+ */ -+int32_t client_thread_retry_connect(struct ClientUnit *client_unit, struct ClientHandler *client_handler); -+ -+/** -+ * @brief the single thread, client connects and gets epoll feature descriptors -+ * The single thread, client connects and gets epoll feature descriptors. -+ * @param client_unit the client unit -+ * @return the result pointer -+ */ -+int32_t client_thread_create_epfd_and_reg(struct ClientUnit *client_unit); -+ -+/** -+ * @brief create client of single thread and run -+ * This function creates client of single thread and run. -+ * @param arg each thread's information of server -+ * @return the result pointer -+ */ -+void *client_s_create_and_run(void *arg); -+ -+/** -+ * @brief create client and run -+ * This function create the client and run. -+ * @param params the parameters pointer -+ * @return the result -+ */ -+int32_t client_create_and_run(struct ProgramParams *params); -+ -+ -+#endif // __EXAMPLES_CLIENT_H__ -diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h -index d25a13a..ee8fe4e 100644 ---- a/examples/inc/parameter.h -+++ b/examples/inc/parameter.h -@@ -24,9 +24,11 @@ - #define PARAM_DEFAULT_MODEL ("mum") ///< default model type - #define PARAM_DEFAULT_CONNECT_NUM (10) ///< default connection number - #define PARAM_DEFAULT_THREAD_NUM (8) ///< default thread number --#define PARAM_DEFAULT_API ("posix") ///< default API type -+#define PARAM_DEFAULT_DOMAIN ("posix") ///< default communication domain -+#define PARAM_DEFAULT_API ("readwrite") ///< default API type - #define PARAM_DEFAULT_PKTLEN (1024) ///< default packet length of message - #define PARAM_DEFAULT_VERIFY (false) ///< default flag of message verifying -+#define PARAM_DEFAULT_DEBUG (false) ///< default flag of debug - #define PARAM_DEFAULT_RINGPMD (false) ///< default flag of ring PMD of dpdk - - enum { -@@ -42,6 +44,8 @@ enum { - PARAM_NUM_CONNECT_NUM = 'c', - #define PARAM_NAME_THREAD_NUM ("threadnum") ///< name of parameter thread number - PARAM_NUM_THREAD_NUM = 't', -+#define PARAM_NAME_DOMAIN ("domain") ///< name of parameter domain -+ PARAM_NUM_DOMAIN = 'D', - #define PARAM_NAME_API ("api") ///< name of parameter API type - PARAM_NUM_API = 'A', - #define PARAM_NAME_PKTLEN ("pktlen") ///< name of parameter packet length of message -@@ -50,6 +54,8 @@ enum { - PARAM_NUM_VERIFY = 'v', - #define PARAM_NAME_RINGPMD ("ringpmd") ///< name of parameter flag of ring PMD of dpdk - PARAM_NUM_RINGPMD = 'r', -+#define PARAM_NAME_DEBUG ("debug") ///< name of parameter flag of debug -+ PARAM_NUM_DEBUG = 'd', - #define PARAM_NAME_HELP ("help") ///< name of parameter help - PARAM_NUM_HELP = 'h', - }; -@@ -81,13 +87,14 @@ struct ProgramParams { - char* model; ///< model type - uint32_t thread_num; ///< the number of threads - uint32_t connect_num; ///< the connection number -+ char* domain; ///< the communication dimain - char* api; ///< the type of api - uint32_t pktlen; ///< the packet length - bool verify; ///< if we verify the message or not -+ bool debug; ///< if we print the debug information or not - bool ringpmd; ///< if we use ring PMD or not - }; - -- - /** - * @brief initialize the parameters - * This function initializes the parameters of main function. -diff --git a/examples/inc/server.h b/examples/inc/server.h -new file mode 100644 -index 0000000..fa9096b ---- /dev/null -+++ b/examples/inc/server.h -@@ -0,0 +1,231 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#ifndef __EXAMPLES_SERVER_H__ -+#define __EXAMPLES_SERVER_H__ -+ -+ -+#include "utilities.h" -+#include "parameter.h" -+#include "bussiness.h" -+ -+ -+/** -+ * @brief server unit of model mum -+ * The information of each thread of server of model mum. -+ */ -+struct ServerMumUnit -+{ -+ struct ServerHandler listener; ///< the listen handler -+ int32_t epfd; ///< the listen epoll file descriptor -+ struct epoll_event *epevs; ///< the epoll events -+ uint32_t curr_connect; ///< current connection number -+ uint64_t recv_bytes; ///< total receive bytes -+ in_addr_t ip; ///< server ip -+ uint16_t port; ///< server port -+ uint32_t pktlen; ///< the length of peckage -+ char* domain; ///< communication domain -+ char* api; ///< the type of api -+ bool debug; ///< if we print the debug information -+ struct ServerMumUnit *next; ///< next pointer -+}; -+ -+/** -+ * @brief server model mum -+ * The information of server model mum. -+ */ -+struct ServerMum -+{ -+ struct ServerMumUnit *uints; ///< the server mum unit -+ bool debug; ///< if we print the debug information -+}; -+ -+/** -+ * @brief server unit of model mud worker unit -+ * The information of worker unit of server of model mud. -+ */ -+struct ServerMudWorker -+{ -+ struct ServerHandler worker; ///< the worker handler -+ int32_t epfd; ///< the worker epoll file descriptor -+ struct epoll_event *epevs; ///< the epoll events -+ uint64_t recv_bytes; ///< total receive bytes -+ uint32_t pktlen; ///< the length of peckage -+ in_addr_t ip; ///< client ip -+ uint16_t port; ///< client port -+ char* api; ///< the type of api -+ bool debug; ///< if we print the debug information -+ struct ServerMudWorker *next; ///< next pointer -+}; -+ -+/** -+ * @brief server model mud -+ * The information of server model mud. -+ */ -+struct ServerMud -+{ -+ struct ServerHandler listener; ///< the listen handler -+ struct ServerMudWorker *workers; ///< the workers -+ int32_t epfd; ///< the listen epoll file descriptor -+ struct epoll_event *epevs; ///< the epoll events -+ uint32_t curr_connect; ///< current connection number -+ in_addr_t ip; ///< server ip -+ uint16_t port; ///< server port -+ uint32_t pktlen; ///< the length of peckage -+ char* domain; ///< communication domain -+ char* api; ///< the type of api -+ bool debug; ///< if we print the debug information -+}; -+ -+ -+/** -+ * @brief the worker thread, unblock, dissymmetric server prints debug informations -+ * The worker thread, unblock, dissymmetric server prints debug informations. -+ * @param ch_str the charactor string -+ * @param act_str the action string -+ * @param ip the ip address -+ * @param port the port -+ * @param debug if debug or not -+ * @return the result pointer -+ */ -+void server_debug_print(const char *ch_str, const char *act_str, in_addr_t ip, uint16_t port, bool debug); -+ -+/** -+ * @brief the multi thread, unblock, dissymmetric server prints informations -+ * The multi thread, unblock, dissymmetric server prints informations. -+ * @param server_mud the server information -+ */ -+void sermud_info_print(struct ServerMud *server_mud); -+ -+/** -+ * @brief the worker thread, unblock, dissymmetric server listens and gets epoll feature descriptors -+ * The worker thread, unblock, dissymmetric server listens and gets epoll feature descriptors. -+ * @param worker_unit the server worker -+ * @return the result pointer -+ */ -+int32_t sermud_worker_create_epfd_and_reg(struct ServerMudWorker *worker_unit); -+ -+/** -+ * @brief the listener thread, unblock, dissymmetric server listens and gets epoll feature descriptors -+ * The listener thread, unblock, dissymmetric server listens and gets epoll feature descriptors. -+ * @param server_mud the server unit -+ * @return the result pointer -+ */ -+int32_t sermud_listener_create_epfd_and_reg(struct ServerMud *server_mud); -+ -+/** -+ * @brief the listener thread, unblock, dissymmetric server accepts the connections -+ * The listener thread, unblock, dissymmetric server accepts the connections. -+ * @param server_mud the server unit -+ * @return the result pointer -+ */ -+int32_t sermud_listener_accept_connects(struct ServerMud *server_mud); -+ -+/** -+ * @brief the worker thread, unblock, dissymmetric server processes the events -+ * The worker thread, unblock, dissymmetric server processes the events. -+ * @param worker_unit the server worker -+ * @return the result pointer -+ */ -+int32_t sermud_worker_proc_epevs(struct ServerMudWorker *worker_unit); -+ -+/** -+ * @brief the listener thread, unblock, dissymmetric server processes the events -+ * The listener thread, unblock, dissymmetric server processes the events. -+ * @param server_mud the server unit -+ * @return the result pointer -+ */ -+int32_t sermud_listener_proc_epevs(struct ServerMud *server_mud); -+ -+/** -+ * @brief create the worker thread, unblock, dissymmetric server and run -+ * This function creates the worker thread, unblock, dissymmetric server and run. -+ * @param arg each thread's information of server -+ * @return the result pointer -+ */ -+void *sermud_worker_create_and_run(void *arg); -+ -+/** -+ * @brief create the listener thread, unblock, dissymmetric server and run -+ * This function creates the listener thread, unblock, dissymmetric server and run. -+ * @param arg each thread's information of server -+ * @return the result pointer -+ */ -+void *sermud_listener_create_and_run(void *arg); -+ -+/** -+ * @brief create the multi thread, unblock, dissymmetric server and run -+ * This function creates the multi thread, unblock, dissymmetric server and run. -+ * @param params the parameters pointer -+ * @return the result -+ */ -+int32_t sermud_create_and_run(struct ProgramParams *params); -+ -+/** -+ * @brief the multi thread, unblock, mutliplexing IO server prints informations -+ * The multi thread, unblock, mutliplexing IO server prints informations. -+ * @param server_mum the server information -+ */ -+void sermum_info_print(struct ServerMum *server_mum); -+ -+/** -+ * @brief the single thread, unblock, mutliplexing IO server listens and gets epoll feature descriptors -+ * The single thread, unblock, mutliplexing IO server listens and gets epoll feature descriptors. -+ * @param server_unit the server unit -+ * @return the result pointer -+ */ -+int32_t sersum_create_epfd_and_reg(struct ServerMumUnit *server_unit); -+ -+/** -+ * @brief the single thread, unblock, mutliplexing IO server accepts the connections -+ * The single thread, unblock, mutliplexing IO server accepts the connections. -+ * @param server_unit the server unit -+ * @param server_handler the server handler -+ * @return the result pointer -+ */ -+int32_t sersum_accept_connects(struct ServerMumUnit *server_unit, struct ServerHandler *server_handler); -+ -+/** -+ * @brief the single thread, unblock, mutliplexing IO server processes the events -+ * The single thread, unblock, mutliplexing IO server processes the events. -+ * @param server_unit the server unit -+ * @return the result pointer -+ */ -+int32_t sersum_proc_epevs(struct ServerMumUnit *server_unit); -+ -+/** -+ * @brief create the single thread, unblock, mutliplexing IO server -+ * This function creates the single thread, unblock, mutliplexing IO server. -+ * @param arg each thread's information of server -+ * @return the result pointer -+ */ -+void *sersum_create_and_run(void *arg); -+ -+/** -+ * @brief create the multi thread, unblock, mutliplexing IO server and run -+ * This function creates the multi thread, unblock, mutliplexing IO server and run. -+ * @param params the parameters pointer -+ * @return the result -+ */ -+int32_t sermum_create_and_run(struct ProgramParams *params); -+ -+/** -+ * @brief create server and run -+ * This function create the specify server and run. -+ * @param params the parameters pointer -+ * @return the result -+ */ -+int32_t server_create_and_run(struct ProgramParams *params); -+ -+ -+#endif // __EXAMPLES_SERVER_H__ -diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h -index f9064c5..a684d35 100644 ---- a/examples/inc/utilities.h -+++ b/examples/inc/utilities.h -@@ -24,16 +24,23 @@ - #include - #include - -+#include - #include - #include - - #include - #include - #include -+#include -+#include -+#include - - #include - #include - -+#include "securec.h" -+#include "securectype.h" -+ - - #define PRINT_ERROR(format, ...) do \ - { \ -@@ -59,19 +66,76 @@ - printf(format, ##__VA_ARGS__); \ - printf("\n"); \ - } while(0) -+#define PRINT_SERVER_DATAFLOW(format, ...) do \ -+ { \ -+ printf("\033[?25l\033[A\033[K"); \ -+ printf("--> : "); \ -+ printf(format, ##__VA_ARGS__); \ -+ printf("\033[?25h\n"); \ -+ } while(0) -+#define PRINT_CLIENT_DATAFLOW(format, ...) do \ -+ { \ -+ printf("\033[?25l\033[A\033[K"); \ -+ printf("--> : "); \ -+ printf(format, ##__VA_ARGS__); \ -+ printf("\033[?25h\n"); \ -+ } while(0) - #define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) - #define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true))) - --#define PROGRAM_OK (0) ///< program ok flag --#define PROGRAM_ABORT (1) ///< program abort flag --#define PROGRAM_FAULT (-1) ///< program fault flag -+#define PROGRAM_OK (0) ///< program ok flag -+#define PROGRAM_ABORT (1) ///< program abort flag -+#define PROGRAM_FAULT (-1) ///< program fault flag -+#define PROGRAM_INPROGRESS (-2) ///< program in progress flag -+ -+#define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix -+#define UNIX_TCP_PORT_MAX (65535) ///< TCP minimum port number in unix -+#define THREAD_NUM_MIN (1) ///< minimum number of thead -+#define THREAD_NUM_MAX (1000) ///< maximum number of thead -+#define MESSAGE_PKTLEN_MIN (2) ///< minimum length of message (1 byte) -+#define MESSAGE_PKTLEN_MAX (1024 * 1024 * 10) ///< maximum length of message (10 Mb) -+ -+#define SERVER_SOCKET_LISTEN_BACKLOG (128) ///< the queue of socket -+#define SERVER_EPOLL_SIZE_MAX (10000) ///< the max wait event of epoll -+#define SERVER_EPOLL_WAIT_TIMEOUT (-1) ///< the timeout value of epoll -+ -+#define CLIENT_EPOLL_SIZE_MAX (10000) ///< the max wait event of epoll -+#define CLIENT_EPOLL_WAIT_TIMEOUT (-1) ///< the timeout value of epoll -+ -+#define TERMINAL_REFRESH_MS (100) ///< the time cut off between of terminal refresh -+ -+#define SOCKET_UNIX_DOMAIN_FILE "unix_domain_file" ///< socket unix domain file -+ -+ -+/** -+ * @brief create the socket and listen -+ * Thi function creates the socket and listen. -+ * @param socket_fd the socket file descriptor -+ * @param ip ip address -+ * @param port port number -+ * @param domain domain -+ * @return the result -+ */ -+int32_t create_socket_and_listen(int32_t *socket_fd, in_addr_t ip, uint16_t port, const char *domain); -+ -+/** -+ * @brief create the socket and connect -+ * Thi function creates the socket and connect. -+ * @param socket_fd the socket file descriptor -+ * @param ip ip address -+ * @param port port number -+ * @param domain domain -+ * @return the result -+ */ -+int32_t create_socket_and_connect(int32_t *socket_fd, in_addr_t ip, uint16_t port, const char *domain); - --#define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix --#define UNIX_TCP_PORT_MAX (65535) ///< TCP minimum port number in unix --#define THREAD_NUM_MIN (1) ///< minimum number of thead --#define THREAD_NUM_MAX (1000) ///< maximum number of thead --#define MESSAGE_PKTLEN_MIN (1) ///< minimum length of message (1 byte) --#define MESSAGE_PKTLEN_MAX (10485760) ///< maximum length of message (10 Mb) -+/** -+ * @brief set the socket to unblock -+ * Thi function sets the socket to unblock. -+ * @param socket_fd the socket file descriptor -+ * @return the result -+ */ -+int32_t set_socket_unblock(int32_t socket_fd); - - - #endif // __EXAMPLES_UTILITIES_H__ -diff --git a/examples/main.c b/examples/main.c -index f050dc5..5338572 100644 ---- a/examples/main.c -+++ b/examples/main.c -@@ -12,6 +12,8 @@ - - #include "utilities.h" - #include "parameter.h" -+#include "server.h" -+#include "client.h" - - static struct ProgramParams prog_params; - -@@ -27,5 +29,11 @@ int32_t main(int argc, char *argv[]) - } - program_params_print(&prog_params); - -+ if (strcmp(prog_params.as, "server") == 0) { -+ server_create_and_run(&prog_params); -+ } else { -+ client_create_and_run(&prog_params); -+ } -+ - return ret; - } -diff --git a/examples/src/bussiness.c b/examples/src/bussiness.c -new file mode 100644 -index 0000000..f55a37b ---- /dev/null -+++ b/examples/src/bussiness.c -@@ -0,0 +1,234 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "bussiness.h" -+ -+ -+static const char bussiness_messages_low[] = "abcdefghijklmnopqrstuvwxyz"; // the lower charactors of business message -+static const char bussiness_messages_cap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // the capital charactors of business message -+ -+ -+// read by specify api -+ int32_t read_api(int32_t fd, char *buffer_in, const uint32_t length, const char *api) -+ { -+ if (strcmp(api, "readwrite") == 0) { -+ return read(fd, buffer_in, length); -+ } else if (strcmp(api, "recvsend") == 0) { -+ return recv(fd, buffer_in, length, 0); -+ } else { -+ struct msghdr msg_recv; -+ struct iovec iov; -+ -+ msg_recv.msg_name = NULL; -+ msg_recv.msg_namelen = 0; -+ msg_recv.msg_iov = &iov; -+ msg_recv.msg_iovlen = 1; -+ msg_recv.msg_iov->iov_base = buffer_in; -+ msg_recv.msg_iov->iov_len = length; -+ msg_recv.msg_control = 0; -+ msg_recv.msg_controllen = 0; -+ msg_recv.msg_flags = 0; -+ -+ return recvmsg(fd, &msg_recv, 0); -+ } -+ } -+ -+// write by specify api -+ int32_t write_api(int32_t fd, char *buffer_out, const uint32_t length, const char *api) -+ { -+ if (strcmp(api, "readwrite") == 0) { -+ return write(fd, buffer_out, length); -+ } else if (strcmp(api, "recvsend") == 0) { -+ return send(fd, buffer_out, length, 0); -+ } else { -+ struct msghdr msg_send; -+ struct iovec iov; -+ -+ msg_send.msg_name = NULL; -+ msg_send.msg_namelen = 0; -+ msg_send.msg_iov = &iov; -+ msg_send.msg_iovlen = 1; -+ msg_send.msg_iov->iov_base = buffer_out; -+ msg_send.msg_iov->iov_len = length; -+ msg_send.msg_control = 0; -+ msg_send.msg_controllen = 0; -+ msg_send.msg_flags = 0; -+ -+ return sendmsg(fd, &msg_send, 0); -+ } -+ } -+ -+// the business processsing of server -+void server_bussiness(char *out, const char *in, uint32_t size) -+{ -+ char diff = 'a' - 'A'; -+ for (uint32_t i = 0; i < size; ++i) { -+ if (in[i] != '\0') { -+ out[i] = in[i] - diff; -+ } else { -+ out[i] = '\0'; -+ } -+ } -+} -+ -+// the business processsing of client -+int32_t client_bussiness(char *out, const char *in, uint32_t size, bool verify, uint32_t *msg_idx) -+{ -+ if (verify == false) { -+ for (uint32_t i = 0; i < (size - 1); ++i) { -+ out[i] = bussiness_messages_low[(*msg_idx + i) % BUSSINESS_MESSAGE_SIZE]; -+ } -+ } else { -+ uint32_t verify_start_idx = (*msg_idx == 0) ? (BUSSINESS_MESSAGE_SIZE - 1) : (*msg_idx - 1); -+ for (uint32_t i = 0; i < (size - 1); ++i) { -+ if (in[i] != bussiness_messages_cap[(verify_start_idx + i) % BUSSINESS_MESSAGE_SIZE]) { -+ return PROGRAM_FAULT; -+ } -+ out[i] = bussiness_messages_low[(*msg_idx + i) % BUSSINESS_MESSAGE_SIZE]; -+ } -+ } -+ out[size - 1] = '\0'; -+ -+ ++(*msg_idx); -+ *msg_idx = (*msg_idx) % BUSSINESS_MESSAGE_SIZE; -+ -+ return PROGRAM_OK; -+} -+ -+// server answers -+int32_t server_ans(struct ServerHandler *server_handler, uint32_t pktlen, const char* api) -+{ -+ const uint32_t length = pktlen; -+ char *buffer_in = (char *)malloc(length * sizeof(char)); -+ char *buffer_out = (char *)malloc(length * sizeof(char)); -+ -+ int32_t cread = 0; -+ int32_t sread = length; -+ while (cread < sread) { -+ int32_t nread = read_api(server_handler->fd, buffer_in, length, api); -+ if (nread == 0) { -+ return PROGRAM_ABORT; -+ } else if (nread < 0) { -+ if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { -+ return PROGRAM_FAULT; -+ } -+ } else { -+ cread += nread; -+ continue; -+ } -+ } -+ -+ server_bussiness(buffer_out, buffer_in, length); -+ -+ int32_t cwrite = 0; -+ int32_t swrite = length; -+ while (cwrite < swrite) { -+ int32_t nwrite = write_api(server_handler->fd, buffer_out, length, api); -+ if (nwrite == 0) { -+ return PROGRAM_ABORT; -+ } else if (nwrite < 0) { -+ if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { -+ return PROGRAM_FAULT; -+ } -+ } else { -+ cwrite += nwrite; -+ continue; -+ } -+ } -+ -+ free(buffer_in); -+ free(buffer_out); -+ -+ return PROGRAM_OK; -+} -+ -+// client asks -+int32_t client_ask(struct ClientHandler *client_handler, uint32_t pktlen, const char* api) -+{ -+ const uint32_t length = pktlen; -+ char *buffer_in = (char *)malloc(length * sizeof(char)); -+ char *buffer_out = (char *)malloc(length * sizeof(char)); -+ -+ client_bussiness(buffer_out, buffer_in, length, false, &(client_handler->msg_idx)); -+ -+ int32_t cwrite = 0; -+ int32_t swrite = length; -+ while (cwrite < swrite) { -+ int32_t nwrite = write_api(client_handler->fd, buffer_out, length, api); -+ if (nwrite == 0) { -+ return PROGRAM_ABORT; -+ } else if (nwrite < 0) { -+ if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { -+ return PROGRAM_FAULT; -+ } -+ } else { -+ cwrite += nwrite; -+ continue; -+ } -+ } -+ -+ free(buffer_in); -+ free(buffer_out); -+ -+ return PROGRAM_OK; -+} -+ -+// client checks -+int32_t client_chkans(struct ClientHandler *client_handler, uint32_t pktlen, bool verify, const char* api) -+{ -+ const uint32_t length = pktlen; -+ char *buffer_in = (char *)malloc(length * sizeof(char)); -+ char *buffer_out = (char *)malloc(length * sizeof(char)); -+ -+ int32_t cread = 0; -+ int32_t sread = length; -+ while (cread < sread) { -+ int32_t nread = read_api(client_handler->fd, buffer_in, length, api); -+ if (nread == 0) { -+ return PROGRAM_ABORT; -+ } else if (nread < 0) { -+ if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { -+ return PROGRAM_FAULT; -+ } -+ } else { -+ cread += nread; -+ continue; -+ } -+ } -+ -+ if (client_bussiness(buffer_out, buffer_in, length, verify, &(client_handler->msg_idx)) < 0) { -+ PRINT_ERROR("message verify fault! "); -+ getchar(); -+ } -+ -+ int32_t cwrite = 0; -+ int32_t swrite = length; -+ while (cwrite < swrite) { -+ int32_t nwrite = write_api(client_handler->fd, buffer_out, length, api); -+ if (nwrite == 0) { -+ return PROGRAM_ABORT; -+ } else if (nwrite < 0) { -+ if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { -+ return PROGRAM_FAULT; -+ } -+ } else { -+ cwrite += nwrite; -+ continue; -+ } -+ } -+ -+ free(buffer_in); -+ free(buffer_out); -+ -+ return PROGRAM_OK; -+} -\ No newline at end of file -diff --git a/examples/src/client.c b/examples/src/client.c -new file mode 100644 -index 0000000..aafcd00 ---- /dev/null -+++ b/examples/src/client.c -@@ -0,0 +1,387 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "client.h" -+ -+ -+static pthread_mutex_t client_debug_mutex; // the client mutex for printf -+ -+ -+// the single thread, client prints informations -+void client_debug_print(const char *ch_str, const char *act_str, in_addr_t ip, uint16_t port, bool debug) -+{ -+ if (debug == true) { -+ pthread_mutex_lock(&client_debug_mutex); -+ struct in_addr sin_addr; -+ sin_addr.s_addr = ip; -+ PRINT_CLIENT("[%s] [pid: %d] [tid: %ld] [%s <- %s:%d]. ", \ -+ ch_str, \ -+ getpid(), \ -+ pthread_self(), \ -+ act_str, \ -+ inet_ntoa(sin_addr), \ -+ ntohs(port)); -+ pthread_mutex_unlock(&client_debug_mutex); -+ } -+} -+ -+// the client prints informations -+void client_info_print(struct Client *client) -+{ -+ if (client->debug == false) { -+ struct timeval begin; -+ gettimeofday(&begin, NULL); -+ uint64_t begin_time = (uint64_t)begin.tv_sec * 1000 + (uint64_t)begin.tv_usec / 1000; -+ -+ uint32_t curr_connect = 0; -+ double bytes_ps = 0; -+ uint64_t begin_send_bytes = 0; -+ struct ClientUnit *begin_uint = client->uints; -+ while (begin_uint != NULL) { -+ curr_connect += begin_uint->curr_connect; -+ begin_send_bytes += begin_uint->send_bytes; -+ begin_uint = begin_uint->next; -+ } -+ -+ struct timeval delay; -+ delay.tv_sec = 0; -+ delay.tv_usec = TERMINAL_REFRESH_MS * 1000; -+ select(0, NULL, NULL, NULL, &delay); -+ -+ uint64_t end_send_bytes = 0; -+ struct ClientUnit *end_uint = client->uints; -+ while (end_uint != NULL) { -+ end_send_bytes += end_uint->send_bytes; -+ end_uint = end_uint->next; -+ } -+ -+ struct timeval end; -+ gettimeofday(&end, NULL); -+ uint64_t end_time = (uint64_t)end.tv_sec * 1000 + (uint64_t)end.tv_usec / 1000; -+ -+ double bytes_sub = end_send_bytes > begin_send_bytes ? (double)(end_send_bytes - begin_send_bytes) : 0; -+ double time_sub = end_time > begin_time ? (double)(end_time - begin_time) / 1000 : 0; -+ -+ bytes_ps = bytes_sub / time_sub; -+ -+ if (bytes_ps < 1024) { -+ PRINT_CLIENT_DATAFLOW("[connect num]: %d, [send]: %.3f B/s", curr_connect, bytes_ps); -+ } else if (bytes_ps < (1024 * 1024)) { -+ PRINT_CLIENT_DATAFLOW("[connect num]: %d, [send]: %.3f KB/s", curr_connect, bytes_ps / 1024); -+ } else { -+ PRINT_CLIENT_DATAFLOW("[connect num]: %d, [send]: %.3f MB/s", curr_connect, bytes_ps / (1024 * 1024)); -+ } -+ } -+} -+ -+// the single thread, client try to connect to server, register to epoll -+int32_t client_thread_try_connect(struct ClientHandler *client_handler, int32_t epoll_fd, in_addr_t ip, uint16_t port, const char *domain) -+{ -+ int32_t create_socket_and_connect_ret = create_socket_and_connect(&(client_handler->fd), ip, port, domain); -+ if (create_socket_and_connect_ret == PROGRAM_INPROGRESS) { -+ struct epoll_event ep_ev; -+ ep_ev.events = EPOLLOUT; -+ ep_ev.data.ptr = (void *)client_handler; -+ if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_handler->fd, &ep_ev) < 0) { -+ PRINT_ERROR("client cant't set epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } -+ return PROGRAM_OK; -+} -+ -+// the single thread, client retry to connect to server, register to epoll -+int32_t client_thread_retry_connect(struct ClientUnit *client_unit, struct ClientHandler *client_handler) -+{ -+ int32_t clithd_try_cnntask_ret = client_thread_try_connect(client_handler, client_unit->epfd, client_unit->ip, client_unit->port, client_unit->domain); -+ if (clithd_try_cnntask_ret < 0) { -+ if (clithd_try_cnntask_ret == PROGRAM_INPROGRESS) { -+ return PROGRAM_OK; -+ } -+ return PROGRAM_FAULT; -+ } -+ struct epoll_event ep_ev; -+ ep_ev.events = EPOLLIN | EPOLLET; -+ ep_ev.data.ptr = (void *)client_handler; -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_ADD, client_handler->fd, &ep_ev) < 0) { -+ PRINT_ERROR("client cant't set epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ ++(client_unit->curr_connect); -+ -+ struct sockaddr_in server_addr; -+ socklen_t server_addr_len = sizeof(server_addr); -+ if (getpeername(client_handler->fd, (struct sockaddr *)&server_addr, &server_addr_len) < 0) { -+ PRINT_ERROR("client can't socket peername %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "connect", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ -+ int32_t client_ask_ret = client_ask(client_handler, client_unit->pktlen, client_unit->api); -+ if (client_ask_ret == PROGRAM_FAULT) { -+ --client_unit->curr_connect; -+ struct epoll_event ep_ev; -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_DEL, client_handler->fd, &ep_ev) < 0) { -+ PRINT_ERROR("client can't delete socket '%d' to control epoll %d! ", client_handler->fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (client_ask_ret == PROGRAM_ABORT) { -+ --client_unit->curr_connect; -+ if (close(client_handler->fd) < 0) { -+ PRINT_ERROR("client can't close the socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "close", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } else { -+ client_unit->send_bytes += client_unit->pktlen; -+ client_debug_print("client unit", "send", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the single thread, client connects and gets epoll feature descriptors -+int32_t client_thread_create_epfd_and_reg(struct ClientUnit *client_unit) -+{ -+ const uint32_t connect_num = client_unit->connect_num; -+ -+ client_unit->epfd = epoll_create(CLIENT_EPOLL_SIZE_MAX); -+ if (client_unit->epfd < 0) { -+ PRINT_ERROR("client can't create epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ for (uint32_t i = 0; i < connect_num; ++i) { -+ int32_t clithd_try_cnntask_ret = client_thread_try_connect(client_unit->handlers + i, client_unit->epfd, client_unit->ip, client_unit->port, client_unit->domain); -+ if (clithd_try_cnntask_ret < 0) { -+ if (clithd_try_cnntask_ret == PROGRAM_INPROGRESS) { -+ continue; -+ } -+ return PROGRAM_FAULT; -+ } else { -+ struct epoll_event ep_ev; -+ ep_ev.events = EPOLLIN | EPOLLET; -+ ep_ev.data.ptr = (struct ClientHandler *)(client_unit->handlers + i); -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_ADD, (client_unit->handlers + i)->fd, &ep_ev) < 0) { -+ PRINT_ERROR("client cant't set epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ ++(client_unit->curr_connect); -+ -+ struct sockaddr_in server_addr; -+ socklen_t server_addr_len = sizeof(server_addr); -+ if (getpeername((client_unit->handlers + i)->fd, (struct sockaddr *)&server_addr, &server_addr_len) < 0) { -+ PRINT_ERROR("client can't socket peername %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "connect", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ -+ int32_t client_ask_ret = client_ask(client_unit->handlers + i, client_unit->pktlen, client_unit->api); -+ if (client_ask_ret == PROGRAM_FAULT) { -+ --client_unit->curr_connect; -+ struct epoll_event ep_ev; -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_DEL, (client_unit->handlers + i)->fd, &ep_ev) < 0) { -+ PRINT_ERROR("client can't delete socket '%d' to control epoll %d! ", client_unit->epevs[i].data.fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (client_ask_ret == PROGRAM_ABORT) { -+ --client_unit->curr_connect; -+ if (close((client_unit->handlers + i)->fd) < 0) { -+ PRINT_ERROR("client can't close the socket! "); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "close", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } else { -+ client_unit->send_bytes += client_unit->pktlen; -+ client_debug_print("client unit", "send", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the single thread, client processes epoll events -+int32_t clithd_proc_epevs(struct ClientUnit *client_unit) -+{ -+ int32_t epoll_nfds = epoll_wait(client_unit->epfd, client_unit->epevs, CLIENT_EPOLL_SIZE_MAX, CLIENT_EPOLL_WAIT_TIMEOUT); -+ if (epoll_nfds < 0) { -+ PRINT_ERROR("client epoll wait error %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ for (int32_t i = 0; i < epoll_nfds; ++i) { -+ struct epoll_event *curr_epev = client_unit->epevs + i; -+ -+ if (curr_epev->events == EPOLLERR) { -+ PRINT_ERROR("client epoll wait error! %d", curr_epev->events); -+ return PROGRAM_FAULT; -+ } else if (curr_epev->events == EPOLLOUT) { -+ int32_t connect_error = 0; -+ socklen_t connect_error_len = sizeof(connect_error); -+ struct ClientHandler *client_handler = (struct ClientHandler *)curr_epev->data.ptr; -+ if (getsockopt(client_handler->fd, SOL_SOCKET, SO_ERROR, (void *)(&connect_error), &connect_error_len) < 0) { -+ PRINT_ERROR("client can't get socket option %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ if (connect_error < 0) { -+ if (connect_error == ETIMEDOUT) { -+ if (client_thread_retry_connect(client_unit, client_handler) < 0) { -+ return PROGRAM_FAULT; -+ } -+ continue; -+ } -+ PRINT_ERROR("client connect error %d! ", connect_error); -+ return PROGRAM_FAULT; -+ } else { -+ ++(client_unit->curr_connect); -+ -+ struct sockaddr_in server_addr; -+ socklen_t server_addr_len = sizeof(server_addr); -+ if (getpeername(client_handler->fd, (struct sockaddr *)&server_addr, &server_addr_len) < 0) { -+ PRINT_ERROR("client can't socket peername %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "connect", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ -+ int32_t client_ask_ret = client_ask(client_handler, client_unit->pktlen, client_unit->api); -+ if (client_ask_ret == PROGRAM_FAULT) { -+ --client_unit->curr_connect; -+ struct epoll_event ep_ev; -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_DEL, curr_epev->data.fd, &ep_ev) < 0) { -+ PRINT_ERROR("client can't delete socket '%d' to control epoll %d! ", curr_epev->data.fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (client_ask_ret == PROGRAM_ABORT) { -+ --client_unit->curr_connect; -+ if (close(curr_epev->data.fd) < 0) { -+ PRINT_ERROR("client can't close the socket! "); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "close", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } else { -+ client_unit->send_bytes += client_unit->pktlen; -+ client_debug_print("client unit", "send", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } -+ } -+ } else if (curr_epev->events == EPOLLIN) { -+ struct sockaddr_in server_addr; -+ socklen_t server_addr_len = sizeof(server_addr); -+ struct ClientHandler *client_handler = (struct ClientHandler *)curr_epev->data.ptr; -+ if (getpeername(client_handler->fd, (struct sockaddr *)&server_addr, &server_addr_len) < 0) { -+ PRINT_ERROR("client can't socket peername %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ int32_t client_chkans_ret = client_chkans((struct ClientHandler *)curr_epev->data.ptr, client_unit->pktlen, client_unit->verify, client_unit->api); -+ if (client_chkans_ret == PROGRAM_FAULT) { -+ --client_unit->curr_connect; -+ struct epoll_event ep_ev; -+ if (epoll_ctl(client_unit->epfd, EPOLL_CTL_DEL, curr_epev->data.fd, &ep_ev) < 0) { -+ PRINT_ERROR("client can't delete socket '%d' to control epoll %d! ", curr_epev->data.fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (client_chkans_ret == PROGRAM_ABORT) { -+ --client_unit->curr_connect; -+ if (close(curr_epev->data.fd) < 0) { -+ PRINT_ERROR("client can't close the socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_debug_print("client unit", "close", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } else { -+ client_unit->send_bytes += client_unit->pktlen; -+ client_debug_print("client unit", "receive", server_addr.sin_addr.s_addr, server_addr.sin_port, client_unit->debug); -+ } -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// create client of single thread and run -+void *client_s_create_and_run(void *arg) -+{ -+ struct ClientUnit *client_unit = (struct ClientUnit *)arg; -+ -+ if (client_thread_create_epfd_and_reg(client_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ while (true) { -+ if (clithd_proc_epevs(client_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ } -+ for (int i = 0; i < client_unit->connect_num; ++i) { -+ close((client_unit->handlers + i)->fd); -+ } -+ close(client_unit->epfd); -+ -+ return (void *)PROGRAM_OK; -+} -+ -+// create client and run -+int32_t client_create_and_run(struct ProgramParams *params) -+{ -+ const uint32_t connect_num = params->connect_num; -+ const uint32_t thread_num = params->thread_num; -+ pthread_t *tids = (pthread_t *)malloc(thread_num * sizeof(pthread_t)); -+ struct Client *client = (struct Client *)malloc(sizeof(struct Client)); -+ struct ClientUnit *client_unit = (struct ClientUnit *)malloc(sizeof(struct ClientUnit)); -+ -+ if (pthread_mutex_init(&client_debug_mutex, NULL) < 0) { -+ PRINT_ERROR("client can't init posix mutex %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ client->uints = client_unit; -+ client->debug = params->debug; -+ -+ for (uint32_t i = 0; i < thread_num; ++i) { -+ client_unit->handlers = (struct ClientHandler *)malloc(connect_num * sizeof(struct ClientHandler)); -+ for (uint32_t j = 0; j < connect_num; ++j) { -+ client_unit->handlers[j].fd = -1; -+ client_unit->handlers[j].msg_idx = 0; -+ } -+ client_unit->epfd = -1; -+ client_unit->epevs = (struct epoll_event *)malloc(CLIENT_EPOLL_SIZE_MAX * sizeof(struct epoll_event)); -+ client_unit->curr_connect = 0; -+ client_unit->send_bytes = 0; -+ client_unit->ip = inet_addr(params->ip); -+ client_unit->port = htons(params->port); -+ client_unit->connect_num = params->connect_num; -+ client_unit->pktlen = params->pktlen; -+ client_unit->verify = params->verify; -+ client_unit->domain = params->domain; -+ client_unit->api = params->api; -+ client_unit->debug = params->debug; -+ client_unit->next = (struct ClientUnit *)malloc(sizeof(struct ClientUnit)); -+ -+ if (pthread_create((tids + i), NULL, client_s_create_and_run, client_unit) < 0) { -+ PRINT_ERROR("client can't create thread of poisx %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ client_unit = client_unit->next; -+ } -+ -+ if (client->debug == false) { -+ printf("[program informations]: \n\n"); -+ } -+ while (true) { -+ client_info_print(client); -+ } -+ -+ pthread_mutex_destroy(&client_debug_mutex); -+ -+ return PROGRAM_OK; -+} -diff --git a/examples/src/parameter.c b/examples/src/parameter.c -index 996188b..100ee11 100644 ---- a/examples/src/parameter.c -+++ b/examples/src/parameter.c -@@ -22,148 +22,141 @@ const char prog_short_opts[] = \ - "m:" // model - "t:" // thread number - "c:" // connect number -+ "D:" // communication domain - "A:" // api - "P:" // pktlen - "v" // verify - "r" // ringpmd -+ "d" // debug - "h" // help - ; - - // program long options --const struct ProgramOption prog_long_opts[] = { \ -+const struct ProgramOption prog_long_opts[] = \ -+{ - {PARAM_NAME_AS, REQUIRED_ARGUMETN, NULL, PARAM_NUM_AS}, - {PARAM_NAME_IP, REQUIRED_ARGUMETN, NULL, PARAM_NUM_IP}, - {PARAM_NAME_PORT, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PORT}, - {PARAM_NAME_MODEL, REQUIRED_ARGUMETN, NULL, PARAM_NUM_MODEL}, - {PARAM_NAME_THREAD_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_THREAD_NUM}, - {PARAM_NAME_CONNECT_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_CONNECT_NUM}, -+ {PARAM_NAME_DOMAIN, REQUIRED_ARGUMETN, NULL, PARAM_NUM_DOMAIN}, - {PARAM_NAME_API, REQUIRED_ARGUMETN, NULL, PARAM_NUM_API}, - {PARAM_NAME_PKTLEN, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PKTLEN}, - {PARAM_NAME_VERIFY, NO_ARGUMENT, NULL, PARAM_NUM_VERIFY}, - {PARAM_NAME_RINGPMD, NO_ARGUMENT, NULL, PARAM_NUM_RINGPMD}, -+ {PARAM_NAME_DEBUG, NO_ARGUMENT, NULL, PARAM_NUM_DEBUG}, - {PARAM_NAME_HELP, NO_ARGUMENT, NULL, PARAM_NUM_HELP}, - }; - - - // get long options --int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, -- int *long_idx); -+int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, int *long_idx); - - - // set `as` parameter --int32_t program_param_prase_as(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_as(struct ProgramParams *params) - { -- if (strcmp(arg, "server") == 0 || strcmp(arg, "client") == 0) { -- params->as = arg; -- } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -+ if (strcmp(optarg, "server") == 0 || strcmp(optarg, "client") == 0) { -+ params->as = optarg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- -- return PROGRAM_OK; - } - - // set `ip` parameter --int32_t program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_ip(struct ProgramParams *params) - { -- if (inet_addr(arg) != INADDR_NONE) { -- params->ip = arg; -- } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -+ if (inet_addr(optarg) != INADDR_NONE) { -+ params->ip = optarg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- -- return PROGRAM_OK; - } - - // set `port` parameter --int32_t program_param_prase_port(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_port(struct ProgramParams *params) - { -- int32_t port_arg = atoi(optarg); -+ int32_t port_arg = strtol(optarg, NULL, 0); -+ printf("%d\n", port_arg); - if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX) == true) { - params->port = (uint32_t)port_arg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -- -- return PROGRAM_OK; - } - - // set `model` parameter --int32_t program_param_prase_model(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_model(struct ProgramParams *params) - { - if (strcmp(optarg, "mum") == 0 || strcmp(optarg, "mud") == 0) { - params->model = optarg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -- -- return PROGRAM_OK; - } - - // set `connect_num` parameter --int32_t program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_connectnum(struct ProgramParams *params) - { -- int32_t connectnum_arg = atoi(optarg); -+ int32_t connectnum_arg = strtol(optarg, NULL, 0); - if (connectnum_arg > 0) { - params->connect_num = (uint32_t)connectnum_arg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -- -- return PROGRAM_OK; - } - - // set `thread_num` parameter --int32_t program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_threadnum(struct ProgramParams *params) - { -- int32_t threadnum_arg = atoi(optarg); -+ int32_t threadnum_arg = strtol(optarg, NULL, 0); - if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX) == true) { - params->thread_num = (uint32_t)threadnum_arg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -+} - -- return PROGRAM_OK; -+// set `domain` parameter -+void program_param_parse_domain(struct ProgramParams *params) -+{ -+ if (strcmp(optarg, "unix") == 0 || strcmp(optarg, "posix") == 0) { -+ params->domain = optarg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); -+ } - } - - // set `api` parameter --int32_t program_param_prase_api(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_api(struct ProgramParams *params) - { -- if (strcmp(optarg, "unix") == 0 || strcmp(optarg, "posix") == 0) { -+ printf("aaaaaa %s\n", optarg); -+ if (strcmp(optarg, "readwrite") == 0 || strcmp(optarg, "recvsend") == 0 || strcmp(optarg, "recvsendmsg") == 0) { - params->api = optarg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -- -- return PROGRAM_OK; - } - - // set `pktlen` parameter --int32_t program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name) -+void program_param_parse_pktlen(struct ProgramParams *params) - { -- int32_t pktlen_arg = atoi(optarg); -+ int32_t pktlen_arg = strtol(optarg, NULL, 0); - if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX) == true) { - params->pktlen = (uint32_t)pktlen_arg; -+ } else { -+ PRINT_ERROR("illigal argument -- %s \n", optarg); -+ exit(PROGRAM_ABORT); - } -- else { -- PRINT_ERROR("illigal argument -- %s \n", name); -- return PROGRAM_ABORT; -- } -- -- return PROGRAM_OK; - } - - // initialize the parameters -@@ -175,10 +168,12 @@ void program_params_init(struct ProgramParams *params) - params->model = PARAM_DEFAULT_MODEL; - params->thread_num = PARAM_DEFAULT_THREAD_NUM; - params->connect_num = PARAM_DEFAULT_CONNECT_NUM; -+ params->domain = PARAM_DEFAULT_DOMAIN; - params->api = PARAM_DEFAULT_API; - params->pktlen = PARAM_DEFAULT_PKTLEN; - params->verify = PARAM_DEFAULT_VERIFY; - params->ringpmd = PARAM_DEFAULT_RINGPMD; -+ params->debug = PARAM_DEFAULT_DEBUG; - } - - // print program helps -@@ -188,19 +183,24 @@ void program_params_help(void) - printf("-a, --as [server | client]: set programas server or client. \n"); - printf(" server: as server. \n"); - printf(" client: as client. \n"); -- printf("-i, --ip [xxx.xxx.xxx.xxx]: set ip address. \n"); -- printf("-p, --port [xxxx]: set port number in range of %d - %d. \n", UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX); -+ printf("-i, --ip [???.???.???.???]: set ip address. \n"); -+ printf("-p, --port [????]: set port number in range of %d - %d. \n", UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX); - printf("-m, --model [mum | mud]: set the network model. \n"); - printf(" mum: multi thread, unblock, multiplexing IO network model. \n"); - printf(" mud: multi thread, unblock, dissymmetric network model. \n"); -- printf("-t, --threadnum [xxxx]: set thread number in range of %d - %d. \n", THREAD_NUM_MIN, THREAD_NUM_MAX); -- printf("-c, --connectnum [xxxx]: set thread number of connection. \n"); -- printf("-A, --api [unix | posix]: set api type is server or client. \n"); -+ printf("-t, --threadnum [???]: set thread number in range of %d - %d. \n", THREAD_NUM_MIN, THREAD_NUM_MAX); -+ printf("-c, --connectnum [???]: set connection number of each thread. \n"); -+ printf("-D, --domain [unix | posix]: set domain type is server or client. \n"); - printf(" unix: use unix's api. \n"); - printf(" posix: use posix api. \n"); -- printf("-P, --pktlen [xxxx]: set packet length in range of %d - %d. \n", MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX); -+ printf("-A, --api [readwrite | recvsend | recvsendmsg]: set api type is server or client. \n"); -+ printf(" readwrite: use `read` and `write`. \n"); -+ printf(" recvsend: use `recv and `send`. \n"); -+ printf(" recvsendmsg: use `recvmsg` and `sendmsg`. \n"); -+ printf("-P, --pktlen [????]: set packet length in range of %d - %d. \n", MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX); - printf("-v, --verify: set to verifying the message packet. \n"); -- printf("-r, --ringpmd: set use ringpmd. \n"); -+ printf("-r, --ringpmd: set to use ringpmd. \n"); -+ printf("-d, --debug: set to print the debug information. \n"); - printf("-h, --help: see helps. \n"); - printf("\n"); - } -@@ -208,40 +208,44 @@ void program_params_help(void) - // parse the parameters - int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[]) - { -- int32_t ret = PROGRAM_OK; -+ int32_t c; - -- while (ret == PROGRAM_OK) { -+ while (true) { - int32_t opt_idx = 0; - -- int32_t c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); -+ c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx); -+ - if (c == -1) { - break; - } - - switch (c) { - case (PARAM_NUM_AS): -- ret = program_param_prase_as(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_as(params); - break; - case (PARAM_NUM_IP): -- ret = program_param_prase_ip(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_ip(params); - break; - case (PARAM_NUM_PORT): -- ret = program_param_prase_port(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_port(params); - break; - case (PARAM_NUM_MODEL): -- ret = program_param_prase_model(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_model(params); - break; - case (PARAM_NUM_CONNECT_NUM): -- ret = program_param_prase_connectnum(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_connectnum(params); - break; - case (PARAM_NUM_THREAD_NUM): -- ret = program_param_prase_threadnum(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_threadnum(params); -+ break; -+ case (PARAM_NUM_DOMAIN): -+ program_param_parse_domain(params); - break; - case (PARAM_NUM_API): -- ret = program_param_prase_api(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_api(params); - break; - case (PARAM_NUM_PKTLEN): -- ret = program_param_prase_pktlen(params, optarg, prog_long_opts[opt_idx].name); -+ program_param_parse_pktlen(params); - break; - case (PARAM_NUM_VERIFY): - params->verify = true; -@@ -249,6 +253,9 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char * - case (PARAM_NUM_RINGPMD): - params->ringpmd = true; - break; -+ case (PARAM_NUM_DEBUG): -+ params->debug = true; -+ break; - case (PARAM_NUM_HELP): - program_params_help(); - return PROGRAM_ABORT; -@@ -260,7 +267,12 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char * - } - } - -- return ret; -+ if (strcmp(params->domain, "unix") == 0) { -+ params->thread_num = 1; -+ params->connect_num = 1; -+ } -+ -+ return PROGRAM_OK; - } - - // print the parameters -@@ -269,14 +281,28 @@ void program_params_print(struct ProgramParams *params) - printf("\n"); - printf("[program parameters]: \n"); - printf("--> [as]: %s \n", params->as); -- printf("--> [ip]: %s \n", params->ip); -- printf("--> [port]: %u \n", params->port); -- printf("--> [model]: %s \n", params->model); -- printf("--> [thread number]: %u \n", params->thread_num); -- printf("--> [connection number]: %u \n", params->connect_num); -- printf("--> [api]: %s \n", params->api); -+ printf("--> [server ip]: %s \n", params->ip); -+ printf("--> [server port]: %u \n", params->port); -+ if (strcmp(params->as, "server") == 0) { -+ printf("--> [model]: %s \n", params->model); -+ } -+ if ((strcmp(params->as, "server") == 0 && strcmp(params->model, "mum") == 0) || strcmp(params->as, "client") == 0) { -+ printf("--> [thread number]: %u \n", params->thread_num); -+ } -+ if (strcmp(params->as, "client") == 0) { -+ printf("--> [connection number]: %u \n", params->connect_num); -+ } -+ printf("--> [domain]: %s \n", params->domain); -+ if (strcmp(params->api, "readwrite") == 0) { -+ printf("--> [api]: read & write \n"); -+ } else if (strcmp(params->api, "recvsend") == 0) { -+ printf("--> [api]: recv & send \n"); -+ } else { -+ printf("--> [api]: recvmsg & sendmsg \n"); -+ } - printf("--> [packet length]: %u \n", params->pktlen); -- printf("--> [verify]: %s \n", (true == params->verify) ? "on" : "off"); -- printf("--> [ringpmd]: %s \n", (true == params->ringpmd) ? "on" : "off"); -+ printf("--> [verify]: %s \n", (params->verify == true) ? "on" : "off"); -+ printf("--> [ringpmd]: %s \n", (params->ringpmd == true) ? "on" : "off"); -+ printf("--> [debug]: %s \n", (params->debug == true) ? "on" : "off"); - printf("\n"); - } -diff --git a/examples/src/server.c b/examples/src/server.c -new file mode 100644 -index 0000000..d1dab72 ---- /dev/null -+++ b/examples/src/server.c -@@ -0,0 +1,578 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "server.h" -+ -+ -+static pthread_mutex_t server_debug_mutex; // the server mutex for debug -+ -+// server debug information print -+void server_debug_print(const char *ch_str, const char *act_str, in_addr_t ip, uint16_t port, bool debug) -+{ -+ if (debug == true) { -+ pthread_mutex_lock(&server_debug_mutex); -+ struct in_addr sin_addr; -+ sin_addr.s_addr = ip; -+ PRINT_SERVER("[%s] [pid: %d] [tid: %ld] [%s <- %s:%d]. ", \ -+ ch_str, \ -+ getpid(), \ -+ pthread_self(), \ -+ act_str, \ -+ inet_ntoa(sin_addr), \ -+ ntohs(port)); -+ pthread_mutex_unlock(&server_debug_mutex); -+ } -+} -+ -+// the multi thread, unblock, dissymmetric server prints informations -+void sermud_info_print(struct ServerMud *server_mud) -+{ -+ if (server_mud->debug == false) { -+ uint32_t curr_connect = server_mud->curr_connect; -+ -+ struct timeval begin; -+ gettimeofday(&begin, NULL); -+ uint64_t begin_time = (uint64_t)begin.tv_sec * 1000 + (uint64_t)begin.tv_usec / 1000; -+ -+ double bytes_ps = 0; -+ uint64_t begin_recv_bytes = 0; -+ struct ServerMudWorker *begin_uint = server_mud->workers; -+ while (begin_uint != NULL) { -+ begin_recv_bytes += begin_uint->recv_bytes; -+ begin_uint = begin_uint->next; -+ } -+ -+ struct timeval delay; -+ delay.tv_sec = 0; -+ delay.tv_usec = TERMINAL_REFRESH_MS * 1000; -+ select(0, NULL, NULL, NULL, &delay); -+ -+ uint64_t end_recv_bytes = 0; -+ struct ServerMudWorker *end_uint = server_mud->workers; -+ while (end_uint != NULL) { -+ end_recv_bytes += end_uint->recv_bytes; -+ end_uint = end_uint->next; -+ } -+ -+ struct timeval end; -+ gettimeofday(&end, NULL); -+ uint64_t end_time = (uint64_t)end.tv_sec * 1000 + (uint64_t)end.tv_usec / 1000; -+ -+ double bytes_sub = end_recv_bytes > begin_recv_bytes ? (double)(end_recv_bytes - begin_recv_bytes) : 0; -+ double time_sub = end_time > begin_time ? (double)(end_time - begin_time) / 1000 : 0; -+ -+ bytes_ps = bytes_sub / time_sub; -+ -+ if (bytes_ps < 1024) { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f B/s", curr_connect, bytes_ps); -+ } else if (bytes_ps < (1024 * 1024)) { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f KB/s", curr_connect, bytes_ps / 1024); -+ } else { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f MB/s", curr_connect, bytes_ps / (1024 * 1024)); -+ } -+ } -+} -+ -+// the worker thread, unblock, dissymmetric server listens and gets epoll feature descriptors -+int32_t sermud_worker_create_epfd_and_reg(struct ServerMudWorker *worker_unit) -+{ -+ worker_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX); -+ if (worker_unit->epfd < 0) { -+ PRINT_ERROR("server can't create epoll %d! ", worker_unit->epfd); -+ return PROGRAM_FAULT; -+ } -+ -+ struct epoll_event ep_ev; -+ ep_ev.data.ptr = (void *)&(worker_unit->worker); -+ ep_ev.events = EPOLLIN | EPOLLET; -+ if (epoll_ctl(worker_unit->epfd, EPOLL_CTL_ADD, worker_unit->worker.fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't control epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the listener thread, unblock, dissymmetric server listens and gets epoll feature descriptors -+int32_t sermud_listener_create_epfd_and_reg(struct ServerMud *server_mud) -+{ -+ server_mud->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX); -+ if (server_mud->epfd < 0) { -+ PRINT_ERROR("server can't create epoll %d! ", server_mud->epfd); -+ return PROGRAM_FAULT; -+ } -+ -+ struct epoll_event ep_ev; -+ ep_ev.data.ptr = (void *)&(server_mud->listener); -+ ep_ev.events = EPOLLIN | EPOLLET; -+ if (epoll_ctl(server_mud->epfd, EPOLL_CTL_ADD, server_mud->listener.fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't control epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ server_debug_print("server mud listener", "waiting", server_mud->ip, server_mud->port, server_mud->debug); -+ -+ return PROGRAM_OK; -+} -+ -+// the listener thread, unblock, dissymmetric server accepts the connections -+int32_t sermud_listener_accept_connects(struct ServerMud *server_mud) -+{ -+ while (true) { -+ struct sockaddr_in accept_addr; -+ uint32_t sockaddr_in_len = sizeof(struct sockaddr_in); -+ int32_t accept_fd = accept(server_mud->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len); -+ if (accept_fd < 0) { -+ break; -+ } -+ -+ if (set_socket_unblock(accept_fd) < 0) { -+ PRINT_ERROR("server can't set the connect socket to unblock! "); -+ return PROGRAM_FAULT; -+ } -+ -+ ++(server_mud->curr_connect); -+ -+ pthread_t *tid = (pthread_t *)malloc(sizeof(pthread_t)); -+ struct ServerMudWorker *worker = (struct ServerMudWorker *)malloc(sizeof(struct ServerMudWorker)); -+ worker->worker.fd = accept_fd; -+ worker->epfd = -1; -+ worker->epevs = (struct epoll_event *)malloc(sizeof(struct epoll_event)); -+ worker->recv_bytes = 0; -+ worker->pktlen = server_mud->pktlen; -+ worker->ip = accept_addr.sin_addr.s_addr; -+ worker->port = accept_addr.sin_port; -+ worker->api = server_mud->api; -+ worker->debug = server_mud->debug; -+ worker->next = server_mud->workers; -+ -+ server_mud->workers = worker; -+ -+ if (pthread_create(tid, NULL, sermud_worker_create_and_run, server_mud->workers) < 0) { -+ PRINT_ERROR("server can't create poisx thread %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ server_debug_print("server mud listener", "accept", accept_addr.sin_addr.s_addr, accept_addr.sin_port, server_mud->debug); -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the worker thread, unblock, dissymmetric server processes the events -+int32_t sermud_worker_proc_epevs(struct ServerMudWorker *worker_unit) -+{ -+ int32_t epoll_nfds = epoll_wait(worker_unit->epfd, worker_unit->epevs, SERVER_EPOLL_SIZE_MAX, SERVER_EPOLL_WAIT_TIMEOUT); -+ if (epoll_nfds < 0) { -+ PRINT_ERROR("server epoll wait error %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ for (int32_t i = 0; i < epoll_nfds; ++i) { -+ struct epoll_event *curr_epev = worker_unit->epevs + i; -+ -+ if (curr_epev->events == EPOLLERR || curr_epev->events == EPOLLHUP || curr_epev->events == EPOLLRDHUP) { -+ PRINT_ERROR("server epoll wait error %d! ", curr_epev->events); -+ return PROGRAM_FAULT; -+ } -+ -+ if (curr_epev->events == EPOLLIN) { -+ struct ServerHandler *server_handler = (struct ServerHandler *)curr_epev->data.ptr; -+ -+ int32_t server_ans_ret = server_ans(server_handler, worker_unit->pktlen, worker_unit->api); -+ if (server_ans_ret == PROGRAM_FAULT) { -+ struct epoll_event ep_ev; -+ if (epoll_ctl(worker_unit->epfd, EPOLL_CTL_DEL, server_handler->fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't delete socket '%d' to control epoll %d! ", server_handler->fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (server_ans_ret == PROGRAM_ABORT) { -+ if (close(server_handler->fd) < 0) { -+ PRINT_ERROR("server can't close the socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ server_debug_print("server mud worker", "close", worker_unit->ip, worker_unit->port, worker_unit->debug); -+ } else { -+ worker_unit->recv_bytes += worker_unit->pktlen; -+ server_debug_print("server mud worker", "receive", worker_unit->ip, worker_unit->port, worker_unit->debug); -+ } -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the listener thread, unblock, dissymmetric server processes the events -+int32_t sermud_listener_proc_epevs(struct ServerMud *server_mud) -+{ -+ int32_t epoll_nfds = epoll_wait(server_mud->epfd, server_mud->epevs, SERVER_EPOLL_SIZE_MAX, SERVER_EPOLL_WAIT_TIMEOUT); -+ if (epoll_nfds < 0) { -+ PRINT_ERROR("server epoll wait error %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ for (int32_t i = 0; i < epoll_nfds; ++i) { -+ struct epoll_event *curr_epev = server_mud->epevs + i; -+ -+ if (curr_epev->events == EPOLLERR || curr_epev->events == EPOLLHUP || curr_epev->events == EPOLLRDHUP) { -+ PRINT_ERROR("server epoll wait error %d! ", curr_epev->events); -+ return PROGRAM_FAULT; -+ } -+ -+ if (curr_epev->events == EPOLLIN) { -+ int32_t sermud_listener_accept_connects_ret = sermud_listener_accept_connects(server_mud); -+ if (sermud_listener_accept_connects_ret < 0) { -+ PRINT_ERROR("server try accept error %d! ", sermud_listener_accept_connects_ret); -+ return PROGRAM_FAULT; -+ } -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// create the worker thread, unblock, dissymmetric server and run -+void *sermud_worker_create_and_run(void *arg) -+{ -+ pthread_detach(pthread_self()); -+ -+ struct ServerMudWorker *worker_unit = (struct ServerMudWorker *)arg; -+ -+ if (sermud_worker_create_epfd_and_reg(worker_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ while (true) { -+ if (sermud_worker_proc_epevs(worker_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ } -+ -+ close(worker_unit->worker.fd); -+ close(worker_unit->epfd); -+ -+ return (void *)PROGRAM_OK; -+} -+ -+// create the listener thread, unblock, dissymmetric server and run -+void *sermud_listener_create_and_run(void *arg) -+{ -+ struct ServerMud *server_mud = (struct ServerMud *)arg; -+ -+ if (create_socket_and_listen(&(server_mud->listener.fd), server_mud->ip, server_mud->port, server_mud->domain) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ if (sermud_listener_create_epfd_and_reg(server_mud) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ while (true) { -+ if (sermud_listener_proc_epevs(server_mud) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ } -+ if (close(server_mud->listener.fd) < 0 || close(server_mud->epfd) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ -+ return (void *)PROGRAM_OK; -+} -+ -+// create the multi thread, unblock, dissymmetric server and run -+int32_t sermud_create_and_run(struct ProgramParams *params) -+{ -+ pthread_t *tid = (pthread_t *)malloc(sizeof(pthread_t)); -+ struct ServerMud *server_mud = (struct ServerMud *)malloc(sizeof(struct ServerMud)); -+ -+ if (pthread_mutex_init(&server_debug_mutex, NULL) < 0) { -+ PRINT_ERROR("server can't init posix mutex %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ server_mud->listener.fd = -1; -+ server_mud->workers = NULL; -+ server_mud->epfd = -1; -+ server_mud->epevs = (struct epoll_event *)malloc(SERVER_EPOLL_SIZE_MAX * sizeof(struct epoll_event)); -+ server_mud->curr_connect = 0; -+ server_mud->ip = inet_addr(params->ip); -+ server_mud->port = htons(params->port); -+ server_mud->pktlen = params->pktlen; -+ server_mud->domain = params->domain; -+ server_mud->api = params->api; -+ server_mud->debug = params->debug; -+ -+ if (pthread_create(tid, NULL, sermud_listener_create_and_run, server_mud) < 0) { -+ PRINT_ERROR("server can't create poisx thread %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ if (server_mud->debug == false) { -+ printf("[program informations]: \n\n"); -+ } -+ while (true) { -+ sermud_info_print(server_mud); -+ } -+ -+ pthread_mutex_destroy(&server_debug_mutex); -+ -+ return PROGRAM_OK; -+} -+ -+// the multi thread, unblock, mutliplexing IO server prints informations -+void sermum_info_print(struct ServerMum *server_mum) -+{ -+ if (server_mum->debug == false) { -+ struct timeval begin; -+ gettimeofday(&begin, NULL); -+ uint64_t begin_time = (uint64_t)begin.tv_sec * 1000 + (uint64_t)begin.tv_usec / 1000; -+ -+ uint32_t curr_connect = 0; -+ double bytes_ps = 0; -+ uint64_t begin_recv_bytes = 0; -+ struct ServerMumUnit *begin_uint = server_mum->uints; -+ while (begin_uint != NULL) { -+ curr_connect += begin_uint->curr_connect; -+ begin_recv_bytes += begin_uint->recv_bytes; -+ begin_uint = begin_uint->next; -+ } -+ -+ struct timeval delay; -+ delay.tv_sec = 0; -+ delay.tv_usec = TERMINAL_REFRESH_MS * 1000; -+ select(0, NULL, NULL, NULL, &delay); -+ -+ uint64_t end_recv_bytes = 0; -+ struct ServerMumUnit *end_uint = server_mum->uints; -+ while (end_uint != NULL) { -+ end_recv_bytes += end_uint->recv_bytes; -+ end_uint = end_uint->next; -+ } -+ -+ struct timeval end; -+ gettimeofday(&end, NULL); -+ uint64_t end_time = (uint64_t)end.tv_sec * 1000 + (uint64_t)end.tv_usec / 1000; -+ -+ double bytes_sub = end_recv_bytes > begin_recv_bytes ? (double)(end_recv_bytes - begin_recv_bytes) : 0; -+ double time_sub = end_time > begin_time ? (double)(end_time - begin_time) / 1000 : 0; -+ -+ bytes_ps = bytes_sub / time_sub; -+ -+ if (bytes_ps < 1024) { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f B/s", curr_connect, bytes_ps); -+ } else if (bytes_ps < (1024 * 1024)) { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f KB/s", curr_connect, bytes_ps / 1024); -+ } else { -+ PRINT_SERVER_DATAFLOW("[connect num]: %d, [receive]: %.3f MB/s", curr_connect, bytes_ps / (1024 * 1024)); -+ } -+ } -+} -+ -+// the single thread, unblock, mutliplexing IO server listens and gets epoll feature descriptors -+int32_t sersum_create_epfd_and_reg(struct ServerMumUnit *server_unit) -+{ -+ server_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX); -+ if (server_unit->epfd < 0) { -+ PRINT_ERROR("server can't create epoll %d! ", server_unit->epfd); -+ return PROGRAM_FAULT; -+ } -+ -+ struct epoll_event ep_ev; -+ ep_ev.data.ptr = (void *)&(server_unit->listener); -+ ep_ev.events = EPOLLIN | EPOLLET; -+ if (epoll_ctl(server_unit->epfd, EPOLL_CTL_ADD, server_unit->listener.fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't control epoll %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ server_debug_print("server mum unit", "waiting", server_unit->ip, server_unit->port, server_unit->debug); -+ -+ return PROGRAM_OK; -+} -+ -+// the single thread, unblock, mutliplexing IO server accepts the connections -+int32_t sersum_accept_connects(struct ServerMumUnit *server_unit, struct ServerHandler *server_handler) -+{ -+ while (true) { -+ struct sockaddr_in accept_addr; -+ uint32_t sockaddr_in_len = sizeof(struct sockaddr_in); -+ int32_t accept_fd = accept(server_unit->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len); -+ if (accept_fd < 0) { -+ break; -+ } -+ -+ if (set_socket_unblock(accept_fd) < 0) { -+ PRINT_ERROR("server can't set the connect socket to unblock! "); -+ return PROGRAM_FAULT; -+ } -+ -+ struct ServerHandler *server_handler = (struct ServerHandler *)malloc(sizeof(struct ServerHandler)); -+ server_handler->fd = accept_fd; -+ struct epoll_event ep_ev; -+ ep_ev.data.ptr = (void *)server_handler; -+ ep_ev.events = EPOLLIN | EPOLLET; -+ if (epoll_ctl(server_unit->epfd, EPOLL_CTL_ADD, accept_fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't add socket '%d' to control epoll %d! ", accept_fd, errno); -+ return PROGRAM_FAULT; -+ } -+ -+ ++server_unit->curr_connect; -+ -+ server_debug_print("server mum unit", "accept", accept_addr.sin_addr.s_addr, accept_addr.sin_port, server_unit->debug); -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// the single thread, unblock, mutliplexing IO server processes the events -+int32_t sersum_proc_epevs(struct ServerMumUnit *server_unit) -+{ -+ int32_t epoll_nfds = epoll_wait(server_unit->epfd, server_unit->epevs, SERVER_EPOLL_SIZE_MAX, SERVER_EPOLL_WAIT_TIMEOUT); -+ if (epoll_nfds < 0) { -+ PRINT_ERROR("server epoll wait error %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ for (int32_t i = 0; i < epoll_nfds; ++i) { -+ struct epoll_event *curr_epev = server_unit->epevs + i; -+ -+ if (curr_epev->events == EPOLLERR || curr_epev->events == EPOLLHUP || curr_epev->events == EPOLLRDHUP) { -+ PRINT_ERROR("server epoll wait error %d! ", curr_epev->events); -+ return PROGRAM_FAULT; -+ } -+ -+ if (curr_epev->events == EPOLLIN) { -+ if (curr_epev->data.ptr == (void *)&(server_unit->listener)) { -+ int32_t sersum_accept_connects_ret = sersum_accept_connects(server_unit, &(server_unit->listener)); -+ if (sersum_accept_connects_ret < 0) { -+ PRINT_ERROR("server try accept error %d! ", sersum_accept_connects_ret); -+ return PROGRAM_FAULT; -+ } -+ continue; -+ } else { -+ struct ServerHandler *server_handler = (struct ServerHandler *)curr_epev->data.ptr; -+ struct sockaddr_in connect_addr; -+ socklen_t connect_addr_len = sizeof(connect_addr); -+ if (getpeername(server_handler->fd, (struct sockaddr *)&connect_addr, &connect_addr_len) < 0) { -+ PRINT_ERROR("server can't socket peername %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ int32_t server_ans_ret = server_ans(server_handler, server_unit->pktlen, server_unit->api); -+ if (server_ans_ret == PROGRAM_FAULT) { -+ --server_unit->curr_connect; -+ struct epoll_event ep_ev; -+ if (epoll_ctl(server_unit->epfd, EPOLL_CTL_DEL, server_handler->fd, &ep_ev) < 0) { -+ PRINT_ERROR("server can't delete socket '%d' to control epoll %d! ", server_handler->fd, errno); -+ return PROGRAM_FAULT; -+ } -+ } else if (server_ans_ret == PROGRAM_ABORT) { -+ --server_unit->curr_connect; -+ if (close(server_handler->fd) < 0) { -+ PRINT_ERROR("server can't close the socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ server_debug_print("server mum unit", "close", connect_addr.sin_addr.s_addr, connect_addr.sin_port, server_unit->debug); -+ } else { -+ server_unit->recv_bytes += server_unit->pktlen; -+ server_debug_print("server mum unit", "receive", connect_addr.sin_addr.s_addr, connect_addr.sin_port, server_unit->debug); -+ } -+ } -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// create the single thread, unblock, mutliplexing IO server -+void *sersum_create_and_run(void *arg) -+{ -+ struct ServerMumUnit *server_unit = (struct ServerMumUnit *)arg; -+ -+ if (create_socket_and_listen(&(server_unit->listener.fd), server_unit->ip, server_unit->port, server_unit->domain) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ if (sersum_create_epfd_and_reg(server_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ while (true) { -+ if (sersum_proc_epevs(server_unit) < 0) { -+ exit(PROGRAM_FAULT); -+ } -+ } -+ -+ close(server_unit->listener.fd); -+ close(server_unit->epfd); -+ -+ return (void *)PROGRAM_OK; -+} -+ -+// create the multi thread, unblock, mutliplexing IO server -+int32_t sermum_create_and_run(struct ProgramParams *params) -+{ -+ const uint32_t thread_num = params->thread_num; -+ pthread_t *tids = (pthread_t *)malloc(thread_num * sizeof(pthread_t)); -+ struct ServerMum *server_mum = (struct ServerMum *)malloc(sizeof(struct ServerMum)); -+ struct ServerMumUnit *server_unit = (struct ServerMumUnit *)malloc(sizeof(struct ServerMumUnit)); -+ -+ if (pthread_mutex_init(&server_debug_mutex, NULL) < 0) { -+ PRINT_ERROR("server can't init posix mutex %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ server_mum->uints = server_unit; -+ server_mum->debug = params->debug; -+ -+ for (uint32_t i = 0; i < thread_num; ++i) { -+ server_unit->listener.fd = -1; -+ server_unit->epfd = -1; -+ server_unit->epevs = (struct epoll_event *)malloc(SERVER_EPOLL_SIZE_MAX * sizeof(struct epoll_event)); -+ server_unit->curr_connect = 0; -+ server_unit->recv_bytes = 0; -+ server_unit->ip = inet_addr(params->ip); -+ server_unit->port = htons(params->port); -+ server_unit->pktlen = params->pktlen; -+ server_unit->domain = params->domain; -+ server_unit->api = params->api; -+ server_unit->debug = params->debug; -+ server_unit->next = (struct ServerMumUnit *)malloc(sizeof(struct ServerMumUnit)); -+ -+ if (pthread_create((tids + i), NULL, sersum_create_and_run, server_unit) < 0) { -+ PRINT_ERROR("server can't create poisx thread %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ server_unit = server_unit->next; -+ } -+ -+ if (server_mum->debug == false) { -+ printf("[program informations]: \n\n"); -+ } -+ while (true) { -+ sermum_info_print(server_mum); -+ } -+ -+ pthread_mutex_destroy(&server_debug_mutex); -+ -+ return PROGRAM_OK; -+} -+ -+// create server and run -+int32_t server_create_and_run(struct ProgramParams *params) -+{ -+ int32_t ret = PROGRAM_OK; -+ -+ if (strcmp(params->model, "mum") == 0) { -+ ret = sermum_create_and_run(params); -+ } else { -+ ret = sermud_create_and_run(params); -+ } -+ -+ return ret; -+} -diff --git a/examples/src/utilities.c b/examples/src/utilities.c -new file mode 100644 -index 0000000..b6ed269 ---- /dev/null -+++ b/examples/src/utilities.c -@@ -0,0 +1,128 @@ -+/* -+* Copyright (c) 2022-2023. yyangoO. -+* gazelle is licensed under the Mulan PSL v2. -+* You can use this software according to the terms and conditions of the Mulan PSL v2. -+* You may obtain a copy of Mulan PSL v2 at: -+* http://license.coscl.org.cn/MulanPSL2 -+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+* PURPOSE. -+* See the Mulan PSL v2 for more details. -+*/ -+ -+ -+#include "utilities.h" -+ -+ -+// create the socket and listen -+int32_t create_socket_and_listen(int32_t *socket_fd, in_addr_t ip, uint16_t port, const char *domain) -+{ -+ if (strcmp(domain, "posix") == 0) { -+ *socket_fd = socket(AF_INET, SOCK_STREAM, 0); -+ if (*socket_fd < 0) { -+ PRINT_ERROR("can't create socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } else { -+ *socket_fd = socket(AF_UNIX, SOCK_STREAM, 0); -+ if (*socket_fd < 0) { -+ PRINT_ERROR("can't create socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } -+ -+ int32_t port_multi = 1; -+ if (setsockopt(*socket_fd, SOL_SOCKET, SO_REUSEPORT, (void *)&port_multi, sizeof(int32_t)) < 0) { -+ PRINT_ERROR("can't set the option of socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ if (set_socket_unblock(*socket_fd) < 0) { -+ PRINT_ERROR("can't set the socket to unblock! "); -+ return PROGRAM_FAULT; -+ } -+ -+ if (strcmp(domain, "posix") == 0) { -+ struct sockaddr_in socket_addr; -+ memset_s(&socket_addr, sizeof(socket_addr), 0, sizeof(socket_addr)); -+ socket_addr.sin_family = AF_INET; -+ socket_addr.sin_addr.s_addr = ip; -+ socket_addr.sin_port = port; -+ if (bind(*socket_fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) < 0) { -+ PRINT_ERROR("can't bind the address to socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ if (listen(*socket_fd, SERVER_SOCKET_LISTEN_BACKLOG) < 0) { -+ PRINT_ERROR("server socket can't lisiten %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } else { -+ struct sockaddr_un socket_addr; -+ unlink(SOCKET_UNIX_DOMAIN_FILE); -+ socket_addr.sun_family = AF_UNIX; -+ strcpy_s(socket_addr.sun_path, sizeof(socket_addr.sun_path), SOCKET_UNIX_DOMAIN_FILE); -+ if (bind(*socket_fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_un)) < 0) { -+ PRINT_ERROR("can't bind the address to socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ if (listen(*socket_fd, SERVER_SOCKET_LISTEN_BACKLOG) < 0) { -+ PRINT_ERROR("server socket can't lisiten %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } -+ -+ return PROGRAM_OK; -+} -+ -+// create the socket and connect -+int32_t create_socket_and_connect(int32_t *socket_fd, in_addr_t ip, uint16_t port, const char *domain) -+{ -+ if (strcmp(domain, "posix") == 0) { -+ *socket_fd = socket(AF_INET, SOCK_STREAM, 0); -+ if (*socket_fd < 0) { -+ PRINT_ERROR("client can't create socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ struct sockaddr_in server_addr; -+ memset_s(&server_addr, sizeof(server_addr), 0, sizeof(server_addr)); -+ server_addr.sin_family = AF_INET; -+ server_addr.sin_addr.s_addr = ip; -+ server_addr.sin_port = port; -+ if (connect(*socket_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0) { -+ if (errno == EINPROGRESS) { -+ return PROGRAM_INPROGRESS; -+ } else { -+ PRINT_ERROR("client can't connect to the server %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } -+ } else { -+ *socket_fd = socket(AF_UNIX, SOCK_STREAM, 0); -+ if (*socket_fd < 0) { -+ PRINT_ERROR("client can't create socket %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ -+ struct sockaddr_un server_addr; -+ server_addr.sun_family = AF_UNIX; -+ strcpy_s(server_addr.sun_path, sizeof(server_addr.sun_path), SOCKET_UNIX_DOMAIN_FILE); -+ if (connect(*socket_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un)) < 0) { -+ if (errno == EINPROGRESS) { -+ return PROGRAM_INPROGRESS; -+ } else { -+ PRINT_ERROR("client can't connect to the server %d! ", errno); -+ return PROGRAM_FAULT; -+ } -+ } -+ } -+ return PROGRAM_OK; -+} -+ -+// set the socket to unblock -+int32_t set_socket_unblock(int32_t socket_fd) -+{ -+ return fcntl(socket_fd, F_SETFL, fcntl(socket_fd, F_GETFD, 0) | O_NONBLOCK); -+} --- -2.23.0 - diff --git a/0085-expand-thread-rpc-msg-pool-size.patch b/0085-expand-thread-rpc-msg-pool-size.patch deleted file mode 100644 index f76a0f7..0000000 --- a/0085-expand-thread-rpc-msg-pool-size.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 6c88041590ef9f79e85a243fa905267898f3ab98 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 5 Sep 2022 16:54:55 +0800 -Subject: [PATCH] expand thread rpc msg pool size - ---- - src/lstack/core/lstack_thread_rpc.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index a6e9725..c9fc4e9 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -23,7 +23,7 @@ - #include "lstack_dpdk.h" - #include "lstack_thread_rpc.h" - --#define RPC_MSG_MAX 32 -+#define RPC_MSG_MAX 512 - #define RPC_MSG_MASK (RPC_MSG_MAX - 1) - struct rpc_msg_pool { - struct rpc_msg msgs[RPC_MSG_MAX]; --- -2.23.0 - diff --git a/0086-fix-fd-leak.patch b/0086-fix-fd-leak.patch deleted file mode 100644 index 4801357..0000000 --- a/0086-fix-fd-leak.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 0e4e3a3357d5a2ffff06bf9a32bba95e207e8ff0 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 6 Sep 2022 16:23:58 +0800 -Subject: [PATCH 01/21] fix fd leak - ---- - src/lstack/core/lstack_control_plane.c | 6 +++++- - src/ltran/ltran_monitor.c | 4 +++- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 8012fa6..7f62254 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -713,6 +713,7 @@ void control_server_thread(void *arg) - - int32_t epfd = init_epoll(listenfd); - if (epfd < 0) { -+ posix_api->close_fn(listenfd); - LSTACK_LOG(ERR, LSTACK, "init_epoll failed\n"); - return; - } -@@ -744,7 +745,9 @@ void control_server_thread(void *arg) - - evt_array.data.fd = connfd; - evt_array.events = EPOLLIN; -- posix_api->epoll_ctl_fn(epfd, EPOLL_CTL_ADD, connfd, &evt_array); -+ if (posix_api->epoll_ctl_fn(epfd, EPOLL_CTL_ADD, connfd, &evt_array) < 0) { -+ posix_api->close_fn(connfd); -+ } - } else { - if (handle_stat_request(evt_array.data.fd) < 0) { - posix_api->close_fn(evt_array.data.fd); -@@ -761,6 +764,7 @@ void control_client_thread(void *arg) - - epfd = init_epoll(sockfd); - if (epfd < 0) { -+ posix_api->close_fn(sockfd); - LSTACK_LOG(ERR, LSTACK, "control_thread fail\n"); - return; - } -diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c -index dfda93f..7da65ea 100644 ---- a/src/ltran/ltran_monitor.c -+++ b/src/ltran/ltran_monitor.c -@@ -188,6 +188,7 @@ static int32_t gazelle_ctl_init(void) - - ret = gazelle_ep_event_init(&event_dfx, GAZELLE_DFX_SERVER_FD, listenfd); - if (ret != GAZELLE_OK) { -+ close(listenfd); - return GAZELLE_ERR; - } - -@@ -207,6 +208,7 @@ static int32_t gazelle_ctl_init(void) - - ret = gazelle_ep_event_init(&event_reg, GAZELLE_REG_SERVER_FD, listenfd); - if (ret != GAZELLE_OK) { -+ close(listenfd); - sockfd_data_free(event_dfx.data.ptr); - return GAZELLE_ERR; - } -@@ -283,7 +285,6 @@ static void dfx_server_msg_proc(uint32_t events, struct sockfd_data *data) - if (ret < 0) { - LTRAN_ERR("epoll_ctl ERROR, errno: %d. ret=%d.\n", errno, ret); - sockfd_data_free(event.data.ptr); -- close(conn_fd); - return; - } - } -@@ -421,6 +422,7 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data) - event.events = EPOLLIN; - if (event.data.ptr == NULL) { - LTRAN_ERR("alloc sockfd_data ERROR\n"); -+ close(conn_fd); - return; - } - --- -2.23.0 - diff --git a/0087-fix-del-conn-use-after-free.patch b/0087-fix-del-conn-use-after-free.patch deleted file mode 100644 index 8db8d5e..0000000 --- a/0087-fix-del-conn-use-after-free.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 898e627aad3f0a997fa87a54ee397e999953d695 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 6 Sep 2022 19:08:25 +0800 -Subject: [PATCH 02/21] fix del conn use after free - ---- - src/ltran/ltran_timer.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c -index 3ee266c..85ea324 100644 ---- a/src/ltran/ltran_timer.c -+++ b/src/ltran/ltran_timer.c -@@ -101,11 +101,11 @@ void gazelle_detect_conn_logout(struct gazelle_tcp_conn_htable *conn_htable) - hlist_del_init(&conn->conn_node); - conn_htable->cur_conn_num--; - conn_htable->array[i].chain_size--; -- rte_free(conn); - LTRAN_DEBUG("delete the tcp conn htable: tid %u quintuple[%u %u %u %u %u]\n", - conn->tid, conn->quintuple.protocol, - conn->quintuple.src_ip, (uint32_t)ntohs(conn->quintuple.src_port), - conn->quintuple.dst_ip, (uint32_t)ntohs(conn->quintuple.dst_port)); -+ rte_free(conn); - } - } - } --- -2.23.0 - diff --git a/0088-init-g_gazelle_errno-before-use.patch b/0088-init-g_gazelle_errno-before-use.patch deleted file mode 100644 index ac9ec64..0000000 --- a/0088-init-g_gazelle_errno-before-use.patch +++ /dev/null @@ -1,24 +0,0 @@ -From b7fe5b572c7d09a0e5ce58d0102ff76777edc8c4 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 6 Sep 2022 19:16:00 +0800 -Subject: [PATCH 03/21] init g_gazelle_errno before use - ---- - src/ltran/ltran_param.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index 75cc2f9..fc45895 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -574,6 +574,7 @@ int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config * - - int32_t param_num = sizeof(g_param_parse_tbl) / sizeof(g_param_parse_tbl[0]); - for (int32_t i = 0; i < param_num; i++) { -+ gazelle_set_errno(GAZELLE_SUCCESS); - ret = g_param_parse_tbl[i].func(&config, g_param_parse_tbl[i].param_name, ltran_config); - if (ret != GAZELLE_OK) { - config_destroy(&config); --- -2.23.0 - diff --git a/0089-code-format-specification.patch b/0089-code-format-specification.patch deleted file mode 100644 index 37720d3..0000000 --- a/0089-code-format-specification.patch +++ /dev/null @@ -1,39 +0,0 @@ -From c414e36e78b616b9d8a34317b2fd473c3c3ab000 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 6 Sep 2022 20:18:34 +0800 -Subject: [PATCH 04/21] code format specification - ---- - src/lstack/core/lstack_dpdk.c | 2 +- - src/ltran/ltran_monitor.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 366655c..340ae94 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -446,7 +446,7 @@ int32_t dpdk_ethdev_init(void) - rss_setup(port_id, nb_queues); - } - -- return ERR_OK; -+ return 0; - } - - static int32_t dpdk_ethdev_setup(const struct eth_params *eth_params, const struct protocol_stack *stack) -diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c -index 7da65ea..d535726 100644 ---- a/src/ltran/ltran_monitor.c -+++ b/src/ltran/ltran_monitor.c -@@ -414,7 +414,7 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data) - timeout.tv_sec = 60; /* 60: timeout 60S */ - ret = setsockopt(conn_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - if (ret != 0) { -- LTRAN_ERR("setsockopt ERROR, errno: %d. ret=%d.\n", errno, ret); -+ LTRAN_WARN("setsockopt ERROR, errno: %d. ret=%d.\n", errno, ret); - } - - struct epoll_event event = {0}; --- -2.23.0 - diff --git a/0090-fix-gazelle-kernel-event-thread-affinity-same-with-s.patch b/0090-fix-gazelle-kernel-event-thread-affinity-same-with-s.patch deleted file mode 100644 index 2d275ed..0000000 --- a/0090-fix-gazelle-kernel-event-thread-affinity-same-with-s.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 7a5a641ad5d56df224fd352b0a8366814bb819d2 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 13 Sep 2022 19:32:14 +0800 -Subject: [PATCH 06/21] fix gazelle kernel event thread affinity same with - stack thread - ---- - src/lstack/core/lstack_protocol_stack.c | 10 +++------- - 1 file changed, 3 insertions(+), 7 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 3009286..1dc6c3f 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -270,11 +270,7 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - - stack_group->stacks[queue_id] = stack; - -- cpu_set_t cpuset; -- CPU_ZERO(&cpuset); -- CPU_SET(stack->cpu_id, &cpuset); -- if (rte_thread_set_affinity(&cpuset) != 0) { -- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n"); -+ if (thread_affinity_init(stack->cpu_id) != 0) { - return -1; - } - RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -@@ -301,6 +297,8 @@ static void* gazelle_kernel_event(void *arg) - uint16_t queue_id = *(uint16_t *)arg; - struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - -+ bind_to_stack_numa(stack); -+ - int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); - if (epoll_fd < 0) { - LSTACK_LOG(ERR, LSTACK, "queue_id=%hu epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -@@ -383,8 +381,6 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - return NULL; - } - -- thread_affinity_init(stack->cpu_id); -- - hugepage_init(); - - tcpip_init(NULL, NULL); --- -2.23.0 - diff --git a/0091-have_corelist_arg.patch b/0091-have_corelist_arg.patch deleted file mode 100644 index c26c85f..0000000 --- a/0091-have_corelist_arg.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 37f9a2c0f60cb2757a0f1f64ad140ccbdc120501 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Wed, 21 Sep 2022 07:57:35 +0000 -Subject: [PATCH 07/21] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20have=5Fcorelist=5Far?= - =?UTF-8?q?g?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - src/lstack/core/lstack_cfg.c | 42 ++++++++++++++++++++++++++++++------ - 1 file changed, 35 insertions(+), 7 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 5cd326b..b6a517b 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -208,6 +208,33 @@ static int32_t get_param_idx(int32_t argc, char **argv, const char *param) - return -1; - } - -+static bool have_corelist_arg(int32_t argc, char **argv) -+{ -+ for (uint32_t i = 0; i < argc; i++) { -+ if (strncmp(argv[i], OPT_BIND_CORELIST, strlen(OPT_BIND_CORELIST)) == 0) { -+ return true; -+ } -+ -+ if (strncmp(argv[i], "--lcores", strlen("--lcores")) == 0) { -+ return true; -+ } -+ -+ if (strncmp(argv[i], "-c", strlen("-c")) == 0) { -+ return true; -+ } -+ -+ if (strncmp(argv[i], "-s", strlen("-s")) == 0) { -+ return true; -+ } -+ -+ if (strncmp(argv[i], "-S", strlen("-S")) == 0) { -+ return true; -+ } -+ } -+ -+ return false; -+} -+ - static int32_t parse_stack_cpu_number(void) - { - const config_setting_t *num_cpus = NULL; -@@ -222,14 +249,15 @@ static int32_t parse_stack_cpu_number(void) - if (args == NULL) { - return -EINVAL; - } -+ if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) { -+ int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); -+ if (idx < 0) { -+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); -+ g_config_params.dpdk_argc++; - -- int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); -- if (idx < 0) { -- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST); -- g_config_params.dpdk_argc++; -- -- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args); -- g_config_params.dpdk_argc++; -+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args); -+ g_config_params.dpdk_argc++; -+ } - } - - char *tmp_arg = strdup(args); --- -2.23.0 - diff --git a/0092-ltran-update-list.patch b/0092-ltran-update-list.patch deleted file mode 100644 index 8e8058e..0000000 --- a/0092-ltran-update-list.patch +++ /dev/null @@ -1,48 +0,0 @@ -From d609d7a16c0ab0e0215e7c84909bc19b8216727f Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Wed, 21 Sep 2022 12:06:21 +0000 -Subject: [PATCH 08/21] ltran update list - ---- - src/ltran/ltran_forward.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index 1a92348..9ca04aa 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -432,18 +432,25 @@ static __rte_always_inline void tcp_hash_table_add_conn(struct gazelle_stack *st - struct gazelle_quintuple *transfer_qtuple, uint32_t tid) - { - struct gazelle_tcp_conn *tcp_conn = NULL; -+ struct gazelle_tcp_conn_htable *conn_htable = gazelle_get_tcp_conn_htable(); - -- /* When lstack is the server, conn is created in tcp_handle func. lwip send the connect command after -- receiving syn, and delete conn timeout. */ -- tcp_conn = gazelle_conn_get_by_quintuple(gazelle_get_tcp_conn_htable(), transfer_qtuple); -+ tcp_conn = gazelle_conn_get_by_quintuple(conn_htable, transfer_qtuple); - if (tcp_conn) { -- tcp_conn->conn_timeout = -1; -- return; -+ /* When lstack is the server, conn is created in tcp_handle func. lwip send the connect command after -+ * receiving syn, and delete conn timeout. */ -+ if (tcp_conn->conn_timeout >= 0) { -+ tcp_conn->conn_timeout = -1; -+ return; -+ } else { -+ /* del old invaild conn */ -+ gazelle_conn_del_by_quintuple(conn_htable, transfer_qtuple); -+ printf("del old conn port=%d\n", ntohs(transfer_qtuple->dst_port)); -+ } - } - - /* When lstack is the client, lwip send the connect command while calling connect func. conn is created - without a timeout */ -- tcp_conn = gazelle_conn_add_by_quintuple(gazelle_get_tcp_conn_htable(), transfer_qtuple); -+ tcp_conn = gazelle_conn_add_by_quintuple(conn_htable, transfer_qtuple); - if (tcp_conn == NULL) { - LTRAN_ERR("add tcp conn htable failed\n"); - return; --- -2.23.0 - diff --git a/0093-remove-get_reg_ring_free_count.patch b/0093-remove-get_reg_ring_free_count.patch deleted file mode 100644 index 7ab8c38..0000000 --- a/0093-remove-get_reg_ring_free_count.patch +++ /dev/null @@ -1,37 +0,0 @@ -From b2cb29c59dcfbeb2652d57e5f6484c5e1239dd94 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Wed, 21 Sep 2022 11:56:18 +0000 -Subject: [PATCH 09/21] remove get_reg_ring_free_count - ---- - src/lstack/netif/lstack_vdev.c | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 31c1843..f9fa5a3 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -99,11 +99,6 @@ static uint32_t vdev_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkt - return sent_pkts; - } - --static inline uint32_t get_reg_ring_free_count(const struct rte_ring *reg_ring) --{ -- return (reg_ring->capacity + reg_ring->cons.tail - reg_ring->cons.head); --} -- - int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - { - if (!use_ltran()) { -@@ -132,7 +127,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - do { - (void)gazelle_ring_sc_dequeue(stack->reg_ring, free_buf, VDEV_REG_QUEUE_SZ); - -- if (get_reg_ring_free_count(stack->reg_ring) == 0) { -+ if (gazelle_ring_free_count(stack->reg_ring) == 0) { - continue; - } - --- -2.23.0 - diff --git a/0094-add-errorno-EISCONN.patch b/0094-add-errorno-EISCONN.patch deleted file mode 100644 index c8a3c88..0000000 --- a/0094-add-errorno-EISCONN.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 39cbe5776adb427d0e7d9a9bec58302a08202145 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Wed, 21 Sep 2022 14:31:15 +0000 -Subject: [PATCH 10/21] add errorno EISCONN - ---- - src/lstack/api/lstack_wrap.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index e402ce1..296906e 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -185,7 +185,7 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name - } - - int32_t ret = rpc_call_connect(s, name, namelen); -- if (ret == 0) { -+ if (ret == 0 || errno == EISCONN) { - return ret; - } - --- -2.23.0 - diff --git a/0095-fix-sendmsg-data-write-wrong.patch b/0095-fix-sendmsg-data-write-wrong.patch deleted file mode 100644 index 2f6ad44..0000000 --- a/0095-fix-sendmsg-data-write-wrong.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 241c72599d7da72ada7cc15da90b7309e74241ea Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 24 Sep 2022 21:48:12 +0800 -Subject: [PATCH 11/21] fix sendmsg data write wrong - ---- - src/lstack/core/lstack_lwip.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 5174e4c..d1e09ce 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -526,7 +526,12 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - if (ret < 0) { - return buflen == 0 ? ret : buflen; - } -+ - buflen += ret; -+ -+ if (ret < message->msg_iov[i].iov_len) { -+ return buflen; -+ } - } - - return buflen; --- -2.23.0 - diff --git a/0096-lstack-restore-pci-bus-after-init.patch b/0096-lstack-restore-pci-bus-after-init.patch deleted file mode 100644 index cb3365b..0000000 --- a/0096-lstack-restore-pci-bus-after-init.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 4d12b47a714217615a04f2a084b9c4857167e258 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 6 Oct 2022 15:14:21 +0800 -Subject: [PATCH 12/21] lstack restore pci bus after init - ---- - src/lstack/core/lstack_dpdk.c | 14 +++++++++++--- - src/lstack/core/lstack_init.c | 1 + - src/lstack/include/lstack_dpdk.h | 1 + - 3 files changed, 13 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 340ae94..10207d1 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -53,6 +53,7 @@ struct eth_params { - struct rte_eth_txconf tx_conf; - }; - struct rte_kni; -+static rte_bus *g_pci_bus = NULL; - - int32_t thread_affinity_default(void) - { -@@ -536,9 +537,16 @@ int32_t dpdk_init_lstack_kni(void) - void dpdk_skip_nic_init(void) - { - /* when lstack init nic again, ltran can't read pkts from nic. unregister pci_bus to avoid init nic in lstack */ -- struct rte_bus *pci_bus = rte_bus_find_by_name("pci"); -- if (pci_bus != NULL) { -- rte_bus_unregister(pci_bus); -+ g_pci_bus = rte_bus_find_by_name("pci"); -+ if (g_pci_bus != NULL) { -+ rte_bus_unregister(g_pci_bus); -+ } -+} -+ -+void dpdk_restore_pci(void) -+{ -+ if (g_pci_bus != NULL) { -+ rte_bus_register(g_pci_bus); - } - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 9fafda9..b1c69e6 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -251,6 +251,7 @@ __attribute__((constructor)) void gazelle_network_init(void) - /* - * Init control plane and dpdk init */ - create_control_thread(); -+ dpdk_restore_pci(); - - /* - * cancel the core binding from DPDK initialization */ -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index f0bf4a1..e224f23 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -50,5 +50,6 @@ int dpdk_ethdev_init(void); - int dpdk_ethdev_start(void); - void dpdk_skip_nic_init(void); - int32_t dpdk_init_lstack_kni(void); -+void dpdk_restore_pci(void); - - #endif /* GAZELLE_DPDK_H */ --- -2.23.0 - diff --git a/0097-fix-malloc-rpc-msg-fail.patch b/0097-fix-malloc-rpc-msg-fail.patch deleted file mode 100644 index 5c4493e..0000000 --- a/0097-fix-malloc-rpc-msg-fail.patch +++ /dev/null @@ -1,133 +0,0 @@ -From d168ee1528444bbdf3e1fd8f6a566295531177a8 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 6 Oct 2022 15:35:02 +0800 -Subject: [PATCH 13/21] fix malloc rpc msg fail - ---- - src/lstack/core/lstack_dpdk.c | 2 +- - src/lstack/core/lstack_lwip.c | 17 ++++++++++++++++- - src/lstack/core/lstack_thread_rpc.c | 6 ++++-- - src/lstack/include/lstack_thread_rpc.h | 2 +- - 4 files changed, 22 insertions(+), 5 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 10207d1..8d45838 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -53,7 +53,7 @@ struct eth_params { - struct rte_eth_txconf tx_conf; - }; - struct rte_kni; --static rte_bus *g_pci_bus = NULL; -+static struct rte_bus *g_pci_bus = NULL; - - int32_t thread_affinity_default(void) - { -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d1e09ce..6f08a1c 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -77,6 +77,7 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->listen_next = NULL; - sock->epoll_events = 0; - sock->events = 0; -+ sock->in_send = 0; - - if (sock->recv_lastdata) { - pbuf_free(sock->recv_lastdata); -@@ -328,6 +329,9 @@ void stack_send(struct rpc_msg *msg) - return; - } - -+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -+ rte_mb(); -+ - if (!NETCONN_IS_DATAOUT(sock)) { - return; - } -@@ -338,6 +342,7 @@ void stack_send(struct rpc_msg *msg) - if (NETCONN_IS_DATAOUT(sock)) { - if (list_is_null(&sock->send_list)) { - list_add_node(&stack->send_list, &sock->send_list); -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - } - stack->stats.send_self_rpc++; - } -@@ -352,6 +357,9 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - list_for_each_safe(node, temp, &stack->send_list) { - sock = container_of(node, struct lwip_sock, send_list); - -+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -+ rte_mb(); -+ - if (sock->conn == NULL || !NETCONN_IS_DATAOUT(sock)) { - list_del_node_null(&sock->send_list); - continue; -@@ -361,6 +369,8 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - - if (!NETCONN_IS_DATAOUT(sock)) { - list_del_node_null(&sock->send_list); -+ } else { -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - } - - if (++read_num >= send_max) { -@@ -507,7 +517,12 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - return 0; - } - -- rpc_call_send(fd, NULL, send, flags); -+ if (__atomic_load_n(&sock->in_send, __ATOMIC_ACQUIRE) == 0) { -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -+ if (rpc_call_send(fd, NULL, send, flags) != 0) { -+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -+ } -+ } - return send; - } - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index c9fc4e9..d1f7580 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -427,13 +427,13 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - return rpc_sync_call(&stack->rpc_queue, msg); - } - --void rpc_call_send(int fd, const void *buf, size_t len, int flags) -+int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); - - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send); - if (msg == NULL) { -- return; -+ return -1; - } - - msg->args[MSG_ARG_0].i = fd; -@@ -442,6 +442,8 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags) - msg->self_release = 0; - - rpc_call(&stack->rpc_queue, msg); -+ -+ return 0; - } - - int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 3732167..e1223de 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -66,7 +66,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen - int32_t rpc_call_listen(int s, int backlog); - int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen); --void rpc_call_send(int fd, const void *buf, size_t len, int flags); -+int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags); - int32_t rpc_call_sendmsg(int fd, const struct msghdr *msg, int flags); - int32_t rpc_call_recvmsg(int fd, struct msghdr *msg, int flags); - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen); --- -2.23.0 - diff --git a/0098-support-dpdk-dynamic-memory.patch b/0098-support-dpdk-dynamic-memory.patch deleted file mode 100644 index 3d5c8ff..0000000 --- a/0098-support-dpdk-dynamic-memory.patch +++ /dev/null @@ -1,64 +0,0 @@ -From cc9db5e298dab1c1bac927464538ba51da07d9c6 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 10:55:05 +0800 -Subject: [PATCH 14/21] support dpdk dynamic memory - ---- - src/lstack/core/lstack_cfg.c | 20 +++++++++++--------- - 1 file changed, 11 insertions(+), 9 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index b6a517b..19a5b30 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -192,7 +192,6 @@ static int32_t parse_devices(void) - - static int32_t get_param_idx(int32_t argc, char **argv, const char *param) - { -- int32_t ret; - int32_t idx; - - if ((argc <= 0) || (argv == NULL) || (param == NULL)) { -@@ -200,8 +199,7 @@ static int32_t get_param_idx(int32_t argc, char **argv, const char *param) - } - - for (idx = 0; idx < argc; ++idx) { -- ret = strncmp(argv[idx], param, strlen(param)); -- if (ret == 0) { -+ if (strncmp(argv[idx], param, strlen(param)) == 0) { - return idx; - } - } -@@ -249,6 +247,7 @@ static int32_t parse_stack_cpu_number(void) - if (args == NULL) { - return -EINVAL; - } -+ - if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) { - int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST); - if (idx < 0) { -@@ -465,12 +464,15 @@ static int32_t turn_args_to_config(int32_t argc, char **argv) - // OPT_SOCKET_MEM - idx = get_param_idx(argc, argv, OPT_SOCKET_MEM); - if ((idx < 0) || (idx + 1 >= argc)) { -- LSTACK_LOG(ERR, LSTACK, "Cannot find param %s\n", OPT_SOCKET_MEM); -- return idx; -- } -- ret = gazelle_parse_socket_mem(argv[idx + 1], &g_config_params.sec_attach_arg); -- if (ret < 0) { -- return ret; -+ if (use_ltran()) { -+ LSTACK_LOG(ERR, LSTACK, "Cannot find param %s\n", OPT_SOCKET_MEM); -+ return idx; -+ } -+ } else { -+ ret = gazelle_parse_socket_mem(argv[idx + 1], &g_config_params.sec_attach_arg); -+ if (ret < 0) { -+ return ret; -+ } - } - - // OPT_BASE_VIRTADDR --- -2.23.0 - diff --git a/0099-fix-lwip_send-fail-free-pbuf-miss-data.patch b/0099-fix-lwip_send-fail-free-pbuf-miss-data.patch deleted file mode 100644 index 0bfccd2..0000000 --- a/0099-fix-lwip_send-fail-free-pbuf-miss-data.patch +++ /dev/null @@ -1,87 +0,0 @@ -From b3ccf93dec7581adfcfaf99c6ea8b8478da263b1 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 11:10:24 +0800 -Subject: [PATCH 15/21] fix lwip_send fail free pbuf miss data - ---- - src/common/dpdk_common.h | 25 +++++++++++++++++++++++++ - src/lstack/core/lstack_lwip.c | 7 ++++++- - src/lstack/include/lstack_lwip.h | 1 + - 3 files changed, 32 insertions(+), 1 deletion(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 1c3e7e8..c2cbda7 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -177,6 +177,31 @@ static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, - return n; - } - -+/* get ring obj dont dequeue */ -+static __rte_always_inline uint32_t gazelle_ring_sc_peek(struct rte_ring *r, void **obj_table, uint32_t n) -+{ -+ uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); -+ uint32_t cons = r->cons.tail; -+ -+ uint32_t entries = prod - cons; -+ if (n > entries) { -+ n = entries; -+ } -+ if (unlikely(n == 0)) { -+ return 0; -+ } -+ -+ -+ __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); -+ -+ return n; -+} -+ -+static __rte_always_inline void gazelle_ring_dequeue_over(struct rte_ring *r, uint32_t n) -+{ -+ r->cons.tail += n; -+} -+ - static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void **obj_table, uint32_t n) - { - uint32_t cons = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 6f08a1c..3f21a3a 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -229,7 +229,7 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - { - struct pbuf *pbuf = NULL; - -- if (gazelle_ring_sc_dequeue(sock->send_ring, (void **)&pbuf, 1) != 1) { -+ if (gazelle_ring_sc_peek(sock->send_ring, (void **)&pbuf, 1) != 1) { - *apiflags &= ~TCP_WRITE_FLAG_MORE; - return NULL; - } -@@ -238,6 +238,11 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - return pbuf; - } - -+void write_lwip_over(struct lwip_sock *sock, uint32_t n) -+{ -+ gazelle_ring_dequeue_over(sock->send_ring, n); -+} -+ - static inline void del_data_out_event(struct lwip_sock *sock) - { - pthread_spin_lock(&sock->wakeup->event_list_lock); -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index c62e99d..968eff2 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -27,6 +27,7 @@ void gazelle_init_sock(int32_t fd); - int32_t gazelle_socket(int domain, int type, int protocol); - void gazelle_clean_sock(int32_t fd); - struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags); -+void write_lwip_over(struct lwip_sock *sock, uint32_t n); - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len); - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, uint8_t apiflags); --- -2.23.0 - diff --git a/0100-merger-wakeup.patch b/0100-merger-wakeup.patch deleted file mode 100644 index 6aa2848..0000000 --- a/0100-merger-wakeup.patch +++ /dev/null @@ -1,984 +0,0 @@ -From 045c0ea6fa5a2251a4a205bc9a732e694ddbb5a7 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 16:51:11 +0800 -Subject: [PATCH 16/21] merger wakeup - ---- - src/lstack/api/lstack_epoll.c | 366 +++++++++------------ - src/lstack/core/lstack_lwip.c | 29 +- - src/lstack/core/lstack_protocol_stack.c | 92 ++---- - src/lstack/core/lstack_stack_stat.c | 34 +- - src/lstack/include/lstack_protocol_stack.h | 4 +- - src/lstack/include/lstack_stack_stat.h | 5 +- - src/lstack/include/posix/lstack_epoll.h | 19 +- - 7 files changed, 232 insertions(+), 317 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 9c44f87..cc1cbf0 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -40,33 +40,35 @@ - #define SEC_TO_NSEC 1000000000 - #define SEC_TO_MSEC 1000 - #define MSEC_TO_NSEC 1000000 --#define POLL_KERNEL_EVENTS 32 -+#define POLL_KERNEL_EVENTS 128 - --void add_epoll_event(struct netconn *conn, uint32_t event) -+void add_sock_event(struct lwip_sock *sock, uint32_t event) - { -- /* conn sock nerver null, because lwip call this func */ -- struct lwip_sock *sock = get_socket_by_fd(conn->socket); -- if (sock->wakeup == NULL || (event & sock->epoll_events) == 0) { -+ struct wakeup_poll *wakeup = sock->wakeup; -+ if (wakeup == NULL || (event & sock->epoll_events) == 0) { - return; - } -- struct wakeup_poll *wakeup = sock->wakeup; -- struct protocol_stack *stack = sock->stack; - -- if (wakeup->type == WAKEUP_EPOLL) { -- pthread_spin_lock(&wakeup->event_list_lock); -- sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); -- if (list_is_null(&sock->event_list)) { -- list_add_node(&wakeup->event_list, &sock->event_list); -- } -- pthread_spin_unlock(&wakeup->event_list_lock); -+ wakeup->have_event = true; -+ -+ if (wakeup->type == WAKEUP_POLL) { -+ return; - } - -- stack->stats.wakeup_events++; -- sem_t *sem = &wakeup->event_sem; -- if (get_protocol_stack_group()->wakeup_enable) { -- gazelle_light_ring_enqueue_busrt(stack->wakeup_ring, (void **)&sem, 1); -- } else { -- sem_post(sem); -+ pthread_spin_lock(&wakeup->event_list_lock); -+ sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); -+ if (list_is_null(&sock->event_list)) { -+ list_add_node(&wakeup->event_list, &sock->event_list); -+ } -+ pthread_spin_unlock(&wakeup->event_list_lock); -+} -+ -+void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup) -+{ -+ if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) { -+ uint64_t tmp = 1; -+ posix_api->write_fn(wakeup->eventfd, &tmp, sizeof(tmp)); -+ stack->stats.wakeup_events++; - } - } - -@@ -98,11 +100,7 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s - { - sock->events = update_events(sock); - if (sock->events) { -- pthread_spin_lock(&wakeup->event_list_lock); -- if (list_is_null(&sock->event_list)) { -- list_add_node(&wakeup->event_list, &sock->event_list); -- } -- pthread_spin_unlock(&wakeup->event_list_lock); -+ add_sock_event(sock, sock->events); - } - } - -@@ -120,28 +118,38 @@ int32_t lstack_epoll_create(int32_t size) - GAZELLE_RETURN(EINVAL); - } - -- struct wakeup_poll *wakeup = malloc(sizeof(struct wakeup_poll)); -+ struct wakeup_poll *wakeup = calloc(1, sizeof(struct wakeup_poll)); - if (wakeup == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc null\n"); - posix_api->close_fn(fd); - GAZELLE_RETURN(EINVAL); - } -- if (memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)) != 0) { -- LSTACK_LOG(ERR, LSTACK, "memset_s failed\n"); -+ -+ wakeup->eventfd = eventfd(0, EFD_NONBLOCK); -+ if (wakeup->eventfd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "eventfd fail=%d errno=%d\n", wakeup->eventfd, errno); -+ posix_api->close_fn(fd); - free(wakeup); -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ struct epoll_event event; -+ event.data.fd = wakeup->eventfd; -+ event.events = EPOLLIN | EPOLLET; -+ if (posix_api->epoll_ctl_fn(fd, EPOLL_CTL_ADD, wakeup->eventfd, &event) < 0) { -+ LSTACK_LOG(ERR, LSTACK, "eventfd errno=%d\n", errno); - posix_api->close_fn(fd); -+ free(wakeup); - GAZELLE_RETURN(EINVAL); - } - - init_list_node(&wakeup->event_list); -- sem_init(&wakeup->event_sem, 0, 0); - pthread_spin_init(&wakeup->event_list_lock, PTHREAD_PROCESS_PRIVATE); - - wakeup->type = WAKEUP_EPOLL; - wakeup->epollfd = fd; - sock->wakeup = wakeup; - -- register_wakeup(wakeup); -- - return fd; - } - -@@ -156,8 +164,10 @@ int32_t lstack_epoll_close(int32_t fd) - } - - if (sock->wakeup) { -- unregister_wakeup(sock->wakeup); -- sem_destroy(&sock->wakeup->event_sem); -+ if (sock->stack) { -+ unregister_wakeup(sock->stack, sock->wakeup); -+ } -+ posix_api->close_fn(sock->wakeup->eventfd); - pthread_spin_destroy(&sock->wakeup->event_list_lock); - free(sock->wakeup); - } -@@ -217,19 +227,22 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - -+ -+ struct wakeup_poll *wakeup = epoll_sock->wakeup; - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -+ wakeup->have_kernel_fd = true; - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - - if (CONN_TYPE_HAS_HOST(sock->conn)) { -+ wakeup->have_kernel_fd = true; - int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d\n", fd, epfd, op); - } - } - -- struct wakeup_poll *wakeup = epoll_sock->wakeup; - do { - switch (op) { - case EPOLL_CTL_ADD: -@@ -258,34 +271,10 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - return 0; - } - --static void del_node_array(struct epoll_event *events, int32_t event_num, int32_t del_index) --{ -- for (int32_t i = del_index; i + 1 < event_num; i++) { -- events[i] = events[i + 1]; -- } --} -- --static int32_t del_duplicate_event(struct epoll_event *events, int32_t event_num) --{ -- int32_t num = event_num; -- -- for (int32_t i = 0; i < num; i++) { -- for (int32_t j = i + 1; j < num; j++) { -- if (events[i].data.u64 == events[j].data.u64) { -- del_node_array(events, num, j); -- num--; -- } -- } -- } -- -- return num; --} -- - static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents) - { - int32_t event_num = 0; - struct list_node *node, *temp; -- int32_t accept_num = 0; - - pthread_spin_lock(&wakeup->event_list_lock); - -@@ -297,10 +286,6 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - continue; - } - -- if (sock->conn && sock->conn->acceptmbox) { -- accept_num++; -- } -- - if (sock->epoll_events & EPOLLET) { - list_del_node_null(&sock->event_list); - } -@@ -323,10 +308,6 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - - pthread_spin_unlock(&wakeup->event_list_lock); - -- if (accept_num > 1) { -- event_num = del_duplicate_event(events, event_num); -- } -- - wakeup->stat.app_events += event_num; - return event_num; - } -@@ -354,33 +335,6 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - return event_num; - } - --static void ms_to_timespec(struct timespec *timespec, int32_t timeout) --{ -- clock_gettime(CLOCK_REALTIME, timespec); -- timespec->tv_sec += timeout / SEC_TO_MSEC; -- timespec->tv_nsec += (timeout % SEC_TO_MSEC) * MSEC_TO_NSEC; -- timespec->tv_sec += timespec->tv_nsec / SEC_TO_NSEC; -- timespec->tv_nsec = timespec->tv_nsec % SEC_TO_NSEC; --} -- --static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack, -- struct protocol_stack *new_stack) --{ -- if (old_stack) { -- if (posix_api->epoll_ctl_fn(old_stack->epollfd, EPOLL_CTL_DEL, wakeup->epollfd, NULL) != 0) { -- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -- } -- } -- -- /* avoid kernel thread post too much, use EPOLLET */ -- struct epoll_event event; -- event.data.ptr = wakeup; -- event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET; -- if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) { -- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -- } --} -- - static void epoll_bind_statck(struct wakeup_poll *wakeup) - { - /* all fd is kernel, set rand stack */ -@@ -390,11 +344,27 @@ static void epoll_bind_statck(struct wakeup_poll *wakeup) - - if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) { - bind_to_stack_numa(wakeup->max_stack); -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ if (wakeup->bind_stack) { -+ unregister_wakeup(wakeup->bind_stack, wakeup); -+ } - wakeup->bind_stack = wakeup->max_stack; -+ register_wakeup(wakeup->bind_stack, wakeup); - } - } - -+static bool del_event_fd(struct epoll_event* events, int32_t eventnum, int32_t eventfd) -+{ -+ for (int32_t i = 0; i < eventnum; i++) { -+ if (events[i].data.fd == eventfd) { -+ events[i].data.u64 = events[eventnum - 1].data.u64; -+ events[i].events = events[eventnum - 1].events; -+ return true; -+ } -+ } -+ -+ return false; -+} -+ - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { - struct lwip_sock *sock = get_socket_by_fd(epfd); -@@ -402,61 +372,66 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - -- int32_t event_num = 0; -- int32_t ret; -- -- struct timespec epoll_time; -- if (timeout >= 0) { -- ms_to_timespec(&epoll_time, timeout); -- } -+ struct wakeup_poll *wakeup = sock->wakeup; -+ int32_t kernel_num = 0; - - epoll_bind_statck(sock->wakeup); - -- do { -- event_num += epoll_lwip_event(sock->wakeup, &events[event_num], maxevents - event_num); -- sock->wakeup->stat.app_events += event_num; -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ rte_mb(); - -- if (__atomic_load_n(&sock->wakeup->have_kernel_event, __ATOMIC_RELAXED)) { -- event_num += posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0); -- } -+ int32_t lwip_num = epoll_lwip_event(wakeup, events, maxevents); -+ wakeup->stat.app_events += lwip_num; -+ if (!wakeup->have_kernel_fd && lwip_num > 0) { -+ return lwip_num; -+ } - -- if (event_num > 0) { -- while (sem_trywait(&sock->wakeup->event_sem) == 0); -- break; -- } -+ if (lwip_num > 0) { -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ rte_mb(); -+ kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0); -+ } else { -+ kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, timeout); -+ rte_mb(); -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ } -+ -+ if (kernel_num <= 0) { -+ return (lwip_num > 0) ? lwip_num : kernel_num; -+ } - -- sock->wakeup->have_kernel_event = false; -- if (timeout < 0) { -- ret = sem_wait(&sock->wakeup->event_sem); -- } else { -- ret = sem_timedwait(&sock->wakeup->event_sem, &epoll_time); -+ if (del_event_fd(&events[lwip_num], kernel_num, wakeup->eventfd)) { -+ if (lwip_num == 0) { -+ lwip_num = epoll_lwip_event(wakeup, events, maxevents); - } -- } while (ret == 0); -+ kernel_num--; -+ } - -- return event_num; -+ return lwip_num + kernel_num; - } - --static void init_poll_wakeup_data(struct wakeup_poll *wakeup) -+static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - { -- sem_init(&wakeup->event_sem, 0, 0); - wakeup->type = WAKEUP_POLL; - -- wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd)); -- if (wakeup->last_fds == NULL) { -- LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -+ wakeup->eventfd = eventfd(0, EFD_NONBLOCK); -+ if (wakeup->eventfd < 0) { -+ LSTACK_LOG(ERR, LSTACK, "eventfd failed errno=%d\n", errno); -+ GAZELLE_RETURN(EINVAL); - } - -- wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event)); -- if (wakeup->events == NULL) { -+ wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd)); -+ if (wakeup->last_fds == NULL) { - LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -+ posix_api->close_fn(wakeup->eventfd); -+ GAZELLE_RETURN(EINVAL); - } - -+ wakeup->last_fds[0].fd = wakeup->eventfd; -+ wakeup->last_fds[0].events = POLLIN; - wakeup->last_max_nfds = POLL_KERNEL_EVENTS; - -- wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS); -- if (wakeup->epollfd < 0) { -- LSTACK_LOG(ERR, LSTACK, "epoll_create_fn errno=%d\n", errno); -- } -+ return 0; - } - - static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds) -@@ -464,23 +439,14 @@ static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds) - if (wakeup->last_fds) { - free(wakeup->last_fds); - } -- wakeup->last_fds = calloc(nfds, sizeof(struct pollfd)); -+ wakeup->last_fds = calloc(nfds + 1, sizeof(struct pollfd)); - if (wakeup->last_fds == NULL) { - LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - -- if (wakeup->events) { -- free(wakeup->events); -- } -- wakeup->events = calloc(nfds, sizeof(struct epoll_event)); -- if (wakeup->events == NULL) { -- LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -- } -- -+ wakeup->last_fds[0].fd = wakeup->eventfd; -+ wakeup->last_fds[0].events = POLLIN; - wakeup->last_max_nfds = nfds; -- if (memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd)) != 0) { -- LSTACK_LOG(ERR, LSTACK, "memset_s faile\n"); -- } - } - - static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) -@@ -492,35 +458,16 @@ static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) - return; - } - -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ if (wakeup->bind_stack) { -+ unregister_wakeup(wakeup->bind_stack, wakeup); -+ } - bind_to_stack_numa(stack_group->stacks[bind_id]); - wakeup->bind_stack = stack_group->stacks[bind_id]; --} -- --static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struct pollfd *new_fd) --{ -- posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_DEL, wakeup->last_fds[index].fd, NULL); -- -- if (new_fd == NULL) { -- return; -- } -- -- struct epoll_event event; -- event.data.u32 = index; -- event.events = new_fd->events; -- if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) { -- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -- } -+ register_wakeup(wakeup->bind_stack, wakeup); - } - - static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds) - { -- if (!wakeup->init) { -- wakeup->init = true; -- init_poll_wakeup_data(wakeup); -- register_wakeup(wakeup); -- } -- - int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; - int32_t poll_change = 0; - -@@ -529,31 +476,22 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - resize_kernel_poll(wakeup, nfds); - poll_change = 1; - } -- /* poll fds num less, del old fd */ -- for (uint32_t i = nfds; i < wakeup->last_nfds; i++) { -- update_kernel_poll(wakeup, i, NULL); -- poll_change = 1; -- } - - for (uint32_t i = 0; i < nfds; i++) { - int32_t fd = fds[i].fd; - fds[i].revents = 0; - struct lwip_sock *sock = get_socket_by_fd(fd); - -- if (fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) { -+ if (fd == wakeup->last_fds[i + 1].fd && fds[i].events == wakeup->last_fds[i + 1].events) { - /* fd close then socket may get same fd. */ - if (sock == NULL || sock->wakeup != NULL) { - continue; - } - } -- wakeup->last_fds[i].fd = fd; -- wakeup->last_fds[i].events = fds[i].events; -+ wakeup->last_fds[i + 1].fd = fd; -+ wakeup->last_fds[i + 1].events = fds[i].events; - poll_change = 1; - -- if (sock == NULL || sock->conn == NULL || CONN_TYPE_HAS_HOST(sock->conn)) { -- update_kernel_poll(wakeup, i, fds + i); -- } -- - while (sock && sock->conn) { - if (sock->epoll_events != (fds[i].events | POLLERR)) { - sock->epoll_events = fds[i].events | POLLERR; -@@ -571,51 +509,65 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - if (poll_change == 0) { - return; - } -- wakeup->last_nfds = nfds; -+ wakeup->last_nfds = nfds + 1; - - poll_bind_statck(wakeup, stack_count); - } - - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - { -- static PER_THREAD struct wakeup_poll wakeup_poll = {0}; -+ static PER_THREAD struct wakeup_poll *wakeup = NULL; -+ if (wakeup == NULL) { -+ wakeup = calloc(1, sizeof(struct wakeup_poll)); -+ if (wakeup == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } - -- poll_init(&wakeup_poll, fds, nfds); -+ if (init_poll_wakeup_data(wakeup) < 0) { -+ free(wakeup); -+ GAZELLE_RETURN(EINVAL); -+ } -+ } - -- int32_t event_num = 0; -- int32_t ret; -+ poll_init(wakeup, fds, nfds); -+ -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ rte_mb(); - -- struct timespec poll_time; -- if (timeout >= 0) { -- ms_to_timespec(&poll_time, timeout); -+ int32_t lwip_num = poll_lwip_event(fds, nfds); -+ wakeup->stat.app_events += lwip_num; -+ if (lwip_num >= nfds) { -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ return lwip_num; - } - -- /* when epfd > 0 is epoll type */ -- do { -- event_num += poll_lwip_event(fds, nfds); -- -- /* reduce syscall epoll_wait */ -- if (__atomic_load_n(&wakeup_poll.have_kernel_event, __ATOMIC_RELAXED)) { -- int32_t kernel_num = posix_api->epoll_wait_fn(wakeup_poll.epollfd, wakeup_poll.events, nfds, 0); -- for (int32_t i = 0; i < kernel_num; i++) { -- uint32_t index = wakeup_poll.events[i].data.u32; -- fds[index].revents = wakeup_poll.events[i].events; -- } -- event_num += kernel_num >= 0 ? kernel_num : 0; -- } -+ int32_t kernel_num = 0; -+ if (lwip_num > 0) { -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ rte_mb(); -+ kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, 0); -+ } else { -+ kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, timeout); -+ rte_mb(); -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ } - -- if (event_num > 0) { -- while (sem_trywait(&wakeup_poll.event_sem) == 0); -- break; -+ if (kernel_num <= 0) { -+ return (lwip_num > 0) ? lwip_num : kernel_num; -+ } -+ -+ for (nfds_t i = 0; i < nfds; i++) { -+ if (fds[i].revents == 0 && wakeup->last_fds[i + 1].revents != 0) { -+ fds[i].revents = wakeup->last_fds[i + 1].revents; - } -+ } - -- wakeup_poll.have_kernel_event = false; -- if (timeout < 0) { -- ret = sem_wait(&wakeup_poll.event_sem); -- } else { -- ret = sem_timedwait(&wakeup_poll.event_sem, &poll_time); -+ if (wakeup->last_fds[0].revents) { -+ if (lwip_num == 0) { -+ lwip_num = poll_lwip_event(fds, nfds); - } -- } while (ret == 0); -+ kernel_num--; -+ } - -- return event_num; -+ return kernel_num + lwip_num; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 3f21a3a..bb5a7e5 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -309,7 +309,7 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) - if (len == 0) { - /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ - sock->errevent = 1; -- add_epoll_event(sock->conn, EPOLLERR); -+ add_sock_event(sock, EPOLLERR); - } - - if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -@@ -317,7 +317,7 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) - } - - if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -- add_epoll_event(sock->conn, EPOLLOUT); -+ add_sock_event(sock, EPOLLOUT); - } - } - -@@ -678,9 +678,9 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - if (len == 0) { - /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ - sock->errevent = 1; -- add_epoll_event(sock->conn, EPOLLERR); -+ add_sock_event(sock, EPOLLERR); - } else if (len > 0) { -- add_epoll_event(sock->conn, EPOLLIN); -+ add_sock_event(sock, EPOLLIN); - } - - /* last_node:recv only once per sock. max_num avoid cost too much time this loop */ -@@ -690,6 +690,23 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - } - } - -+void gazelle_connected_callback(struct netconn *conn) -+{ -+ if (conn == NULL) { -+ return; -+ } -+ -+ int32_t fd = conn->socket; -+ struct lwip_sock *sock = get_socket_by_fd(fd); -+ if (sock == NULL || sock->conn == NULL) { -+ return; -+ } -+ -+ SET_CONN_TYPE_LIBOS(conn); -+ -+ add_sock_event(sock, EPOLLOUT); -+} -+ - static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const struct tcp_pcb *pcb) - { - struct netconn *netconn = (struct netconn *)pcb->callback_arg; -@@ -711,10 +728,6 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; - - conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring); -- -- if (sock->wakeup) { -- sem_getvalue(&sock->wakeup->event_sem, &conn->sem_cnt); -- } - } - } - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 1dc6c3f..6119975 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -262,6 +262,8 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; - stack->lwip_stats = &lwip_stats; - -+ pthread_spin_init(&stack->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -+ - init_list_node(&stack->recv_list); - init_list_node(&stack->send_list); - -@@ -292,70 +294,6 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - return 0; - } - --static void* gazelle_kernel_event(void *arg) --{ -- uint16_t queue_id = *(uint16_t *)arg; -- struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -- -- bind_to_stack_numa(stack); -- -- int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); -- if (epoll_fd < 0) { -- LSTACK_LOG(ERR, LSTACK, "queue_id=%hu epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno); -- /* exit in main thread, avoid create mempool and exit at the same time */ -- set_init_fail(); -- stack->epollfd = -1; -- return NULL; -- } -- -- stack->epollfd = epoll_fd; -- -- LSTACK_LOG(INFO, LSTACK, "kernel_event_%02hu start\n", queue_id); -- -- struct epoll_event events[KERNEL_EPOLL_MAX]; -- for (;;) { -- int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1); -- if (event_num <= 0) { -- continue; -- } -- -- for (int32_t i = 0; i < event_num; i++) { -- struct wakeup_poll *wakeup = events[i].data.ptr; -- if (wakeup) { -- __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE); -- sem_post(&wakeup->event_sem); -- } -- } -- } -- -- return NULL; --} -- --static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack) --{ -- int32_t ret; -- -- ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno); -- return ret; -- } -- -- /* wait gazelle_kernel_event finish use stack.avoid use stack after free when create gazelle_weakup_thread fail */ -- while (stack->epollfd == 0) { -- usleep(1); -- } -- -- if (stack_group->wakeup_enable) { -- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread); -- if (ret != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno); -- } -- } -- -- return ret; --} -- - void wait_sem_value(sem_t *sem, int32_t wait_value) - { - int32_t sem_val; -@@ -404,14 +342,29 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - return NULL; - } - -- if (create_companion_thread(stack_group, stack) != 0) { -- free(stack); -- return NULL; -+ if (stack_group->wakeup_enable) { -+ if (create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup errno=%d\n", errno); -+ free(stack); -+ return NULL; -+ } - } - - return stack; - } - -+static void wakeup_stack_wait(struct protocol_stack *stack) -+{ -+ struct wakeup_poll *node = stack->wakeup_list; -+ while (node) { -+ if (node->have_event) { -+ wakeup_epoll(stack, node); -+ node->have_event = false; -+ } -+ node = node->next; -+ } -+} -+ - static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -@@ -437,6 +390,8 @@ static void* gazelle_stack_thread(void *arg) - - send_stack_list(stack, SEND_LIST_MAX); - -+ wakeup_stack_wait(stack); -+ - sys_timer_run(); - - if (get_global_cfg_params()->low_power_mod != 0) { -@@ -452,8 +407,6 @@ static int32_t init_protocol_sem(void) - int32_t ret; - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- pthread_spin_init(&stack_group->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -- - if (!use_ltran()) { - ret = sem_init(&stack_group->ethdev_init, 0, 0); - if (ret < 0) { -@@ -484,7 +437,6 @@ int32_t init_protocol_stack(void) - - stack_group->stack_num = get_global_cfg_params()->num_cpu; - stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -- stack_group->wakeup_list = NULL; - - if (init_protocol_sem() != 0) { - return -1; -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index e8c5bc3..245bcd7 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -92,25 +92,21 @@ static void set_latency_start_flag(bool start) - } - } - --void register_wakeup(struct wakeup_poll *wakeup) -+void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup) - { -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- pthread_spin_lock(&stack_group->wakeup_list_lock); -+ pthread_spin_lock(&stack->wakeup_list_lock); - -- wakeup->next = stack_group->wakeup_list; -- stack_group->wakeup_list = wakeup; -+ wakeup->next = stack->wakeup_list; -+ stack->wakeup_list = wakeup; - -- pthread_spin_unlock(&stack_group->wakeup_list_lock); -+ pthread_spin_unlock(&stack->wakeup_list_lock); - } - --void unregister_wakeup(struct wakeup_poll *wakeup) -+void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup) - { -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ pthread_spin_lock(&stack->wakeup_list_lock); - -- pthread_spin_lock(&stack_group->wakeup_list_lock); -- -- struct wakeup_poll *node = stack_group->wakeup_list; -+ struct wakeup_poll *node = stack->wakeup_list; - struct wakeup_poll *pre = NULL; - - while (node && node != wakeup) { -@@ -119,26 +115,24 @@ void unregister_wakeup(struct wakeup_poll *wakeup) - } - - if (node == NULL) { -- pthread_spin_unlock(&stack_group->wakeup_list_lock); -+ pthread_spin_unlock(&stack->wakeup_list_lock); - return; - } - - if (pre) { - pre->next = node->next; - } else { -- stack_group->wakeup_list = node->next; -+ stack->wakeup_list = node->next; - } - -- pthread_spin_unlock(&stack_group->wakeup_list_lock); -+ pthread_spin_unlock(&stack->wakeup_list_lock); - } - - static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_stat *stat) - { -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); -- -- pthread_spin_lock(&stack_group->wakeup_list_lock); -+ pthread_spin_lock(&stack->wakeup_list_lock); - -- struct wakeup_poll *node = stack_group->wakeup_list; -+ struct wakeup_poll *node = stack->wakeup_list; - while (node) { - if (node->bind_stack == stack) { - stat->app_events += node->stat.app_events; -@@ -151,7 +145,7 @@ static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_ - node = node->next; - } - -- pthread_spin_unlock(&stack_group->wakeup_list_lock); -+ pthread_spin_unlock(&stack->wakeup_list_lock); - } - - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info) -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 36340ab..0a060b4 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -50,6 +50,8 @@ struct protocol_stack { - struct reg_ring_msg *reg_buf; - - volatile bool low_power; -+ struct wakeup_poll *wakeup_list; -+ pthread_spinlock_t wakeup_list_lock; - lockless_queue rpc_queue __rte_cache_aligned; - char pad __rte_cache_aligned; - -@@ -84,8 +86,6 @@ struct protocol_stack_group { - /* dfx stats */ - bool latency_start; - uint64_t call_alloc_fail; -- pthread_spinlock_t wakeup_list_lock; -- struct wakeup_poll *wakeup_list __rte_cache_aligned; - }; - - long get_stack_tid(void); -diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h -index aacade1..98ffe8f 100644 ---- a/src/lstack/include/lstack_stack_stat.h -+++ b/src/lstack/include/lstack_stack_stat.h -@@ -17,6 +17,7 @@ struct gazelle_stack_latency; - struct pbuf; - struct gazelle_stat_low_power_info; - struct wakeup_poll; -+struct protocol_stack; - enum GAZELLE_LATENCY_TYPE; - enum GAZELLE_STAT_MODE; - -@@ -26,7 +27,7 @@ void stack_stat_init(void); - int32_t handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode); - uint64_t get_current_time(void); - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info); --void register_wakeup(struct wakeup_poll *wakeup); --void unregister_wakeup(struct wakeup_poll *wakeup); -+void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup); -+void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup); - - #endif /* GAZELLE_STACK_STAT_H */ -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index a94b49f..5799028 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - - #include - -@@ -35,24 +36,24 @@ enum wakeup_type { - struct protocol_stack; - struct wakeup_poll { - /* stack thread read frequently */ -- sem_t event_sem __rte_cache_aligned; -- enum wakeup_type type __rte_cache_aligned; -- volatile bool have_kernel_event __rte_cache_aligned; -- struct gazelle_wakeup_stat stat __rte_cache_aligned; -+ int32_t eventfd; -+ enum wakeup_type type; -+ bool have_event; -+ volatile bool in_wait __rte_cache_aligned; - char pad __rte_cache_aligned; - -- bool init; -+ struct gazelle_wakeup_stat stat; - struct protocol_stack *bind_stack; -- int32_t epollfd; /* epoll kernel fd, ctl add into gazelle_kernel_event thread */ - struct wakeup_poll *next; - - /* poll */ - struct pollfd *last_fds; - nfds_t last_nfds; - nfds_t last_max_nfds; -- struct epoll_event *events; - - /* epoll */ -+ int32_t epollfd; /* epoll kernel fd */ -+ bool have_kernel_fd; - int32_t stack_fd_cnt[PROTOCOL_STACK_MAX]; - struct protocol_stack *max_stack; - struct list_node event_list; -@@ -60,7 +61,9 @@ struct wakeup_poll { - }; - - struct netconn; --void add_epoll_event(struct netconn *conn, uint32_t event); -+struct lwip_sock; -+void add_sock_event(struct lwip_sock *sock, uint32_t event); -+void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup); - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event *events, int32_t maxevents, int32_t timeout); --- -2.23.0 - diff --git a/0101-conenct-support-multi-queues.patch b/0101-conenct-support-multi-queues.patch deleted file mode 100644 index dd1469a..0000000 --- a/0101-conenct-support-multi-queues.patch +++ /dev/null @@ -1,113 +0,0 @@ -From e55108b4f3ef13556075da292d1dc17a3335fb04 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 17:57:40 +0800 -Subject: [PATCH 17/21] conenct support multi queues - ---- - src/lstack/core/lstack_dpdk.c | 38 ++++++++++++++++++++-- - src/lstack/include/lstack_dpdk.h | 1 + - src/lstack/include/lstack_protocol_stack.h | 2 ++ - 3 files changed, 39 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 8d45838..39f8ecf 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -55,6 +56,15 @@ struct eth_params { - struct rte_kni; - static struct rte_bus *g_pci_bus = NULL; - -+#define RSS_HASH_KEY_LEN 40 -+static uint8_t g_default_rss_key[] = { -+ 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, -+ 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0, -+ 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4, -+ 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c, -+ 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa, -+}; -+ - int32_t thread_affinity_default(void) - { - static cpu_set_t cpuset; -@@ -327,8 +337,8 @@ static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *de - int rss_enable = 0; - uint64_t def_rss_hf = ETH_RSS_TCP | ETH_RSS_IP; - struct rte_eth_rss_conf rss_conf = { -- NULL, -- 40, -+ g_default_rss_key, -+ RSS_HASH_KEY_LEN, - def_rss_hf, - }; - -@@ -445,7 +455,9 @@ int32_t dpdk_ethdev_init(void) - - if (rss_enable) { - rss_setup(port_id, nb_queues); -+ stack_group->reta_mask = dev_info.reta_size - 1; - } -+ stack_group->nb_queues = nb_queues; - - return 0; - } -@@ -571,3 +583,25 @@ int32_t init_dpdk_ethdev(void) - sem_post(&stack_group->ethdev_init); - return 0; - } -+ -+bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ if (stack_group->reta_mask == 0 || stack_group->nb_queues <= 1) { -+ return true; -+ } -+ -+ struct rte_ipv4_tuple tuple = {0}; -+ tuple.src_addr = rte_be_to_cpu_32(src_ip); -+ tuple.dst_addr = rte_be_to_cpu_32(dst_ip); -+ tuple.sport = src_port; -+ tuple.dport = dst_port; -+ -+ uint32_t hash = rte_softrss((uint32_t *)&tuple, RTE_THASH_V4_L4_LEN, g_default_rss_key); -+ -+ uint32_t reta_index = hash & stack_group->reta_mask; -+ -+ struct protocol_stack *stack = get_protocol_stack(); -+ return (reta_index % stack_group->nb_queues) == stack->queue_id; -+} -+ -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index e224f23..684d025 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -51,5 +51,6 @@ int dpdk_ethdev_start(void); - void dpdk_skip_nic_init(void); - int32_t dpdk_init_lstack_kni(void); - void dpdk_restore_pci(void); -+bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port); - - #endif /* GAZELLE_DPDK_H */ -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 0a060b4..a791357 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -78,6 +78,8 @@ struct protocol_stack_group { - sem_t all_init; - uint64_t rx_offload; - uint64_t tx_offload; -+ uint32_t reta_mask; -+ uint16_t nb_queues; - struct rte_mempool *kni_pktmbuf_pool; - struct eth_params *eth_params; - struct protocol_stack *stacks[PROTOCOL_STACK_MAX]; --- -2.23.0 - diff --git a/0102-merge-sendmsg-write.patch b/0102-merge-sendmsg-write.patch deleted file mode 100644 index 1abe335..0000000 --- a/0102-merge-sendmsg-write.patch +++ /dev/null @@ -1,275 +0,0 @@ -From b87de3f10de1839e8dccc64ba01b3d4b7bd114c3 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 19:50:42 +0800 -Subject: [PATCH 18/21] merge sendmsg write - ---- - src/lstack/core/lstack_lwip.c | 92 ++++++++++++++++------ - src/lstack/core/lstack_protocol_stack.c | 16 ---- - src/lstack/core/lstack_thread_rpc.c | 32 +------- - src/lstack/include/lstack_protocol_stack.h | 2 - - src/lstack/include/lstack_thread_rpc.h | 2 - - 5 files changed, 68 insertions(+), 76 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index bb5a7e5..f4128d7 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -259,6 +259,22 @@ static inline void del_data_out_event(struct lwip_sock *sock) - pthread_spin_unlock(&sock->wakeup->event_list_lock); - } - -+void write_stack_over(struct lwip_sock *sock) -+{ -+ if (sock->send_lastdata) { -+ sock->send_lastdata->tot_len = sock->send_lastdata->len = sock->send_datalen; -+ sock->send_lastdata = NULL; -+ } -+ -+ gazelle_ring_read_over(sock->send_ring); -+ -+ if (sock->wakeup) { -+ if (sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -+ del_data_out_event(sock); -+ } -+ } -+} -+ - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - { - if (sock->errevent > 0) { -@@ -272,31 +288,37 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - - struct pbuf *pbuf = NULL; - ssize_t send_len = 0; -- size_t copy_len; - uint32_t send_pkt = 0; - - while (send_len < len && send_pkt < free_count) { -- if (gazelle_ring_read(sock->send_ring, (void **)&pbuf, 1) != 1) { -- if (sock->wakeup) { -- sock->wakeup->stat.app_write_idlefail++; -+ if (sock->send_lastdata) { -+ pbuf = sock->send_lastdata; -+ } else { -+ if (gazelle_ring_read(sock->send_ring, (void **)&pbuf, 1) != 1) { -+ if (sock->wakeup) { -+ sock->wakeup->stat.app_write_idlefail++; -+ } -+ break; - } -- break; -+ sock->send_lastdata = pbuf; -+ sock->send_datalen = 0; - } - -- copy_len = (len - send_len > pbuf->len) ? pbuf->len : (len - send_len); -- pbuf_take(pbuf, (char *)buf + send_len, copy_len); -- pbuf->tot_len = pbuf->len = copy_len; -+ uint16_t remian_len = pbuf->len - sock->send_datalen; -+ uint16_t copy_len = (len - send_len > remian_len) ? remian_len : (len - send_len); -+ pbuf_take_at(pbuf, (char *)buf + send_len, copy_len, sock->send_datalen); -+ sock->send_datalen += copy_len; -+ if (sock->send_datalen >= pbuf->len) { -+ sock->send_lastdata = NULL; -+ pbuf->tot_len = pbuf->len = sock->send_datalen; -+ send_pkt++; -+ } - - send_len += copy_len; -- send_pkt++; - } -- gazelle_ring_read_over(sock->send_ring); - - if (sock->wakeup) { - sock->wakeup->stat.app_write_cnt += send_pkt; -- if (sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -- del_data_out_event(sock); -- } - } - - return send_len; -@@ -500,6 +522,16 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) - return buflen; - } - -+static inline void notice_stack_send(struct lwip_sock *sock, int32_t fd, int32_t len, int32_t flags) -+{ -+ if (__atomic_load_n(&sock->in_send, __ATOMIC_ACQUIRE) == 0) { -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -+ if (rpc_call_send(fd, NULL, len, flags) != 0) { -+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -+ } -+ } -+} -+ - ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - { - if (buf == NULL) { -@@ -516,18 +548,12 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - } - - ssize_t send = write_stack_data(sock, buf, len); -- if (send < 0) { -- GAZELLE_RETURN(EAGAIN); -- } else if (send == 0) { -- return 0; -+ if (send <= 0) { -+ return send; - } -+ write_stack_over(sock); - -- if (__atomic_load_n(&sock->in_send, __ATOMIC_ACQUIRE) == 0) { -- __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -- if (rpc_call_send(fd, NULL, send, flags) != 0) { -- __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -- } -- } -+ notice_stack_send(sock, fd, send, flags); - return send; - } - -@@ -537,23 +563,37 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - int32_t i; - ssize_t buflen = 0; - -+ struct lwip_sock *sock = get_socket(s); -+ if (sock == NULL) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ - if (check_msg_vaild(message)) { - GAZELLE_RETURN(EINVAL); - } - - for (i = 0; i < message->msg_iovlen; i++) { -- ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); -+ if (message->msg_iov[i].iov_len == 0) { -+ continue; -+ } -+ -+ ret = write_stack_data(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len); - if (ret < 0) { -- return buflen == 0 ? ret : buflen; -+ buflen = (buflen == 0) ? ret : buflen; -+ break; - } - - buflen += ret; - - if (ret < message->msg_iov[i].iov_len) { -- return buflen; -+ break; - } - } - -+ if (buflen > 0) { -+ write_stack_over(sock); -+ notice_stack_send(sock, s, buflen, flags); -+ } - return buflen; - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 6119975..fbeca62 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -608,22 +608,6 @@ void stack_recv(struct rpc_msg *msg) - msg->args[MSG_ARG_3].i); - } - --void stack_sendmsg(struct rpc_msg *msg) --{ -- msg->result = lwip_sendmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].i); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- --void stack_recvmsg(struct rpc_msg *msg) --{ -- msg->result = lwip_recvmsg(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].i); -- if (msg->result != 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); -- } --} -- - /* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */ - void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack) - { -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index d1f7580..ad967e9 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -236,7 +236,8 @@ int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - - msg->self_release = 0; - msg->args[MSG_ARG_0].p = mbuf; -- lockless_queue_mpsc_push(&stack->rpc_queue, &msg->queue_node); -+ -+ rpc_call(&stack->rpc_queue, msg); - - return 0; - } -@@ -446,32 +447,3 @@ int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - return 0; - } - --int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags) --{ -- struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendmsg); -- if (msg == NULL) { -- return -1; -- } -- -- msg->args[MSG_ARG_0].i = fd; -- msg->args[MSG_ARG_1].cp = msghdr; -- msg->args[MSG_ARG_2].i = flags; -- -- return rpc_sync_call(&stack->rpc_queue, msg); --} -- --int32_t rpc_call_recvmsg(int fd, struct msghdr *msghdr, int flags) --{ -- struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -- struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvmsg); -- if (msg == NULL) { -- return -1; -- } -- -- msg->args[MSG_ARG_0].i = fd; -- msg->args[MSG_ARG_1].p = msghdr; -- msg->args[MSG_ARG_2].i = flags; -- -- return rpc_sync_call(&stack->rpc_queue, msg); --} -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index a791357..f58ae56 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -124,8 +124,6 @@ void stack_listen(struct rpc_msg *msg); - void stack_accept(struct rpc_msg *msg); - void stack_connect(struct rpc_msg *msg); - void stack_recv(struct rpc_msg *msg); --void stack_sendmsg(struct rpc_msg *msg); --void stack_recvmsg(struct rpc_msg *msg); - void stack_getpeername(struct rpc_msg *msg); - void stack_getsockname(struct rpc_msg *msg); - void stack_getsockopt(struct rpc_msg *msg); -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index e1223de..175c8c9 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -67,8 +67,6 @@ int32_t rpc_call_listen(int s, int backlog); - int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags); --int32_t rpc_call_sendmsg(int fd, const struct msghdr *msg, int flags); --int32_t rpc_call_recvmsg(int fd, struct msghdr *msg, int flags); - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen); --- -2.23.0 - diff --git a/0103-add-thread-select-path.patch b/0103-add-thread-select-path.patch deleted file mode 100644 index 5a2660b..0000000 --- a/0103-add-thread-select-path.patch +++ /dev/null @@ -1,160 +0,0 @@ -From b61caf98b117313d1c2d59c1954d494901adcb73 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 20:39:48 +0800 -Subject: [PATCH 19/21] add thread select path - ---- - src/lstack/api/lstack_wrap.c | 14 ++++++--- - src/lstack/core/lstack_init.c | 54 +++++++++++++++++++++++++++++++++++ - 2 files changed, 64 insertions(+), 4 deletions(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 296906e..d88513b 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -42,9 +42,11 @@ enum KERNEL_LWIP_PATH { - PATH_UNKNOW, - }; - -+bool select_thread_path(void); -+ - static enum KERNEL_LWIP_PATH select_path(int fd) - { -- if (posix_api == NULL) { -+ if (unlikely(posix_api == NULL)) { - /* posix api maybe call before gazelle init */ - if (posix_api_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); -@@ -52,6 +54,10 @@ static enum KERNEL_LWIP_PATH select_path(int fd) - return PATH_KERNEL; - } - -+ if (!select_thread_path()) { -+ return PATH_KERNEL; -+ } -+ - if (unlikely(posix_api->ues_posix)) { - return PATH_KERNEL; - } -@@ -93,7 +99,7 @@ static inline int32_t do_epoll_create(int32_t size) - - static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event* event) - { -- if (unlikely(posix_api->ues_posix)) { -+ if (unlikely(posix_api->ues_posix) || !select_thread_path()) { - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - -@@ -102,7 +108,7 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct - - static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) - { -- if (unlikely(posix_api->ues_posix)) { -+ if (unlikely(posix_api->ues_posix) || !select_thread_path()) { - return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout); - } - -@@ -369,7 +375,7 @@ static int32_t do_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - GAZELLE_RETURN(EINVAL); - } - -- if (unlikely(posix_api->ues_posix) || nfds == 0) { -+ if (unlikely(posix_api->ues_posix) || nfds == 0 || !select_thread_path()) { - return posix_api->poll_fn(fds, nfds, timeout); - } - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index b1c69e6..f647b8e 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -48,8 +48,10 @@ - #define LSTACK_SO_NAME "liblstack.so" - #define LSTACK_PRELOAD_NAME_LEN PATH_MAX - #define LSTACK_PRELOAD_ENV_PROC "GAZELLE_BIND_PROCNAME" -+#define LSTACK_ENV_THREAD "GAZELLE_THREAD_NAME" - - static volatile bool g_init_fail = false; -+static PER_THREAD int32_t g_thread_path = -1; - - void set_init_fail(void) - { -@@ -64,14 +66,34 @@ bool get_init_fail(void) - struct lstack_preload { - int32_t preload_switch; - char env_procname[LSTACK_PRELOAD_NAME_LEN]; -+ bool get_thread_name; -+ char env_threadname[LSTACK_PRELOAD_NAME_LEN]; - }; - static struct lstack_preload g_preload_info = {0}; - -+static void get_select_thread_name(void) -+{ -+ g_preload_info.get_thread_name = true; -+ -+ char *enval = NULL; -+ enval = getenv(LSTACK_ENV_THREAD); -+ if (enval == NULL) { -+ return; -+ } -+ if (strcpy_s(g_preload_info.env_threadname, LSTACK_PRELOAD_NAME_LEN, enval) != EOK) { -+ return; -+ } -+ -+ LSTACK_PRE_LOG(LSTACK_INFO, "thread name=%s ok\n", g_preload_info.env_threadname); -+} -+ - static int32_t preload_info_init(void) - { - char *enval = NULL; - - g_preload_info.preload_switch = 0; -+ -+ get_select_thread_name(); - - enval = getenv(LSTACK_PRELOAD_ENV_SYS); - if (enval == NULL) { -@@ -91,9 +113,41 @@ static int32_t preload_info_init(void) - } - - g_preload_info.preload_switch = 1; -+ LSTACK_PRE_LOG(LSTACK_INFO, "LD_PRELOAD ok\n"); - return 0; - } - -+bool select_thread_path(void) -+{ -+ if (g_thread_path >= 0) { -+ return g_thread_path; -+ } -+ -+ if (!g_preload_info.get_thread_name) { -+ get_select_thread_name(); -+ } -+ -+ /* not set GAZELLE_THREAD_NAME, select all thread */ -+ if (g_preload_info.env_threadname[0] == '\0') { -+ g_thread_path = 1; -+ return true; -+ } -+ -+ char thread_name[PATH_MAX] = {0}; -+ if (pthread_getname_np(pthread_self(), thread_name, PATH_MAX) != 0) { -+ g_thread_path = 0; -+ return false; -+ } -+ -+ if (strstr(thread_name, g_preload_info.env_threadname) == NULL) { -+ g_thread_path = 0; -+ return false; -+ } -+ -+ g_thread_path = 1; -+ return true; -+} -+ - static int32_t check_process_conflict(void) - { - int32_t ret; --- -2.23.0 - diff --git a/0104-support-conf-control-app-bind-numa.patch b/0104-support-conf-control-app-bind-numa.patch deleted file mode 100644 index 8aab09b..0000000 --- a/0104-support-conf-control-app-bind-numa.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 8a148ade17e4c73cd768ad81b30096139898bbe7 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 21:03:58 +0800 -Subject: [PATCH 20/21] support conf control app bind numa - ---- - src/lstack/api/lstack_epoll.c | 9 +++++++-- - src/lstack/core/lstack_cfg.c | 20 +++++++++++++++++++- - src/lstack/include/lstack_cfg.h | 1 + - 3 files changed, 27 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index cc1cbf0..bd3396a 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -343,7 +343,9 @@ static void epoll_bind_statck(struct wakeup_poll *wakeup) - } - - if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) { -- bind_to_stack_numa(wakeup->max_stack); -+ if (get_global_cfg_params()->app_bind_numa) { -+ bind_to_stack_numa(wakeup->max_stack); -+ } - if (wakeup->bind_stack) { - unregister_wakeup(wakeup->bind_stack, wakeup); - } -@@ -461,7 +463,10 @@ static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) - if (wakeup->bind_stack) { - unregister_wakeup(wakeup->bind_stack, wakeup); - } -- bind_to_stack_numa(stack_group->stacks[bind_id]); -+ -+ if (get_global_cfg_params()->app_bind_numa) { -+ bind_to_stack_numa(stack_group->stacks[bind_id]); -+ } - wakeup->bind_stack = stack_group->stacks[bind_id]; - register_wakeup(wakeup->bind_stack, wakeup); - } -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 19a5b30..2cd9989 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -55,6 +55,7 @@ static int32_t parse_dpdk_args(void); - static int32_t parse_gateway_addr(void); - static int32_t parse_kni_switch(void); - static int32_t parse_listen_shadow(void); -+static int32_t parse_app_bind_numa(void); - - struct config_vector_t { - const char *name; -@@ -71,8 +72,9 @@ static struct config_vector_t g_config_tbl[] = { - { "num_cpus", parse_stack_cpu_number }, - { "num_wakeup", parse_wakeup_cpu_number }, - { "low_power_mode", parse_low_power_mode }, -- { "kni_switch", parse_kni_switch }, -+ { "kni_switch", parse_kni_switch }, - { "listen_shadow", parse_listen_shadow }, -+ { "app_bind_numa", parse_app_bind_numa }, - { NULL, NULL } - }; - -@@ -710,6 +712,22 @@ static int32_t parse_listen_shadow(void) - return 0; - } - -+static int32_t parse_app_bind_numa(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "app_bind_numa"); -+ if (arg == NULL) { -+ g_config_params.app_bind_numa = true; -+ return 0; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ g_config_params.app_bind_numa = (val == 0) ? false : true; -+ -+ return 0; -+} -+ - static int32_t parse_kni_switch(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 1a6ef39..80dfd24 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -76,6 +76,7 @@ struct cfg_params { - bool use_ltran; // ture:lstack read from nic false:read form ltran - bool kni_switch; - bool listen_shadow; // true:listen in all stack thread. false:listen in one stack thread. -+ bool app_bind_numa; - int dpdk_argc; - char **dpdk_argv; - struct secondary_attach_arg sec_attach_arg; --- -2.23.0 - diff --git a/0105-fix-epoll_wait-cover-kernel-event.patch b/0105-fix-epoll_wait-cover-kernel-event.patch deleted file mode 100644 index 9be5f4b..0000000 --- a/0105-fix-epoll_wait-cover-kernel-event.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 05fe4efd5ff233edcf39a3abc1c4ef048f8173b6 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 8 Oct 2022 21:50:19 +0800 -Subject: [PATCH 21/21] fix epoll_wait cover kernel event - ---- - src/lstack/api/lstack_epoll.c | 6 +++--- - src/lstack/core/lstack_lwip.c | 8 +++++--- - src/lstack/core/lstack_stack_stat.c | 12 +++++------- - src/ltran/ltran_forward.c | 13 ++++++------- - 4 files changed, 19 insertions(+), 20 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index bd3396a..6ac245c 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -137,7 +137,7 @@ int32_t lstack_epoll_create(int32_t size) - event.data.fd = wakeup->eventfd; - event.events = EPOLLIN | EPOLLET; - if (posix_api->epoll_ctl_fn(fd, EPOLL_CTL_ADD, wakeup->eventfd, &event) < 0) { -- LSTACK_LOG(ERR, LSTACK, "eventfd errno=%d\n", errno); -+ LSTACK_LOG(ERR, LSTACK, "ctl eventfd errno=%d\n", errno); - posix_api->close_fn(fd); - free(wakeup); - GAZELLE_RETURN(EINVAL); -@@ -403,10 +403,10 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - } - - if (del_event_fd(&events[lwip_num], kernel_num, wakeup->eventfd)) { -+ kernel_num--; - if (lwip_num == 0) { -- lwip_num = epoll_lwip_event(wakeup, events, maxevents); -+ lwip_num = epoll_lwip_event(wakeup, &events[kernel_num], maxevents - kernel_num); - } -- kernel_num--; - } - - return lwip_num + kernel_num; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index f4128d7..60e30d9 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -359,7 +359,7 @@ void stack_send(struct rpc_msg *msg) - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); - rte_mb(); - -- if (!NETCONN_IS_DATAOUT(sock)) { -+ if (!NETCONN_IS_DATAOUT(sock) || sock->errevent > 0) { - return; - } - -@@ -387,7 +387,7 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); - rte_mb(); - -- if (sock->conn == NULL || !NETCONN_IS_DATAOUT(sock)) { -+ if (sock->conn == NULL || sock->errevent > 0 || !NETCONN_IS_DATAOUT(sock)) { - list_del_node_null(&sock->send_list); - continue; - } -@@ -578,7 +578,7 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - } - - ret = write_stack_data(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len); -- if (ret < 0) { -+ if (ret <= 0) { - buflen = (buflen == 0) ? ret : buflen; - break; - } -@@ -742,6 +742,8 @@ void gazelle_connected_callback(struct netconn *conn) - return; - } - -+ posix_api->shutdown_fn(fd, SHUT_RDWR); -+ - SET_CONN_TYPE_LIBOS(conn); - - add_sock_event(sock, EPOLLOUT); -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 245bcd7..b32f082 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -134,13 +134,11 @@ static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_ - - struct wakeup_poll *node = stack->wakeup_list; - while (node) { -- if (node->bind_stack == stack) { -- stat->app_events += node->stat.app_events; -- stat->read_null += node->stat.read_null; -- stat->app_write_cnt += node->stat.app_write_cnt; -- stat->app_write_idlefail += node->stat.app_write_idlefail; -- stat->app_read_cnt += node->stat.app_read_cnt; -- } -+ stat->app_events += node->stat.app_events; -+ stat->read_null += node->stat.read_null; -+ stat->app_write_cnt += node->stat.app_write_cnt; -+ stat->app_write_idlefail += node->stat.app_write_idlefail; -+ stat->app_read_cnt += node->stat.app_read_cnt; - - node = node->next; - } -diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c -index 9ca04aa..b73c983 100644 ---- a/src/ltran/ltran_forward.c -+++ b/src/ltran/ltran_forward.c -@@ -437,15 +437,14 @@ static __rte_always_inline void tcp_hash_table_add_conn(struct gazelle_stack *st - tcp_conn = gazelle_conn_get_by_quintuple(conn_htable, transfer_qtuple); - if (tcp_conn) { - /* When lstack is the server, conn is created in tcp_handle func. lwip send the connect command after -- * receiving syn, and delete conn timeout. */ -- if (tcp_conn->conn_timeout >= 0) { -+ * receiving syn, and delete conn timeout. */ -+ if (tcp_conn->conn_timeout >= 0) { - tcp_conn->conn_timeout = -1; -- return; -- } else { -- /* del old invaild conn */ -+ return; -+ } else { -+ /* del old invaild conn */ - gazelle_conn_del_by_quintuple(conn_htable, transfer_qtuple); -- printf("del old conn port=%d\n", ntohs(transfer_qtuple->dst_port)); -- } -+ } - } - - /* When lstack is the client, lwip send the connect command while calling connect func. conn is created --- -2.23.0 - diff --git a/0106-fix-read-stack-data-return-0-when-no-data.patch b/0106-fix-read-stack-data-return-0-when-no-data.patch deleted file mode 100644 index 7fe953e..0000000 --- a/0106-fix-read-stack-data-return-0-when-no-data.patch +++ /dev/null @@ -1,45 +0,0 @@ -From d039a4e91eb805ea688467e8e4643cbbcf81f35e Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 9 Oct 2022 10:31:16 +0800 -Subject: [PATCH] fix read stack data return 0 when no data - ---- - src/lstack/core/lstack_lwip.c | 6 +++++- - src/ltran/ltran_tcp_conn.h | 1 + - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 60e30d9..8c1df26 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -642,10 +642,14 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - GAZELLE_RETURN(EINVAL); - } - -- if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) { -+ if (sock->errevent > 0) { - return 0; - } - -+ if (!NETCONN_IS_DATAIN(sock)) { -+ GAZELLE_RETURN(EAGAIN); -+ } -+ - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; -diff --git a/src/ltran/ltran_tcp_conn.h b/src/ltran/ltran_tcp_conn.h -index 2b6e6ea..fa508bc 100644 ---- a/src/ltran/ltran_tcp_conn.h -+++ b/src/ltran/ltran_tcp_conn.h -@@ -15,6 +15,7 @@ - - #include - #include -+#include - #include - - #include "gazelle_opt.h" --- -2.23.0 - diff --git a/0107-fix-stack-wakeup-node-del.patch b/0107-fix-stack-wakeup-node-del.patch deleted file mode 100644 index d80d2af..0000000 --- a/0107-fix-stack-wakeup-node-del.patch +++ /dev/null @@ -1,79 +0,0 @@ -From ef98d32ed9dbde08412c8d4587bfeb7a6e75ec7c Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 9 Oct 2022 20:21:40 +0800 -Subject: [PATCH] fix stack wakeup node del - ---- - src/lstack/api/lstack_epoll.c | 4 ++-- - src/lstack/core/lstack_lwip.c | 2 +- - src/lstack/core/lstack_protocol_stack.c | 6 ++++++ - src/lstack/core/lstack_stack_stat.c | 1 + - 4 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 6ac245c..dcd58e7 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -164,8 +164,8 @@ int32_t lstack_epoll_close(int32_t fd) - } - - if (sock->wakeup) { -- if (sock->stack) { -- unregister_wakeup(sock->stack, sock->wakeup); -+ if (sock->wakeup->bind_stack) { -+ unregister_wakeup(sock->wakeup->bind_stack, sock->wakeup); - } - posix_api->close_fn(sock->wakeup->eventfd); - pthread_spin_destroy(&sock->wakeup->event_list_lock); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 8c1df26..4fbaed1 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -486,7 +486,7 @@ static int32_t check_msg_vaild(const struct msghdr *message) - } - - for (int32_t i = 0; i < message->msg_iovlen; i++) { -- if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || -+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len < 0) || - ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || - ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { - GAZELLE_RETURN(EINVAL); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index fbeca62..8283a41 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -355,6 +355,10 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - - static void wakeup_stack_wait(struct protocol_stack *stack) - { -+ if (pthread_spin_trylock(&stack->wakeup_list_lock)) { -+ return; -+ } -+ - struct wakeup_poll *node = stack->wakeup_list; - while (node) { - if (node->have_event) { -@@ -363,6 +367,8 @@ static void wakeup_stack_wait(struct protocol_stack *stack) - } - node = node->next; - } -+ -+ pthread_spin_unlock(&stack->wakeup_list_lock); - } - - static void* gazelle_stack_thread(void *arg) -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index b32f082..c011aed 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -124,6 +124,7 @@ void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup) - } else { - stack->wakeup_list = node->next; - } -+ node->next = NULL; - - pthread_spin_unlock(&stack->wakeup_list_lock); - } --- -2.23.0 - diff --git a/0108-avoid-useless-stack-check-wakeup-event.patch b/0108-avoid-useless-stack-check-wakeup-event.patch deleted file mode 100644 index 8623c12..0000000 --- a/0108-avoid-useless-stack-check-wakeup-event.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 315f57f4bed8aeaa375f7f326ab8723f21082e9a Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 9 Oct 2022 22:15:19 +0800 -Subject: [PATCH] avoid useless stack check wakeup event - ---- - src/lstack/api/lstack_epoll.c | 1 + - src/lstack/core/lstack_protocol_stack.c | 4 +++- - src/lstack/include/lstack_protocol_stack.h | 1 + - 3 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index dcd58e7..4da88b0 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -50,6 +50,7 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) - } - - wakeup->have_event = true; -+ sock->stack->have_event = true; - - if (wakeup->type == WAKEUP_POLL) { - return; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 8283a41..71412b4 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -355,7 +355,7 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - - static void wakeup_stack_wait(struct protocol_stack *stack) - { -- if (pthread_spin_trylock(&stack->wakeup_list_lock)) { -+ if (!stack->have_event || pthread_spin_trylock(&stack->wakeup_list_lock)) { - return; - } - -@@ -369,6 +369,8 @@ static void wakeup_stack_wait(struct protocol_stack *stack) - } - - pthread_spin_unlock(&stack->wakeup_list_lock); -+ -+ stack->have_event = false; - } - - static void* gazelle_stack_thread(void *arg) -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index f58ae56..4249217 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -62,6 +62,7 @@ struct protocol_stack { - - struct list_node recv_list; - struct list_node send_list; -+ bool have_event; - - volatile uint16_t conn_num; - struct stats_ *lwip_stats; --- -2.23.0 - diff --git a/0109-fix-mesg-loss.patch b/0109-fix-mesg-loss.patch deleted file mode 100644 index 4ab1195..0000000 --- a/0109-fix-mesg-loss.patch +++ /dev/null @@ -1,32 +0,0 @@ -From f9183f5d025f8eac168c4f66d4b96992ff4dff28 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Thu, 13 Oct 2022 08:54:40 +0000 -Subject: [PATCH 1/3] fix mesg loss - ---- - src/lstack/core/lstack_lwip.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 4fbaed1..5ca0cc3 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -642,14 +642,10 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - GAZELLE_RETURN(EINVAL); - } - -- if (sock->errevent > 0) { -+ if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) { - return 0; - } - -- if (!NETCONN_IS_DATAIN(sock)) { -- GAZELLE_RETURN(EAGAIN); -- } -- - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; --- -2.23.0 - diff --git a/0110-add-accept4-and-epoll_create1.patch b/0110-add-accept4-and-epoll_create1.patch deleted file mode 100644 index 7e2cefd..0000000 --- a/0110-add-accept4-and-epoll_create1.patch +++ /dev/null @@ -1,232 +0,0 @@ -From 840d501625839cc9c837f65c98baa0def5af3616 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 15 Oct 2022 12:06:56 +0000 -Subject: [PATCH 1/2] add accept4 and epoll_create1 - ---- - src/lstack/api/lstack_epoll.c | 15 +++++++++-- - src/lstack/api/lstack_wrap.c | 31 ++++++++++++++++++---- - src/lstack/core/lstack_lwip.c | 7 ++++- - src/lstack/core/lstack_protocol_stack.c | 11 +++++--- - src/lstack/core/lstack_thread_rpc.c | 3 ++- - src/lstack/include/lstack_protocol_stack.h | 1 + - src/lstack/include/lstack_thread_rpc.h | 2 +- - src/lstack/include/posix/lstack_epoll.h | 1 + - 8 files changed, 58 insertions(+), 13 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 4da88b0..1206e75 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -105,9 +105,8 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s - } - } - --int32_t lstack_epoll_create(int32_t size) -+int32_t lstack_do_epoll_create(int32_t fd) - { -- int32_t fd = posix_api->epoll_create_fn(size); - if (fd < 0) { - return fd; - } -@@ -154,6 +153,18 @@ int32_t lstack_epoll_create(int32_t size) - return fd; - } - -+int32_t lstack_epoll_create1(int32_t flags) -+{ -+ int32_t fd = posix_api->epoll_create1_fn(flags); -+ return lstack_do_epoll_create(fd); -+} -+ -+int32_t lstack_epoll_create(int32_t flags) -+{ -+ int32_t fd = posix_api->epoll_create_fn(flags); -+ return lstack_do_epoll_create(fd); -+} -+ - int32_t lstack_epoll_close(int32_t fd) - { - posix_api->close_fn(fd); -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index d88513b..4669a30 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -80,6 +80,23 @@ static enum KERNEL_LWIP_PATH select_path(int fd) - return PATH_UNKNOW; - } - -+static inline int32_t do_epoll_create1(int32_t flags) -+{ -+ if (posix_api == NULL) { -+ /* posix api maybe call before gazelle init */ -+ if (posix_api_init() != 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); -+ } -+ return posix_api->epoll_create1_fn(flags); -+ } -+ -+ if (unlikely(posix_api->ues_posix)) { -+ return posix_api->epoll_create1_fn(flags); -+ } -+ -+ return lstack_epoll_create1(flags); -+} -+ - static inline int32_t do_epoll_create(int32_t size) - { - if (posix_api == NULL) { -@@ -147,11 +164,7 @@ static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, - return posix_api->accept4_fn(s, addr, addrlen, flags); - } - -- if ((flags & SOCK_CLOEXEC) == 0) { -- return 0; -- } -- -- int32_t fd = stack_broadcast_accept(s, addr, addrlen); -+ int32_t fd = stack_broadcast_accept4(s, addr, addrlen, flags); - if (fd >= 0) { - return fd; - } -@@ -432,6 +445,10 @@ static int32_t do_sigaction(int32_t signum, const struct sigaction *act, struct - * ------- LD_PRELOAD mode replacement interface -------- - * -------------------------------------------------------- - */ -+int32_t epoll_create1(int32_t flags) -+{ -+ return do_epoll_create1(flags); -+} - int32_t epoll_create(int32_t size) - { - return do_epoll_create(size); -@@ -550,6 +567,10 @@ pid_t fork(void) - * -------------------------------------------------------- - */ - -+int32_t __wrap_epoll_create1(int32_t size) -+{ -+ return do_epoll_create1(size); -+} - int32_t __wrap_epoll_create(int32_t size) - { - return do_epoll_create(size); -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 5ca0cc3..94f95fa 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -790,7 +790,12 @@ static inline void clone_lwip_socket_opt(struct lwip_sock *dst_sock, struct lwip - - int32_t gazelle_socket(int domain, int type, int protocol) - { -- int32_t fd = lwip_socket(AF_INET, SOCK_STREAM, 0); -+ if (((type & SOCK_TYPE_MASK) & ~SOCK_STREAM) != 0){ -+ LSTACK_LOG(ERR, LSTACK, "sock type error:%d, only support SOCK_STREAM \n", type); -+ return -1; -+ } -+ -+ int32_t fd = lwip_socket(AF_INET, type, 0); - if (fd < 0) { - return fd; - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 71412b4..c381187 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -531,7 +531,7 @@ void stack_accept(struct rpc_msg *msg) - int32_t fd = msg->args[MSG_ARG_0].i; - msg->result = -1; - -- int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p); -+ int32_t accept_fd = lwip_accept4(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p, msg->args[MSG_ARG_3].i); - if (accept_fd < 0) { - LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); - return; -@@ -749,7 +749,7 @@ static void inline del_accept_in_event(struct lwip_sock *sock) - } - - /* ergodic the protocol stack thread to find the connection, because all threads are listening */ --int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) -+int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *addrlen, int flags) - { - int32_t ret = -1; - -@@ -761,7 +761,7 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - - struct lwip_sock *min_sock = get_min_accept_sock(fd); - if (min_sock && min_sock->conn) { -- ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen); -+ ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen, flags); - } - - if (min_sock && min_sock->wakeup && min_sock->wakeup->type == WAKEUP_EPOLL) { -@@ -773,3 +773,8 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add - } - return ret; - } -+ -+int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen) -+{ -+ return stack_broadcast_accept4(fd, addr, addrlen, 0); -+} -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index ad967e9..bc77909 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -299,7 +299,7 @@ int32_t rpc_call_listen(int s, int backlog) - return rpc_sync_call(&stack->rpc_queue, msg); - } - --int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) -+int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_accept); -@@ -310,6 +310,7 @@ int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) - msg->args[MSG_ARG_0].i = fd; - msg->args[MSG_ARG_1].p = addr; - msg->args[MSG_ARG_2].p = addrlen; -+ msg->args[MSG_ARG_3].i = flags; - - return rpc_sync_call(&stack->rpc_queue, msg); - } -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 4249217..0eda45d 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -115,6 +115,7 @@ int32_t stack_single_listen(int32_t fd, int32_t backlog); - - /* ergodic the protocol stack thread to find the connection, because all threads are listening */ - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen); -+int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *addrlen, int32_t flags); - - struct rpc_msg; - void stack_arp(struct rpc_msg *msg); -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 175c8c9..f95bc72 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -64,7 +64,7 @@ int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol); - int32_t rpc_call_close(int32_t fd); - int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_listen(int s, int backlog); --int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen); -+int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen, int flags); - int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags); - int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen); -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index 5799028..3c8fd1b 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -65,6 +65,7 @@ struct lwip_sock; - void add_sock_event(struct lwip_sock *sock, uint32_t event); - void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup); - int32_t lstack_epoll_create(int32_t size); -+int32_t lstack_epoll_create1(int32_t flags); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event *events, int32_t maxevents, int32_t timeout); - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout); --- -2.23.0 - diff --git a/0111-refactor-event-notice.patch b/0111-refactor-event-notice.patch deleted file mode 100644 index 4506acd..0000000 --- a/0111-refactor-event-notice.patch +++ /dev/null @@ -1,1243 +0,0 @@ -From b41e22d7d8af5c990edc04130d885c9bd675461e Mon Sep 17 00:00:00 2001 -From: chengyechun -Date: Thu, 20 Oct 2022 11:29:16 +0800 -Subject: [PATCH 2/2] refactor event notice - ---- - src/common/gazelle_opt.h | 1 + - src/lstack/api/lstack_epoll.c | 382 +++++++++++++-------- - src/lstack/api/lstack_wrap.c | 9 + - src/lstack/core/lstack_lwip.c | 4 +- - src/lstack/core/lstack_protocol_stack.c | 148 +++++--- - src/lstack/core/lstack_stack_stat.c | 67 +--- - src/lstack/core/lstack_thread_rpc.c | 15 +- - src/lstack/include/lstack_protocol_stack.h | 16 +- - src/lstack/include/lstack_stack_stat.h | 1 - - src/lstack/include/lstack_thread_rpc.h | 2 + - src/lstack/include/posix/lstack_epoll.h | 15 +- - src/lstack/netif/lstack_ethdev.c | 2 +- - src/ltran/ltran_dfx.c | 4 +- - 13 files changed, 410 insertions(+), 256 deletions(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index f2ec163..011553c 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -24,6 +24,7 @@ - #define GAZELLE_FALSE 0 - - #define PROTOCOL_STACK_MAX 32 -+#define KERNEL_EPOLL_MAX 512 - - #define ETHER_ADDR_LEN 6 - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 1206e75..417d69c 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -40,36 +40,54 @@ - #define SEC_TO_NSEC 1000000000 - #define SEC_TO_MSEC 1000 - #define MSEC_TO_NSEC 1000000 --#define POLL_KERNEL_EVENTS 128 -+#define POLL_KERNEL_EVENTS 32 -+ -+static void update_epoll_max_stack(struct wakeup_poll *wakeup); -+static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack, -+ struct protocol_stack *new_stack); - - void add_sock_event(struct lwip_sock *sock, uint32_t event) - { - struct wakeup_poll *wakeup = sock->wakeup; -- if (wakeup == NULL || (event & sock->epoll_events) == 0) { -+ if (wakeup == NULL || wakeup->type == WAKEUP_CLOSE || (event & sock->epoll_events) == 0) { - return; - } - -- wakeup->have_event = true; -- sock->stack->have_event = true; -- -- if (wakeup->type == WAKEUP_POLL) { -- return; -+ if (wakeup->type == WAKEUP_EPOLL) { -+ pthread_spin_lock(&wakeup->event_list_lock); -+ sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); -+ if (list_is_null(&sock->event_list)) { -+ list_add_node(&wakeup->event_list, &sock->event_list); -+ } -+ pthread_spin_unlock(&wakeup->event_list_lock); - } - -- pthread_spin_lock(&wakeup->event_list_lock); -- sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); -- if (list_is_null(&sock->event_list)) { -- list_add_node(&wakeup->event_list, &sock->event_list); -+ struct protocol_stack *stack = sock->stack; -+ if (list_is_null(&wakeup->wakeup_list[stack->queue_id])) { -+ list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->queue_id]); - } -- pthread_spin_unlock(&wakeup->event_list_lock); - } - --void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup) -+void wakeup_stack_epoll(struct protocol_stack *stack) - { -- if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) { -- uint64_t tmp = 1; -- posix_api->write_fn(wakeup->eventfd, &tmp, sizeof(tmp)); -- stack->stats.wakeup_events++; -+ struct list_node *node, *temp; -+ -+ list_for_each_safe(node, temp, &stack->wakeup_list) { -+ struct wakeup_poll *wakeup = container_of((node - stack->queue_id), struct wakeup_poll, wakeup_list); -+ -+ if (!get_protocol_stack_group()->wakeup_enable) { -+ if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) { -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ rte_mb(); -+ pthread_mutex_unlock(&wakeup->wait); -+ stack->stats.wakeup_events++; -+ } -+ } else { -+ gazelle_light_ring_enqueue_busrt(stack->wakeup_ring, (void **)&wakeup, 1); -+ stack->stats.wakeup_events++; -+ } -+ -+ list_del_node_null(&wakeup->wakeup_list[stack->queue_id]); - } - } - -@@ -101,7 +119,11 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s - { - sock->events = update_events(sock); - if (sock->events) { -- add_sock_event(sock, sock->events); -+ pthread_spin_lock(&wakeup->event_list_lock); -+ if (wakeup->type == WAKEUP_EPOLL && list_is_null(&sock->event_list)) { -+ list_add_node(&wakeup->event_list, &sock->event_list); -+ } -+ pthread_spin_unlock(&wakeup->event_list_lock); - } - } - -@@ -125,23 +147,23 @@ int32_t lstack_do_epoll_create(int32_t fd) - GAZELLE_RETURN(EINVAL); - } - -- wakeup->eventfd = eventfd(0, EFD_NONBLOCK); -- if (wakeup->eventfd < 0) { -- LSTACK_LOG(ERR, LSTACK, "eventfd fail=%d errno=%d\n", wakeup->eventfd, errno); -- posix_api->close_fn(fd); -- free(wakeup); -- GAZELLE_RETURN(EINVAL); -+ for (uint32_t i = 0; i < PROTOCOL_STACK_MAX; i++) { -+ init_list_node_null(&wakeup->wakeup_list[i]); - } - -- struct epoll_event event; -- event.data.fd = wakeup->eventfd; -- event.events = EPOLLIN | EPOLLET; -- if (posix_api->epoll_ctl_fn(fd, EPOLL_CTL_ADD, wakeup->eventfd, &event) < 0) { -- LSTACK_LOG(ERR, LSTACK, "ctl eventfd errno=%d\n", errno); -+ if (pthread_mutex_init(&wakeup->wait, NULL) != 0) { - posix_api->close_fn(fd); - free(wakeup); - GAZELLE_RETURN(EINVAL); - } -+ pthread_mutex_trylock(&wakeup->wait); -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ init_list_node_null(&wakeup->poll_list); -+ pthread_spin_lock(&stack_group->poll_list_lock); -+ list_add_node(&stack_group->poll_list, &wakeup->poll_list); -+ pthread_spin_unlock(&stack_group->poll_list_lock); - - init_list_node(&wakeup->event_list); - pthread_spin_init(&wakeup->event_list_lock, PTHREAD_PROCESS_PRIVATE); -@@ -150,6 +172,9 @@ int32_t lstack_do_epoll_create(int32_t fd) - wakeup->epollfd = fd; - sock->wakeup = wakeup; - -+ update_epoll_max_stack(wakeup); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ - return fd; - } - -@@ -167,24 +192,41 @@ int32_t lstack_epoll_create(int32_t flags) - - int32_t lstack_epoll_close(int32_t fd) - { -- posix_api->close_fn(fd); -- - struct lwip_sock *sock = get_socket_by_fd(fd); - if (sock == NULL) { - LSTACK_LOG(ERR, LSTACK, "fd=%d sock is NULL errno=%d\n", fd, errno); - GAZELLE_RETURN(EINVAL); - } - -- if (sock->wakeup) { -- if (sock->wakeup->bind_stack) { -- unregister_wakeup(sock->wakeup->bind_stack, sock->wakeup); -- } -- posix_api->close_fn(sock->wakeup->eventfd); -- pthread_spin_destroy(&sock->wakeup->event_list_lock); -- free(sock->wakeup); -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ struct wakeup_poll *wakeup = sock->wakeup; -+ if (wakeup == NULL) { -+ return 0; - } -+ -+ wakeup->type = WAKEUP_CLOSE; -+ -+ stack_broadcast_clean_epoll(wakeup); -+ -+ struct list_node *node, *temp; -+ pthread_spin_lock(&wakeup->event_list_lock); -+ list_for_each_safe(node, temp, &wakeup->event_list) { -+ struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); -+ list_del_node_null(&sock->event_list); -+ } -+ pthread_spin_unlock(&wakeup->event_list_lock); -+ pthread_spin_destroy(&wakeup->event_list_lock); -+ -+ pthread_spin_lock(&stack_group->poll_list_lock); -+ list_del_node_null(&wakeup->poll_list); -+ pthread_spin_unlock(&stack_group->poll_list_lock); -+ -+ pthread_mutex_destroy(&wakeup->wait); -+ -+ free(wakeup); - sock->wakeup = NULL; - -+ posix_api->close_fn(fd); - return 0; - } - -@@ -243,12 +285,10 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - struct wakeup_poll *wakeup = epoll_sock->wakeup; - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -- wakeup->have_kernel_fd = true; - return posix_api->epoll_ctl_fn(epfd, op, fd, event); - } - - if (CONN_TYPE_HAS_HOST(sock->conn)) { -- wakeup->have_kernel_fd = true; - int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d\n", fd, epfd, op); -@@ -347,36 +387,40 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds) - return event_num; - } - --static void epoll_bind_statck(struct wakeup_poll *wakeup) -+static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack, -+ struct protocol_stack *new_stack) - { -- /* all fd is kernel, set rand stack */ -- if (wakeup->bind_stack == NULL && wakeup->max_stack == NULL) { -- update_epoll_max_stack(wakeup); -+ if (old_stack) { -+ if (posix_api->epoll_ctl_fn(old_stack->epollfd, EPOLL_CTL_DEL, wakeup->epollfd, NULL) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); -+ } - } - -- if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) { -- if (get_global_cfg_params()->app_bind_numa) { -- bind_to_stack_numa(wakeup->max_stack); -- } -- if (wakeup->bind_stack) { -- unregister_wakeup(wakeup->bind_stack, wakeup); -- } -- wakeup->bind_stack = wakeup->max_stack; -- register_wakeup(wakeup->bind_stack, wakeup); -+ /* avoid kernel thread post too much, use EPOLLET */ -+ struct epoll_event event; -+ event.data.ptr = wakeup; -+ event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET; -+ if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); - } - } - --static bool del_event_fd(struct epoll_event* events, int32_t eventnum, int32_t eventfd) -+static void epoll_bind_statck(struct wakeup_poll *wakeup) - { -- for (int32_t i = 0; i < eventnum; i++) { -- if (events[i].data.fd == eventfd) { -- events[i].data.u64 = events[eventnum - 1].data.u64; -- events[i].events = events[eventnum - 1].events; -- return true; -- } -+ if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) { -+ bind_to_stack_numa(wakeup->max_stack); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ wakeup->bind_stack = wakeup->max_stack; - } -+} - -- return false; -+static void ms_to_timespec(struct timespec *timespec, int32_t timeout) -+{ -+ clock_gettime(CLOCK_REALTIME, timespec); -+ timespec->tv_sec += timeout / SEC_TO_MSEC; -+ timespec->tv_nsec += (timeout % SEC_TO_MSEC) * MSEC_TO_NSEC; -+ timespec->tv_sec += timespec->tv_nsec / SEC_TO_NSEC; -+ timespec->tv_nsec = timespec->tv_nsec % SEC_TO_NSEC; - } - - int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout) -@@ -388,63 +432,84 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - - struct wakeup_poll *wakeup = sock->wakeup; - int32_t kernel_num = 0; -+ int32_t lwip_num = 0; -+ int32_t ret = 0; - -- epoll_bind_statck(sock->wakeup); -+ if (get_global_cfg_params()->app_bind_numa) { -+ epoll_bind_statck(sock->wakeup); -+ } - -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -- rte_mb(); -+ do { -+ lwip_num = epoll_lwip_event(wakeup, events, maxevents); -+ wakeup->stat.app_events += lwip_num; - -- int32_t lwip_num = epoll_lwip_event(wakeup, events, maxevents); -- wakeup->stat.app_events += lwip_num; -- if (!wakeup->have_kernel_fd && lwip_num > 0) { -- return lwip_num; -- } -+ if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { -+ __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -+ kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0); -+ } - -- if (lwip_num > 0) { -- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -- rte_mb(); -- kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0); -- } else { -- kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, timeout); -- rte_mb(); -- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -- } -+ if (lwip_num + kernel_num > 0) { -+ return lwip_num + kernel_num; -+ } - -- if (kernel_num <= 0) { -- return (lwip_num > 0) ? lwip_num : kernel_num; -- } -+ if (timeout < 0) { -+ ret = pthread_mutex_lock(&wakeup->wait); -+ } else { -+ struct timespec epoll_time; -+ ms_to_timespec(&epoll_time, timeout); -+ ret = pthread_mutex_timedlock(&wakeup->wait, &epoll_time); -+ } - -- if (del_event_fd(&events[lwip_num], kernel_num, wakeup->eventfd)) { -- kernel_num--; -- if (lwip_num == 0) { -- lwip_num = epoll_lwip_event(wakeup, &events[kernel_num], maxevents - kernel_num); -+ if (ret == 0) { -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); - } -- } -+ } while (ret == 0); - -- return lwip_num + kernel_num; -+ return 0; - } - - static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - { -- wakeup->type = WAKEUP_POLL; -+ if (pthread_mutex_init(&wakeup->wait, NULL) != 0) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ pthread_mutex_trylock(&wakeup->wait); -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ -+ for (uint32_t i = 0; i < PROTOCOL_STACK_MAX; i++) { -+ init_list_node_null(&wakeup->wakeup_list[i]); -+ } - -- wakeup->eventfd = eventfd(0, EFD_NONBLOCK); -- if (wakeup->eventfd < 0) { -- LSTACK_LOG(ERR, LSTACK, "eventfd failed errno=%d\n", errno); -+ wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS); -+ if (wakeup->epollfd < 0) { - GAZELLE_RETURN(EINVAL); - } - -+ wakeup->type = WAKEUP_POLL; -+ - wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd)); - if (wakeup->last_fds == NULL) { -- LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -- posix_api->close_fn(wakeup->eventfd); - GAZELLE_RETURN(EINVAL); - } -- -- wakeup->last_fds[0].fd = wakeup->eventfd; -- wakeup->last_fds[0].events = POLLIN; - wakeup->last_max_nfds = POLL_KERNEL_EVENTS; - -+ wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event)); -+ if (wakeup->events == NULL) { -+ free(wakeup->last_fds); -+ GAZELLE_RETURN(EINVAL); -+ } -+ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ init_list_node_null(&wakeup->poll_list); -+ pthread_spin_lock(&stack_group->poll_list_lock); -+ list_add_node(&stack_group->poll_list, &wakeup->poll_list); -+ pthread_spin_unlock(&stack_group->poll_list_lock); -+ -+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; -+ - return 0; - } - -@@ -453,13 +518,19 @@ static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds) - if (wakeup->last_fds) { - free(wakeup->last_fds); - } -- wakeup->last_fds = calloc(nfds + 1, sizeof(struct pollfd)); -+ wakeup->last_fds = calloc(nfds, sizeof(struct pollfd)); - if (wakeup->last_fds == NULL) { - LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); - } - -- wakeup->last_fds[0].fd = wakeup->eventfd; -- wakeup->last_fds[0].events = POLLIN; -+ if (wakeup->events) { -+ free(wakeup->events); -+ } -+ wakeup->events = calloc(nfds, sizeof(struct epoll_event)); -+ if (wakeup->events == NULL) { -+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno); -+ } -+ - wakeup->last_max_nfds = nfds; - } - -@@ -472,15 +543,25 @@ static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count) - return; - } - -- if (wakeup->bind_stack) { -- unregister_wakeup(wakeup->bind_stack, wakeup); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ bind_to_stack_numa(stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; -+} -+ -+static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struct pollfd *new_fd) -+{ -+ posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_DEL, wakeup->last_fds[index].fd, NULL); -+ -+ if (new_fd == NULL) { -+ return; - } -- -- if (get_global_cfg_params()->app_bind_numa) { -- bind_to_stack_numa(stack_group->stacks[bind_id]); -+ -+ struct epoll_event event; -+ event.data.u32 = index; -+ event.events = new_fd->events; -+ if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno); - } -- wakeup->bind_stack = stack_group->stacks[bind_id]; -- register_wakeup(wakeup->bind_stack, wakeup); - } - - static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds) -@@ -494,31 +575,33 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - poll_change = 1; - } - -+ if (nfds < wakeup->last_nfds) { -+ poll_change = 1; -+ } -+ - for (uint32_t i = 0; i < nfds; i++) { - int32_t fd = fds[i].fd; - fds[i].revents = 0; - struct lwip_sock *sock = get_socket_by_fd(fd); - -- if (fd == wakeup->last_fds[i + 1].fd && fds[i].events == wakeup->last_fds[i + 1].events) { -+ if (fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) { - /* fd close then socket may get same fd. */ - if (sock == NULL || sock->wakeup != NULL) { - continue; - } - } -- wakeup->last_fds[i + 1].fd = fd; -- wakeup->last_fds[i + 1].events = fds[i].events; -+ wakeup->last_fds[i].fd = fd; -+ wakeup->last_fds[i].events = fds[i].events; - poll_change = 1; - -- while (sock && sock->conn) { -- if (sock->epoll_events != (fds[i].events | POLLERR)) { -- sock->epoll_events = fds[i].events | POLLERR; -- } -- if (sock->wakeup != wakeup) { -- sock->wakeup = wakeup; -- } -+ if (sock == NULL || sock->conn == NULL || CONN_TYPE_HAS_HOST(sock->conn)) { -+ update_kernel_poll(wakeup, i, fds + i); -+ } - -+ while (sock && sock->conn) { -+ sock->epoll_events = fds[i].events | POLLERR; -+ sock->wakeup = wakeup; - stack_count[sock->stack->queue_id]++; -- /* listenfd list */ - sock = sock->listen_next; - } - } -@@ -526,9 +609,11 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd - if (poll_change == 0) { - return; - } -- wakeup->last_nfds = nfds + 1; -+ wakeup->last_nfds = nfds; - -- poll_bind_statck(wakeup, stack_count); -+ if (get_global_cfg_params()->app_bind_numa) { -+ poll_bind_statck(wakeup, stack_count); -+ } - } - - int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) -@@ -548,43 +633,38 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - - poll_init(wakeup, fds, nfds); - -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -- rte_mb(); -- -- int32_t lwip_num = poll_lwip_event(fds, nfds); -- wakeup->stat.app_events += lwip_num; -- if (lwip_num >= nfds) { -- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -- return lwip_num; -- } -- - int32_t kernel_num = 0; -- if (lwip_num > 0) { -- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -- rte_mb(); -- kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, 0); -- } else { -- kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, timeout); -- rte_mb(); -- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -- } -+ int32_t lwip_num = 0; -+ int32_t ret; - -- if (kernel_num <= 0) { -- return (lwip_num > 0) ? lwip_num : kernel_num; -- } -+ do { -+ lwip_num = poll_lwip_event(fds, nfds); -+ -+ if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { -+ __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -+ kernel_num = posix_api->epoll_wait_fn(wakeup->epollfd, wakeup->events, nfds, 0); -+ for (int32_t i = 0; i < kernel_num; i++) { -+ uint32_t index = wakeup->events[i].data.u32; -+ fds[index].revents = wakeup->events[i].events; -+ } -+ } - -- for (nfds_t i = 0; i < nfds; i++) { -- if (fds[i].revents == 0 && wakeup->last_fds[i + 1].revents != 0) { -- fds[i].revents = wakeup->last_fds[i + 1].revents; -+ if (lwip_num + kernel_num > 0) { -+ return lwip_num + kernel_num; - } -- } - -- if (wakeup->last_fds[0].revents) { -- if (lwip_num == 0) { -- lwip_num = poll_lwip_event(fds, nfds); -+ if (timeout < 0) { -+ ret = pthread_mutex_lock(&wakeup->wait); -+ } else { -+ struct timespec epoll_time; -+ ms_to_timespec(&epoll_time, timeout); -+ ret = pthread_mutex_timedlock(&wakeup->wait, &epoll_time); - } -- kernel_num--; -- } - -- return kernel_num + lwip_num; -+ if (ret == 0) { -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ } -+ } while (ret == 0); -+ -+ return 0; - } -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 4669a30..8dc4524 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -203,6 +203,15 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name - return posix_api->connect_fn(s, name, namelen); - } - -+ struct lwip_sock *sock = get_socket(s); -+ if (sock == NULL) { -+ return posix_api->connect_fn(s, name, namelen); -+ } -+ -+ if (!netconn_is_nonblocking(sock->conn)) { -+ GAZELLE_RETURN(EINVAL); -+ } -+ - int32_t ret = rpc_call_connect(s, name, namelen); - if (ret == 0 || errno == EISCONN) { - return ret; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 94f95fa..00afc75 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -234,13 +234,13 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - return NULL; - } - -- sock->stack->stats.write_lwip_cnt++; - return pbuf; - } - - void write_lwip_over(struct lwip_sock *sock, uint32_t n) - { - gazelle_ring_dequeue_over(sock->send_ring, n); -+ sock->stack->stats.write_lwip_cnt += n; - } - - static inline void del_data_out_event(struct lwip_sock *sock) -@@ -269,6 +269,7 @@ void write_stack_over(struct lwip_sock *sock) - gazelle_ring_read_over(sock->send_ring); - - if (sock->wakeup) { -+ sock->wakeup->stat.app_write_cnt++; - if (sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { - del_data_out_event(sock); - } -@@ -882,6 +883,7 @@ void get_lwip_conntable(struct rpc_msg *msg) - conn[conn_num].l_port = pcbl->local_port; - conn[conn_num].tcp_sub_state = pcbl->state; - struct netconn *netconn = (struct netconn *)pcbl->callback_arg; -+ conn[conn_num].fd = netconn->socket; - if (netconn != NULL && netconn->acceptmbox != NULL) { - conn[conn_num].recv_cnt = rte_ring_count(netconn->acceptmbox->ring); - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index c381187..79769f3 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -36,12 +36,12 @@ - #include "posix/lstack_epoll.h" - #include "lstack_stack_stat.h" - --#define READ_LIST_MAX 32 --#define SEND_LIST_MAX 32 --#define HANDLE_RPC_MSG_MAX 32 --#define KERNEL_EPOLL_MAX 256 -+#define READ_LIST_MAX 128 -+#define SEND_LIST_MAX 128 -+#define HANDLE_RPC_MSG_MAX 128 -+#define KERNEL_EVENT_100us 100 - --static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX; -+static PER_THREAD struct protocol_stack *g_stack_p = NULL; - static struct protocol_stack_group g_stack_group = {0}; - - void set_init_fail(void); -@@ -57,12 +57,13 @@ void bind_to_stack_numa(struct protocol_stack *stack) - ret = pthread_setaffinity_np(tid, sizeof(stack->idle_cpuset), &stack->idle_cpuset); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "thread %d setaffinity to stack %hu failed\n", rte_gettid(), stack->queue_id); -+ return; - } - } - - static inline void set_stack_idx(uint16_t idx) - { -- g_stack_idx = idx; -+ g_stack_p = g_stack_group.stacks[idx]; - } - - long get_stack_tid(void) -@@ -83,10 +84,7 @@ struct protocol_stack_group *get_protocol_stack_group(void) - - struct protocol_stack *get_protocol_stack(void) - { -- if (g_stack_idx >= PROTOCOL_STACK_MAX) { -- return NULL; -- } -- return g_stack_group.stacks[g_stack_idx]; -+ return g_stack_p; - } - - struct protocol_stack *get_protocol_stack_by_fd(int32_t fd) -@@ -241,10 +239,33 @@ static void* gazelle_wakeup_thread(void *arg) - nanosleep(&st, NULL); - } - -- sem_t *event_sem[WAKEUP_MAX_NUM]; -- uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM); -+ struct wakeup_poll *wakeup[WAKEUP_MAX_NUM]; -+ uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)wakeup, WAKEUP_MAX_NUM); - for (uint32_t i = 0; i < num; i++) { -- sem_post(event_sem[i]); -+ if (__atomic_load_n(&wakeup[i]->in_wait, __ATOMIC_ACQUIRE)) { -+ __atomic_store_n(&wakeup[i]->in_wait, false, __ATOMIC_RELEASE); -+ rte_mb(); -+ pthread_mutex_unlock(&wakeup[i]->wait); -+ } -+ } -+ } -+ -+ return NULL; -+} -+ -+static void* gazelle_kernelevent_thread(void *arg) -+{ -+ uint16_t queue_id = *(uint16_t *)arg; -+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; -+ -+ bind_to_stack_numa(stack); -+ -+ LSTACK_LOG(INFO, LSTACK, "kernelevent_%02hu start\n", queue_id); -+ -+ for (;;) { -+ stack->kernel_event_num = posix_api->epoll_wait_fn(stack->epollfd, stack->kernel_events, KERNEL_EPOLL_MAX, -1); -+ while (stack->kernel_event_num > 0) { -+ usleep(KERNEL_EVENT_100us); - } - } - -@@ -255,27 +276,26 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- set_stack_idx(queue_id); - stack->tid = rte_gettid(); - stack->queue_id = queue_id; - stack->port_id = stack_group->port_id; - stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; - stack->lwip_stats = &lwip_stats; - -- pthread_spin_init(&stack->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE); -- - init_list_node(&stack->recv_list); - init_list_node(&stack->send_list); -+ init_list_node(&stack->wakeup_list); - - sys_calibrate_tsc(); - stack_stat_init(); - - stack_group->stacks[queue_id] = stack; -+ set_stack_idx(queue_id); - -- if (thread_affinity_init(stack->cpu_id) != 0) { -+ stack->epollfd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN); -+ if (stack->epollfd < 0) { - return -1; - } -- RTE_PER_LCORE(_lcore_id) = stack->cpu_id; - - stack->socket_id = numa_node_of_cpu(stack->cpu_id); - if (stack->socket_id < 0) { -@@ -302,6 +322,23 @@ void wait_sem_value(sem_t *sem, int32_t wait_value) - } while (sem_val < wait_value); - } - -+static int32_t create_affiliate_thread(uint16_t queue_id, bool wakeup_enable) -+{ -+ if (wakeup_enable) { -+ if (create_thread(queue_id, "gazelleweakup", gazelle_wakeup_thread) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup errno=%d\n", errno); -+ return -1; -+ } -+ } -+ -+ if (create_thread(queue_id, "gazellekernel", gazelle_kernelevent_thread) != 0) { -+ LSTACK_LOG(ERR, LSTACK, "gazellekernel errno=%d\n", errno); -+ return -1; -+ } -+ -+ return 0; -+} -+ - static struct protocol_stack *stack_thread_init(uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); -@@ -319,6 +356,19 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - return NULL; - } - -+ if (create_affiliate_thread(queue_id, stack_group->wakeup_enable) < 0) { -+ sem_post(&stack_group->thread_phase1); -+ free(stack); -+ return NULL; -+ } -+ -+ if (thread_affinity_init(stack->cpu_id) != 0) { -+ sem_post(&stack_group->thread_phase1); -+ free(stack); -+ return NULL; -+ } -+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id; -+ - hugepage_init(); - - tcpip_init(NULL, NULL); -@@ -342,35 +392,28 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - return NULL; - } - -- if (stack_group->wakeup_enable) { -- if (create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread) != 0) { -- LSTACK_LOG(ERR, LSTACK, "gazelleweakup errno=%d\n", errno); -- free(stack); -- return NULL; -- } -- } -- - return stack; - } - --static void wakeup_stack_wait(struct protocol_stack *stack) -+static void wakeup_kernel_event(struct protocol_stack *stack) - { -- if (!stack->have_event || pthread_spin_trylock(&stack->wakeup_list_lock)) { -+ if (stack->kernel_event_num == 0) { - return; - } - -- struct wakeup_poll *node = stack->wakeup_list; -- while (node) { -- if (node->have_event) { -- wakeup_epoll(stack, node); -- node->have_event = false; -+ for (int32_t i = 0; i < stack->kernel_event_num; i++) { -+ struct wakeup_poll *wakeup = stack->kernel_events[i].data.ptr; -+ if (wakeup->type == WAKEUP_CLOSE) { -+ continue; - } -- node = node->next; -- } - -- pthread_spin_unlock(&stack->wakeup_list_lock); -+ __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE); -+ if (list_is_null(&wakeup->wakeup_list[stack->queue_id])) { -+ list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->queue_id]); -+ } -+ } - -- stack->have_event = false; -+ stack->kernel_event_num = 0; - } - - static void* gazelle_stack_thread(void *arg) -@@ -398,7 +441,9 @@ static void* gazelle_stack_thread(void *arg) - - send_stack_list(stack, SEND_LIST_MAX); - -- wakeup_stack_wait(stack); -+ wakeup_kernel_event(stack); -+ -+ wakeup_stack_epoll(stack); - - sys_timer_run(); - -@@ -445,6 +490,9 @@ int32_t init_protocol_stack(void) - - stack_group->stack_num = get_global_cfg_params()->num_cpu; - stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false; -+ init_list_node(&stack_group->poll_list); -+ pthread_spin_init(&stack_group->poll_list_lock, PTHREAD_PROCESS_PRIVATE); -+ - - if (init_protocol_sem() != 0) { - return -1; -@@ -482,7 +530,10 @@ void stack_socket(struct rpc_msg *msg) - { - msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); - if (msg->result < 0) { -- LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); -+ msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); -+ if (msg->result < 0) { -+ LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); -+ } - } - } - -@@ -644,6 +695,25 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - } - } - -+void stack_broadcast_clean_epoll(struct wakeup_poll *wakeup) -+{ -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ struct protocol_stack *stack = NULL; -+ -+ for (int32_t i = 0; i < stack_group->stack_num; i++) { -+ stack = stack_group->stacks[i]; -+ rpc_call_clean_epoll(stack, wakeup); -+ } -+} -+ -+void stack_clean_epoll(struct rpc_msg *msg) -+{ -+ struct protocol_stack *stack = get_protocol_stack(); -+ struct wakeup_poll *wakeup = (struct wakeup_poll *)msg->args[MSG_ARG_0].p; -+ -+ list_del_node_null(&wakeup->wakeup_list[stack->queue_id]); -+} -+ - /* when fd is listenfd, listenfd of all protocol stack thread will be closed */ - int32_t stack_broadcast_close(int32_t fd) - { -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index c011aed..6261fa9 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -92,59 +92,26 @@ static void set_latency_start_flag(bool start) - } - } - --void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup) -+static void get_wakeup_stat(struct protocol_stack_group *stack_group, struct protocol_stack *stack, -+ struct gazelle_wakeup_stat *stat) - { -- pthread_spin_lock(&stack->wakeup_list_lock); -+ struct list_node *node, *temp; - -- wakeup->next = stack->wakeup_list; -- stack->wakeup_list = wakeup; -+ pthread_spin_lock(&stack_group->poll_list_lock); - -- pthread_spin_unlock(&stack->wakeup_list_lock); --} -- --void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup) --{ -- pthread_spin_lock(&stack->wakeup_list_lock); -- -- struct wakeup_poll *node = stack->wakeup_list; -- struct wakeup_poll *pre = NULL; -- -- while (node && node != wakeup) { -- pre = node; -- node = node->next; -- } -- -- if (node == NULL) { -- pthread_spin_unlock(&stack->wakeup_list_lock); -- return; -- } -+ list_for_each_safe(node, temp, &stack_group->poll_list) { -+ struct wakeup_poll *wakeup = container_of(node, struct wakeup_poll, poll_list); - -- if (pre) { -- pre->next = node->next; -- } else { -- stack->wakeup_list = node->next; -- } -- node->next = NULL; -- -- pthread_spin_unlock(&stack->wakeup_list_lock); --} -- --static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_stat *stat) --{ -- pthread_spin_lock(&stack->wakeup_list_lock); -- -- struct wakeup_poll *node = stack->wakeup_list; -- while (node) { -- stat->app_events += node->stat.app_events; -- stat->read_null += node->stat.read_null; -- stat->app_write_cnt += node->stat.app_write_cnt; -- stat->app_write_idlefail += node->stat.app_write_idlefail; -- stat->app_read_cnt += node->stat.app_read_cnt; -- -- node = node->next; -+ if (wakeup->bind_stack == stack) { -+ stat->app_events += wakeup->stat.app_events; -+ stat->read_null += wakeup->stat.read_null; -+ stat->app_write_cnt += wakeup->stat.app_write_cnt; -+ stat->app_write_idlefail += wakeup->stat.app_write_idlefail; -+ stat->app_read_cnt += wakeup->stat.app_read_cnt; -+ } - } - -- pthread_spin_unlock(&stack->wakeup_list_lock); -+ pthread_spin_unlock(&stack_group->poll_list_lock); - } - - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info) -@@ -172,7 +139,7 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - return; - } - -- get_wakeup_stat(stack, &dfx->data.pkts.wakeup_stat); -+ get_wakeup_stat(stack_group, stack, &dfx->data.pkts.wakeup_stat); - - dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail; - -@@ -251,11 +218,13 @@ static int32_t send_control_cmd_data(int32_t fd, struct gazelle_stack_dfx_data * - - int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode) - { -- struct gazelle_stack_dfx_data dfx = {0}; -+ struct gazelle_stack_dfx_data dfx; - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - - for (uint32_t i = 0; i < stack_group->stack_num; i++) { - struct protocol_stack *stack = stack_group->stacks[i]; -+ -+ memset_s(&dfx, sizeof(dfx), 0, sizeof(dfx)); - get_stack_dfx_data(&dfx, stack, stat_mode); - - if (!use_ltran() && -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index bc77909..46cbbe7 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -88,7 +88,6 @@ static inline __attribute__((always_inline)) void rpc_msg_free(struct rpc_msg *m - - static inline __attribute__((always_inline)) void rpc_call(lockless_queue *queue, struct rpc_msg *msg) - { -- pthread_spin_trylock(&msg->lock); - lockless_queue_mpsc_push(queue, &msg->queue_node); - } - -@@ -96,6 +95,7 @@ static inline __attribute__((always_inline)) int32_t rpc_sync_call(lockless_queu - { - int32_t ret; - -+ pthread_spin_trylock(&msg->lock); - rpc_call(queue, msg); - - // waiting stack unlock -@@ -270,6 +270,18 @@ int32_t rpc_call_close(int fd) - return rpc_sync_call(&stack->rpc_queue, msg); - } - -+void rpc_call_clean_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_clean_epoll); -+ if (msg == NULL) { -+ return; -+ } -+ -+ msg->args[MSG_ARG_0].p = wakeup; -+ -+ rpc_sync_call(&stack->rpc_queue, msg); -+} -+ - int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -@@ -447,4 +459,3 @@ int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - - return 0; - } -- -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 0eda45d..cc2cfb9 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -14,6 +14,7 @@ - #define __GAZELLE_PROTOCOL_STACK_H__ - - #include -+#include - - #include - #include -@@ -50,11 +51,14 @@ struct protocol_stack { - struct reg_ring_msg *reg_buf; - - volatile bool low_power; -- struct wakeup_poll *wakeup_list; -- pthread_spinlock_t wakeup_list_lock; - lockless_queue rpc_queue __rte_cache_aligned; - char pad __rte_cache_aligned; - -+ /* kernel event thread read/write frequently */ -+ struct epoll_event kernel_events[KERNEL_EPOLL_MAX]; -+ int32_t kernel_event_num; -+ char pad1 __rte_cache_aligned; -+ - struct netif netif; - struct eth_dev_ops *dev_ops; - uint32_t rx_ring_used; -@@ -62,7 +66,7 @@ struct protocol_stack { - - struct list_node recv_list; - struct list_node send_list; -- bool have_event; -+ struct list_node wakeup_list; - - volatile uint16_t conn_num; - struct stats_ *lwip_stats; -@@ -85,6 +89,8 @@ struct protocol_stack_group { - struct eth_params *eth_params; - struct protocol_stack *stacks[PROTOCOL_STACK_MAX]; - bool wakeup_enable; -+ struct list_node poll_list; -+ pthread_spinlock_t poll_list_lock; - - /* dfx stats */ - bool latency_start; -@@ -117,7 +123,11 @@ int32_t stack_single_listen(int32_t fd, int32_t backlog); - int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen); - int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *addrlen, int32_t flags); - -+struct wakeup_poll; -+void stack_broadcast_clean_epoll(struct wakeup_poll *wakeup); -+ - struct rpc_msg; -+void stack_clean_epoll(struct rpc_msg *msg); - void stack_arp(struct rpc_msg *msg); - void stack_socket(struct rpc_msg *msg); - void stack_close(struct rpc_msg *msg); -diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h -index 98ffe8f..6057fe1 100644 ---- a/src/lstack/include/lstack_stack_stat.h -+++ b/src/lstack/include/lstack_stack_stat.h -@@ -27,7 +27,6 @@ void stack_stat_init(void); - int32_t handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode); - uint64_t get_current_time(void); - void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info); --void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup); - void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup); - - #endif /* GAZELLE_STACK_STAT_H */ -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index f95bc72..6928f98 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -50,7 +50,9 @@ struct rpc_msg { - - struct protocol_stack; - struct rte_mbuf; -+struct wakeup_poll; - void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num); -+void rpc_call_clean_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); - int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen); - int32_t rpc_call_recvlistcnt(struct protocol_stack *stack); -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index 3c8fd1b..d6c81a7 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -17,7 +17,6 @@ - #include - #include - #include --#include - - #include - -@@ -31,29 +30,31 @@ extern "C" { - enum wakeup_type { - WAKEUP_EPOLL = 0, - WAKEUP_POLL, -+ WAKEUP_CLOSE, - }; - - struct protocol_stack; - struct wakeup_poll { - /* stack thread read frequently */ -- int32_t eventfd; - enum wakeup_type type; -- bool have_event; -- volatile bool in_wait __rte_cache_aligned; -+ pthread_mutex_t wait __rte_cache_aligned; -+ bool in_wait; -+ struct list_node wakeup_list[PROTOCOL_STACK_MAX]; -+ bool have_kernel_event; - char pad __rte_cache_aligned; - - struct gazelle_wakeup_stat stat; - struct protocol_stack *bind_stack; -- struct wakeup_poll *next; -+ struct list_node poll_list; - - /* poll */ - struct pollfd *last_fds; - nfds_t last_nfds; - nfds_t last_max_nfds; -+ struct epoll_event *events; - - /* epoll */ - int32_t epollfd; /* epoll kernel fd */ -- bool have_kernel_fd; - int32_t stack_fd_cnt[PROTOCOL_STACK_MAX]; - struct protocol_stack *max_stack; - struct list_node event_list; -@@ -63,7 +64,7 @@ struct wakeup_poll { - struct netconn; - struct lwip_sock; - void add_sock_event(struct lwip_sock *sock, uint32_t event); --void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup); -+void wakeup_stack_epoll(struct protocol_stack *stack); - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_create1(int32_t flags); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 28bf32d..4757d72 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -79,7 +79,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - } - } - --#define READ_PKTS_MAX 32 -+#define READ_PKTS_MAX 128 - int32_t eth_dev_poll(void) - { - uint32_t nr_pkts; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 3d977b5..de97a48 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -875,8 +875,8 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-57u%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, -- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); -+ printf("%-6utcp %-50u%-7d%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, -+ conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, conn_info->state); --- -2.23.0 - diff --git a/0112-add-writev-and-readv.patch b/0112-add-writev-and-readv.patch deleted file mode 100644 index c9eef91..0000000 --- a/0112-add-writev-and-readv.patch +++ /dev/null @@ -1,96 +0,0 @@ -From f657eef24e947bb2d581599ddaf016b51ac349ae Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 22 Oct 2022 06:26:19 +0000 -Subject: [PATCH 1/7] add writev and readv - ---- - src/lstack/api/lstack_wrap.c | 44 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 44 insertions(+) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 1c1dcdd..9672d3d 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -333,6 +333,20 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len) - return posix_api->read_fn(s, mem, len); - } - -+static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ struct msghdr msg; -+ -+ msg.msg_name = NULL; -+ msg.msg_namelen = 0; -+ msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov); -+ msg.msg_iovlen = iovcnt; -+ msg.msg_control = NULL; -+ msg.msg_controllen = 0; -+ msg.msg_flags = 0; -+ return recvmsg_from_stack(s, &msg, 0); -+} -+ - static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags) - { - if (select_path(sockfd) != PATH_LWIP) { -@@ -351,6 +365,20 @@ static inline ssize_t do_write(int32_t s, const void *mem, size_t size) - return gazelle_send(s, mem, size, 0); - } - -+static inline ssize_t do_writev(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ struct msghdr msg; -+ -+ msg.msg_name = NULL; -+ msg.msg_namelen = 0; -+ msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov); -+ msg.msg_iovlen = iovcnt; -+ msg.msg_control = NULL; -+ msg.msg_controllen = 0; -+ msg.msg_flags = 0; -+ return sendmsg_to_stack(s, &msg, 0); -+} -+ - static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flags) - { - if (message == NULL) { -@@ -526,14 +554,26 @@ ssize_t read(int32_t s, void *mem, size_t len) - { - return do_read(s, mem, len); - } -+ssize_t readv(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ return do_readv(s, iov, iovcnt); -+} - ssize_t write(int32_t s, const void *mem, size_t size) - { - return do_write(s, mem, size); - } -+ssize_t writev(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ return do_writev(s, iov, iovcnt); -+} - ssize_t __wrap_write(int32_t s, const void *mem, size_t size) - { - return do_write(s, mem, size); - } -+ssize_t __wrap_writev(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ return do_writev(s, iov, iovcnt); -+} - ssize_t recv(int32_t sockfd, void *buf, size_t len, int32_t flags) - { - return do_recv(sockfd, buf, len, flags); -@@ -649,6 +689,10 @@ ssize_t __wrap_read(int32_t s, void *mem, size_t len) - { - return do_read(s, mem, len); - } -+ssize_t __wrap_readv(int32_t s, const struct iovec *iov, int iovcnt) -+{ -+ return do_readv(s, iov, iovcnt); -+} - ssize_t __wrap_recv(int32_t sockfd, void *buf, size_t len, int32_t flags) - { - return do_recv(sockfd, buf, len, flags); --- -2.23.0 - diff --git a/0113-optimized-some-function-in-lstack.patch b/0113-optimized-some-function-in-lstack.patch deleted file mode 100644 index 9614877..0000000 --- a/0113-optimized-some-function-in-lstack.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 3ac0281accfc1cbaa0fa70ef8be7f706e56efe8f Mon Sep 17 00:00:00 2001 -From: kircher -Date: Fri, 28 Oct 2022 22:20:35 +0800 -Subject: [PATCH 2/7] optimized some function in lstack - ---- - src/lstack/core/lstack_protocol_stack.c | 5 +-- - src/lstack/core/lstack_thread_rpc.c | 4 +-- - src/lstack/include/lstack_ethdev.h | 3 +- - src/lstack/netif/lstack_ethdev.c | 43 ++++++++++++++++++++++--- - 4 files changed, 45 insertions(+), 10 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 79769f3..41dda89 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -419,6 +419,7 @@ static void wakeup_kernel_event(struct protocol_stack *stack) - static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -+ bool use_ltran_flag = use_ltran(); - - struct protocol_stack *stack = stack_thread_init(queue_id); - if (stack == NULL) { -@@ -435,7 +436,7 @@ static void* gazelle_stack_thread(void *arg) - for (;;) { - poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); - -- eth_dev_poll(); -+ gazelle_eth_dev_poll(stack, use_ltran_flag); - - read_recv_list(stack, READ_LIST_MAX); - -@@ -523,7 +524,7 @@ void stack_arp(struct rpc_msg *msg) - { - struct rte_mbuf *mbuf = (struct rte_mbuf *)msg->args[MSG_ARG_0].p; - -- eth_dev_recv(mbuf); -+ eth_dev_recv(mbuf, NULL); - } - - void stack_socket(struct rpc_msg *msg) -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 46cbbe7..db1de5a 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -108,11 +108,9 @@ static inline __attribute__((always_inline)) int32_t rpc_sync_call(lockless_queu - - void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num) - { -- uint32_t num; - struct rpc_msg *msg = NULL; - -- num = 0; -- while (num++ < max_num) { -+ while (max_num--) { - lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue); - if (node == NULL) { - break; -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index 91f5f13..a174978 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -22,6 +22,7 @@ struct eth_dev_ops { - - int32_t ethdev_init(struct protocol_stack *stack); - int32_t eth_dev_poll(void); --void eth_dev_recv(struct rte_mbuf *mbuf); -+int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag); -+void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack); - - #endif /* __GAZELLE_ETHDEV_H__ */ -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 4757d72..5ddc0db 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -31,7 +31,7 @@ - - #define PKTMBUF_MALLOC_FLAG NULL - --void eth_dev_recv(struct rte_mbuf *mbuf) -+void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - { - int32_t ret; - void *payload = NULL; -@@ -39,7 +39,9 @@ void eth_dev_recv(struct rte_mbuf *mbuf) - struct pbuf *prev = NULL; - struct pbuf *head = NULL; - struct pbuf_custom *pc = NULL; -- struct protocol_stack *stack = get_protocol_stack(); -+ if (!stack) { -+ stack = get_protocol_stack(); -+ } - struct rte_mbuf *m = mbuf; - uint16_t len, pkt_len; - -@@ -88,7 +90,7 @@ int32_t eth_dev_poll(void) - - nr_pkts = stack->dev_ops->rx_poll(stack, pkts, READ_PKTS_MAX); - if (nr_pkts == 0) { -- return nr_pkts; -+ return 0; - } - - if (!use_ltran() && get_protocol_stack_group()->latency_start) { -@@ -105,7 +107,40 @@ int32_t eth_dev_poll(void) - } - } - -- eth_dev_recv(pkts[i]); -+ eth_dev_recv(pkts[i], stack); -+ } -+ -+ stack->stats.rx += nr_pkts; -+ -+ return nr_pkts; -+} -+ -+/* optimized eth_dev_poll() in lstack */ -+int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag) -+{ -+ uint32_t nr_pkts; -+ struct rte_mbuf *pkts[READ_PKTS_MAX]; -+ -+ nr_pkts = stack->dev_ops->rx_poll(stack, pkts, READ_PKTS_MAX); -+ if (nr_pkts == 0) { -+ return 0; -+ } -+ -+ if (!use_ltran_flag && get_protocol_stack_group()->latency_start) { -+ uint64_t time_stamp = get_current_time(); -+ time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); -+ } -+ -+ for (uint32_t i = 0; i < nr_pkts; i++) { -+ /* copy arp into other stack */ -+ if (!use_ltran_flag) { -+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(pkts[i], struct rte_ether_hdr *); -+ if (unlikely(RTE_BE16(RTE_ETHER_TYPE_ARP) == ethh->ether_type)) { -+ stack_broadcast_arp(pkts[i], stack); -+ } -+ } -+ -+ eth_dev_recv(pkts[i], stack); - } - - stack->stats.rx += nr_pkts; --- -2.23.0 - diff --git a/0114-fix-gazellectl-stats-err-when-donot-bind-numa.patch b/0114-fix-gazellectl-stats-err-when-donot-bind-numa.patch deleted file mode 100644 index b8045c2..0000000 --- a/0114-fix-gazellectl-stats-err-when-donot-bind-numa.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 12f35b035e84c5085869ae3057733638452dcf7a Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 31 Oct 2022 17:23:49 +0800 -Subject: [PATCH 3/7] fix gazellectl stats err when donot bind numa - ---- - src/lstack/api/lstack_epoll.c | 17 +++++++++++------ - 1 file changed, 11 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 417d69c..6ac049c 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -172,8 +172,11 @@ int32_t lstack_do_epoll_create(int32_t fd) - wakeup->epollfd = fd; - sock->wakeup = wakeup; - -- update_epoll_max_stack(wakeup); -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ if (!get_global_cfg_params()->app_bind_numa) { -+ update_epoll_max_stack(wakeup); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ wakeup->bind_stack = wakeup->max_stack; -+ } - - return fd; - } -@@ -505,10 +508,12 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - list_add_node(&stack_group->poll_list, &wakeup->poll_list); - pthread_spin_unlock(&stack_group->poll_list_lock); - -- int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -- uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -- wakeup->bind_stack = stack_group->stacks[bind_id]; -+ if (!get_global_cfg_params()->app_bind_numa) { -+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; -+ } - - return 0; - } --- -2.23.0 - diff --git a/0115-add-usleep-when-write_ring-is-busy.patch b/0115-add-usleep-when-write_ring-is-busy.patch deleted file mode 100644 index 9fac194..0000000 --- a/0115-add-usleep-when-write_ring-is-busy.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 701e207702945705c0f8a94babf09d1fe8c2b3da Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 31 Oct 2022 17:37:08 +0800 -Subject: [PATCH 4/7] add usleep when write_ring is busy - ---- - src/lstack/core/lstack_lwip.c | 11 +++++------ - 1 file changed, 5 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 00afc75..3a1eb81 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -282,16 +282,11 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - GAZELLE_RETURN(ENOTCONN); - } - -- uint32_t free_count = gazelle_ring_readable_count(sock->send_ring); -- if (free_count == 0) { -- return 0; -- } -- - struct pbuf *pbuf = NULL; - ssize_t send_len = 0; - uint32_t send_pkt = 0; - -- while (send_len < len && send_pkt < free_count) { -+ while (send_len < len) { - if (sock->send_lastdata) { - pbuf = sock->send_lastdata; - } else { -@@ -322,6 +317,10 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - sock->wakeup->stat.app_write_cnt += send_pkt; - } - -+ if (send_len == 0) { -+ /* 100: give up cpu to other threads, when send_ring is full */ -+ usleep(100); -+ } - return send_len; - } - --- -2.23.0 - diff --git a/0116-optimize-variable-access.patch b/0116-optimize-variable-access.patch deleted file mode 100644 index 5381216..0000000 --- a/0116-optimize-variable-access.patch +++ /dev/null @@ -1,432 +0,0 @@ -From ac2c6340d9e08b94bf99682e12ab5d5836d2140d Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 31 Oct 2022 22:07:26 +0800 -Subject: [PATCH 5/7] optimize variable access - ---- - src/common/gazelle_opt.h | 1 + - src/lstack/api/lstack_wrap.c | 8 +- - src/lstack/core/lstack_lwip.c | 102 +++++++++------------ - src/lstack/core/lstack_protocol_stack.c | 24 +++-- - src/lstack/core/lstack_thread_rpc.c | 2 + - src/lstack/include/lstack_protocol_stack.h | 1 + - src/lstack/netif/lstack_ethdev.c | 5 +- - src/lstack/netif/lstack_vdev.c | 7 +- - 8 files changed, 67 insertions(+), 83 deletions(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 011553c..8ab40ed 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -31,6 +31,7 @@ - #define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2) - - #define DEFAULT_RING_SIZE (512) -+#define DEFAULT_RING_MASK (511) - #define DEFAULT_BACKUP_RING_SIZE_FACTOR (16) - - #define VDEV_RX_QUEUE_SZ DEFAULT_RING_SIZE -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 9672d3d..1c7a722 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -46,6 +46,10 @@ bool select_thread_path(void); - - static enum KERNEL_LWIP_PATH select_path(int fd) - { -+ if (!select_thread_path()) { -+ return PATH_KERNEL; -+ } -+ - if (unlikely(posix_api == NULL)) { - /* posix api maybe call before gazelle init */ - if (posix_api_init() != 0) { -@@ -54,10 +58,6 @@ static enum KERNEL_LWIP_PATH select_path(int fd) - return PATH_KERNEL; - } - -- if (!select_thread_path()) { -- return PATH_KERNEL; -- } -- - if (unlikely(posix_api->ues_posix)) { - return PATH_KERNEL; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 3a1eb81..f924ee7 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -37,8 +37,6 @@ - #define HALF_DIVISOR (2) - #define USED_IDLE_WATERMARK (VDEV_IDLE_QUEUE_SZ >> 2) - --static int32_t lwip_alloc_pbufs(pbuf_layer layer, uint16_t length, pbuf_type type, void **pbufs, uint32_t num); -- - static void free_ring_pbuf(struct rte_ring *ring) - { - void *pbufs[SOCK_RECV_RING_SIZE]; -@@ -85,17 +83,38 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->recv_lastdata = NULL; - } - --static void replenish_send_idlembuf(struct rte_ring *ring) -+static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, uint16_t length, pbuf_type type) -+{ -+ struct pbuf_custom *pbuf_custom = mbuf_to_pbuf(mbuf); -+ pbuf_custom->custom_free_function = gazelle_free_pbuf; -+ -+ void *data = rte_pktmbuf_mtod(mbuf, void *); -+ struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); -+ if (pbuf) { -+ pbuf->ol_flags = 0; -+ pbuf->l2_len = 0; -+ pbuf->l3_len = 0; -+ } -+ -+ return pbuf; -+} -+ -+static void replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring) - { - void *pbuf[SOCK_SEND_RING_SIZE]; - - uint32_t replenish_cnt = gazelle_ring_free_count(ring); - - uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); -- if (lwip_alloc_pbufs(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM, (void **)pbuf, alloc_num) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { -+ stack->stats.tx_allocmbuf_fail++; - return; - } - -+ for (uint32_t i = 0; i < alloc_num; i++) { -+ pbuf[i] = init_mbuf_to_pbuf(pbuf[i], PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); -+ } -+ - uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, alloc_num); - for (uint32_t i = num; i < alloc_num; i++) { - pbuf_free(pbuf[i]); -@@ -126,7 +145,7 @@ void gazelle_init_sock(int32_t fd) - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -- replenish_send_idlembuf(sock->send_ring); -+ replenish_send_idlembuf(stack, sock->send_ring); - - sock->stack = stack; - sock->stack->conn_num++; -@@ -183,46 +202,17 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - return 0; - } - --static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, uint16_t length, pbuf_type type) --{ -- struct pbuf_custom *pbuf_custom = mbuf_to_pbuf(mbuf); -- pbuf_custom->custom_free_function = gazelle_free_pbuf; -- -- void *data = rte_pktmbuf_mtod(mbuf, void *); -- struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ); -- if (pbuf) { -- pbuf->ol_flags = 0; -- pbuf->l2_len = 0; -- pbuf->l3_len = 0; -- } -- -- return pbuf; --} -- --static int32_t lwip_alloc_pbufs(pbuf_layer layer, uint16_t length, pbuf_type type, void **bufs, uint32_t num) --{ -- int32_t ret = rte_pktmbuf_alloc_bulk(get_protocol_stack()->tx_pktmbuf_pool, (struct rte_mbuf **)bufs, num); -- if (ret != 0) { -- get_protocol_stack()->stats.tx_allocmbuf_fail++; -- return -1; -- } -- -- for (uint32_t i = 0; i < num; i++) { -- bufs[i] = init_mbuf_to_pbuf(bufs[i], layer, length, type); -- } -- -- return 0; --} -- - struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) - { -- struct pbuf *pbuf; -+ struct rte_mbuf *mbuf; -+ struct protocol_stack *stack = get_protocol_stack(); - -- if (lwip_alloc_pbufs(layer, length, type, (void **)&pbuf, 1) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, &mbuf, 1) != 0) { -+ stack->stats.tx_allocmbuf_fail++; - return NULL; - } - -- return pbuf; -+ return init_mbuf_to_pbuf(mbuf, layer, length, type); - } - - struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags) -@@ -324,7 +314,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - return send_len; - } - --static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) -+static void do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock, int32_t flags) - { - /* send all send_ring, so len set lwip send max. */ - ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -@@ -335,7 +325,7 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags) - } - - if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -- replenish_send_idlembuf(sock->send_ring); -+ replenish_send_idlembuf(stack, sock->send_ring); - } - - if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -@@ -347,8 +337,7 @@ void stack_send(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; - int32_t flags = msg->args[MSG_ARG_2].i; -- -- struct protocol_stack *stack = get_protocol_stack(); -+ struct protocol_stack *stack = (struct protocol_stack *)msg->args[MSG_ARG_3].p; - - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL) { -@@ -363,7 +352,7 @@ void stack_send(struct rpc_msg *msg) - return; - } - -- do_lwip_send(fd, sock, flags); -+ do_lwip_send(stack, fd, sock, flags); - - /* have remain data add sendlist */ - if (NETCONN_IS_DATAOUT(sock)) { -@@ -392,7 +381,7 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - continue; - } - -- do_lwip_send(sock->conn->socket, sock, 0); -+ do_lwip_send(stack, sock->conn->socket, sock, 0); - - if (!NETCONN_IS_DATAOUT(sock)) { - list_del_node_null(&sock->send_list); -@@ -542,11 +531,7 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - return 0; - } - -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -- -+ struct lwip_sock *sock = get_socket_by_fd(fd); - ssize_t send = write_stack_data(sock, buf, len); - if (send <= 0) { - return send; -@@ -562,11 +547,7 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - int32_t ret; - int32_t i; - ssize_t buflen = 0; -- -- struct lwip_sock *sock = get_socket(s); -- if (sock == NULL) { -- GAZELLE_RETURN(EINVAL); -- } -+ struct lwip_sock *sock = get_socket_by_fd(s); - - if (check_msg_vaild(message)) { - GAZELLE_RETURN(EINVAL); -@@ -635,17 +616,16 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - struct pbuf *pbuf = NULL; - ssize_t recvd = 0; - uint16_t copy_len; -- -- struct lwip_sock *sock = get_socket(fd); -- if (sock == NULL) { -- LSTACK_LOG(ERR, LSTACK, "get_socket null fd %d.\n", fd); -- GAZELLE_RETURN(EINVAL); -- } -+ struct lwip_sock *sock = get_socket_by_fd(fd); - - if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) { - return 0; - } - -+ if (recv_left > UINT16_MAX) { -+ recv_left = UINT16_MAX; -+ } -+ - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 41dda89..2759d7d 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -36,9 +36,9 @@ - #include "posix/lstack_epoll.h" - #include "lstack_stack_stat.h" - --#define READ_LIST_MAX 128 --#define SEND_LIST_MAX 128 --#define HANDLE_RPC_MSG_MAX 128 -+#define READ_LIST_MAX 32 -+#define SEND_LIST_MAX 32 -+#define HANDLE_RPC_MSG_MAX 32 - #define KERNEL_EVENT_100us 100 - - static PER_THREAD struct protocol_stack *g_stack_p = NULL; -@@ -164,7 +164,7 @@ void low_power_idling(struct protocol_stack *stack) - last_cycle_ts = sys_now(); - } - -- uint64_t now_pkts = get_protocol_stack()->stats.rx; -+ uint64_t now_pkts = stack->stats.rx; - uint32_t now_ts = sys_now(); - if (((now_ts - last_cycle_ts) > LSTACK_LPM_DETECT_MS) || - ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) { -@@ -258,7 +258,9 @@ static void* gazelle_kernelevent_thread(void *arg) - uint16_t queue_id = *(uint16_t *)arg; - struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - -- bind_to_stack_numa(stack); -+ if (get_global_cfg_params()->app_bind_numa) { -+ bind_to_stack_numa(stack); -+ } - - LSTACK_LOG(INFO, LSTACK, "kernelevent_%02hu start\n", queue_id); - -@@ -420,6 +422,7 @@ static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; - bool use_ltran_flag = use_ltran(); -+ uint32_t wakeup_tick = 0; - - struct protocol_stack *stack = stack_thread_init(queue_id); - if (stack == NULL) { -@@ -442,9 +445,11 @@ static void* gazelle_stack_thread(void *arg) - - send_stack_list(stack, SEND_LIST_MAX); - -- wakeup_kernel_event(stack); -- -- wakeup_stack_epoll(stack); -+ if ((wakeup_tick & 0xf) == 0) { -+ wakeup_kernel_event(stack); -+ wakeup_stack_epoll(stack); -+ } -+ wakeup_tick++; - - sys_timer_run(); - -@@ -523,8 +528,9 @@ int32_t init_protocol_stack(void) - void stack_arp(struct rpc_msg *msg) - { - struct rte_mbuf *mbuf = (struct rte_mbuf *)msg->args[MSG_ARG_0].p; -+ struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_1].p; - -- eth_dev_recv(mbuf, NULL); -+ eth_dev_recv(mbuf, stack); - } - - void stack_socket(struct rpc_msg *msg) -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index db1de5a..295baf3 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -234,6 +234,7 @@ int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf) - - msg->self_release = 0; - msg->args[MSG_ARG_0].p = mbuf; -+ msg->args[MSG_ARG_1].p = stack; - - rpc_call(&stack->rpc_queue, msg); - -@@ -451,6 +452,7 @@ int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - msg->args[MSG_ARG_0].i = fd; - msg->args[MSG_ARG_1].size = len; - msg->args[MSG_ARG_2].i = flags; -+ msg->args[MSG_ARG_3].p = stack; - msg->self_release = 0; - - rpc_call(&stack->rpc_queue, msg); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index cc2cfb9..fed1882 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -49,6 +49,7 @@ struct protocol_stack { - struct rte_ring *reg_ring; - struct rte_ring *wakeup_ring; - struct reg_ring_msg *reg_buf; -+ uint32_t reg_head; - - volatile bool low_power; - lockless_queue rpc_queue __rte_cache_aligned; -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 5ddc0db..3abed5e 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -39,9 +39,6 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - struct pbuf *prev = NULL; - struct pbuf *head = NULL; - struct pbuf_custom *pc = NULL; -- if (!stack) { -- stack = get_protocol_stack(); -- } - struct rte_mbuf *m = mbuf; - uint16_t len, pkt_len; - -@@ -81,7 +78,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - } - } - --#define READ_PKTS_MAX 128 -+#define READ_PKTS_MAX 32 - int32_t eth_dev_poll(void) - { - uint32_t nr_pkts; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index f9fa5a3..1c148e1 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -113,7 +113,6 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - uint32_t sent_pkts = 0; - void *free_buf[VDEV_REG_QUEUE_SZ]; - struct reg_ring_msg *tmp_buf = NULL; -- static PER_THREAD uint32_t head = 0; - const uint32_t tbegin = sys_now(); - struct protocol_stack *stack = get_protocol_stack(); - -@@ -124,6 +123,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - } - } - -+ uint32_t reg_index = stack->reg_head++ & DEFAULT_RING_MASK; - do { - (void)gazelle_ring_sc_dequeue(stack->reg_ring, free_buf, VDEV_REG_QUEUE_SZ); - -@@ -131,7 +131,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - continue; - } - -- tmp_buf = &stack->reg_buf[head]; -+ tmp_buf = &stack->reg_buf[reg_index]; - tmp_buf->type = type; - tmp_buf->tid = get_stack_tid(); - ret = memcpy_s(&tmp_buf->qtuple, sizeof(*qtuple), qtuple, sizeof(struct gazelle_quintuple)); -@@ -144,9 +144,6 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - sent_pkts = gazelle_ring_sp_enqueue(stack->reg_ring, free_buf, 1); - } while ((sent_pkts < 1) && (ENQUEUE_RING_RETRY_TIMEOUT > sys_now() - tbegin) && get_register_state()); - -- if (sent_pkts == 1) { -- head = (head + 1) % VDEV_REG_QUEUE_SZ; -- } - return (int32_t)sent_pkts; - } - --- -2.23.0 - diff --git a/0117-add-gro.patch b/0117-add-gro.patch deleted file mode 100644 index d8d02aa..0000000 --- a/0117-add-gro.patch +++ /dev/null @@ -1,133 +0,0 @@ -From b485a70ba6a68f10e4958843648400d3caaa4837 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 1 Nov 2022 10:51:13 +0800 -Subject: [PATCH 6/7] add gro - ---- - src/lstack/Makefile | 1 + - src/lstack/core/lstack_lwip.c | 10 ++++++---- - src/lstack/netif/lstack_ethdev.c | 5 ++++- - src/lstack/netif/lstack_vdev.c | 23 ++++++++++++++++++++++- - 4 files changed, 33 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index 7ce35d4..cb7be16 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -65,6 +65,7 @@ LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.so \ - $(LIB_PATH)/librte_mempool_ring.so \ - $(LIB_PATH)/librte_timer.so \ - $(LIB_PATH)/librte_eal.so \ -+ $(LIB_PATH)/librte_gro.so \ - $(LIB_PATH)/librte_ring.so \ - $(LIB_PATH)/librte_mbuf.so \ - $(LIB_PATH)/librte_telemetry.so \ -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index f924ee7..52b4624 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -596,17 +596,19 @@ static inline void del_data_in_event(struct lwip_sock *sock) - - static struct pbuf *pbuf_free_partial(struct pbuf *pbuf, uint16_t free_len) - { -+ uint16_t tot_len = pbuf->tot_len - free_len; -+ - while (free_len && pbuf) { - if (free_len >= pbuf->len) { -- struct pbuf *p = pbuf; -+ free_len = free_len - pbuf->len; - pbuf = pbuf->next; -- free_len = free_len - p->len; - } else { - pbuf_remove_header(pbuf, free_len); - break; - } - } - -+ pbuf->tot_len = tot_len; - return pbuf; - } - -@@ -636,13 +638,13 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -- copy_len = (recv_left > pbuf->len) ? pbuf->len : (uint16_t)recv_left; -+ copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : (uint16_t)recv_left; - pbuf_copy_partial(pbuf, (char *)buf + recvd, copy_len, 0); - - recvd += copy_len; - recv_left -= copy_len; - -- if (pbuf->len > copy_len || pbuf->next) { -+ if (pbuf->tot_len > copy_len) { - sock->recv_lastdata = pbuf_free_partial(pbuf, copy_len); - } else { - if (sock->wakeup) { -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 3abed5e..1c35919 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -41,6 +41,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - struct pbuf_custom *pc = NULL; - struct rte_mbuf *m = mbuf; - uint16_t len, pkt_len; -+ struct rte_mbuf *next_m = NULL; - - pkt_len = (uint16_t)rte_pktmbuf_pkt_len(m); - while (m != NULL) { -@@ -66,7 +67,9 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - } - prev = next; - -- m = m->next; -+ next_m = m->next; -+ m->next = NULL; -+ m = next_m; - } - - if (head != NULL) { -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 1c148e1..8df0c5e 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -18,6 +18,8 @@ - #include - #include - #include -+#include -+#include - - #include "lstack_cfg.h" - #include "lstack_dpdk.h" -@@ -63,7 +65,26 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk - - static uint32_t vdev_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t max_mbuf) - { -- return rte_eth_rx_burst(stack->port_id, stack->queue_id, pkts, max_mbuf); -+ struct rte_gro_param gro_param = { -+ .gro_types = RTE_GRO_TCP_IPV4, -+ /* 8*16=128(max) */ -+ .max_flow_num = 8, -+ .max_item_per_flow = 16, -+ }; -+ -+ uint32_t pkt_num = rte_eth_rx_burst(stack->port_id, stack->queue_id, pkts, max_mbuf); -+ if (pkt_num <= 1) { -+ return pkt_num; -+ } -+ -+ for (uint32_t i = 0; i < pkt_num; i++) { -+ struct rte_net_hdr_lens hdr_lens; -+ pkts[i]->packet_type = rte_net_get_ptype(pkts[i], &hdr_lens, RTE_PTYPE_ALL_MASK); -+ pkts[i]->l2_len = hdr_lens.l2_len; -+ pkts[i]->l3_len = hdr_lens.l3_len; -+ pkts[i]->l4_len = hdr_lens.l4_len; -+ } -+ return rte_gro_reassemble_burst(pkts, pkt_num, &gro_param); - } - - static uint32_t ltran_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts) --- -2.23.0 - diff --git a/0118-expand-nic-rx-desc-size.patch b/0118-expand-nic-rx-desc-size.patch deleted file mode 100644 index 6ef3667..0000000 --- a/0118-expand-nic-rx-desc-size.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 6ccad03ae3ec736034e4ff403c9d2ef26516ef4a Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 1 Nov 2022 11:42:33 +0800 -Subject: [PATCH 7/7] expand nic rx desc size - ---- - src/common/gazelle_opt.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 8ab40ed..7521e8c 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -45,7 +45,7 @@ - #define FREE_RX_QUEUE_SZ DPDK_PKT_BURST_SIZE - - #define RTE_TEST_TX_DESC_DEFAULT 512 --#define RTE_TEST_RX_DESC_DEFAULT 128 -+#define RTE_TEST_RX_DESC_DEFAULT 4096 - - #define DPDK_PKT_BURST_SIZE 512 - --- -2.23.0 - diff --git a/0119-add-kni-local-support-in-lstack.patch b/0119-add-kni-local-support-in-lstack.patch deleted file mode 100644 index 3fd4d3e..0000000 --- a/0119-add-kni-local-support-in-lstack.patch +++ /dev/null @@ -1,85 +0,0 @@ -From d09e1b2a18c59ae9692d678004f9612f9e990e35 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sat, 5 Nov 2022 15:00:44 +0800 -Subject: [PATCH] add kni support in lstack - ---- - src/lstack/api/lstack_wrap.c | 6 +++++- - src/lstack/core/lstack_dpdk.c | 6 ++++++ - src/lstack/core/lstack_protocol_stack.c | 8 ++++++++ - 3 files changed, 19 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 1c7a722..1a654e9 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -36,6 +36,10 @@ - #include "gazelle_base_func.h" - #include "lstack_thread_rpc.h" - -+#ifndef SOCK_TYPE_MASK -+#define SOCK_TYPE_MASK 0xf -+#endif -+ - enum KERNEL_LWIP_PATH { - PATH_KERNEL = 0, - PATH_LWIP, -@@ -293,7 +297,7 @@ static inline int32_t do_setsockopt(int32_t s, int32_t level, int32_t optname, c - static inline int32_t do_socket(int32_t domain, int32_t type, int32_t protocol) - { - if ((domain != AF_INET && domain != AF_UNSPEC) -- || posix_api->ues_posix) { -+ || posix_api->ues_posix || ((type & SOCK_TYPE_MASK) & ~SOCK_STREAM)) { - return posix_api->socket_fn(domain, type, protocol); - } - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 39f8ecf..c63fbaa 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -520,10 +520,16 @@ static void set_kni_ip_mac(uint16_t port_id) - if (strcpy_s(set_ifr.ifr_name, sizeof(set_ifr.ifr_name), GAZELLE_KNI_NAME) != 0) { - LSTACK_LOG(ERR, LSTACK, "strcpy_s fail \n"); - } -+ - if (posix_api->ioctl_fn(fd, SIOCSIFADDR, &set_ifr) < 0) { - LSTACK_LOG(ERR, LSTACK, "set kni ip=%u fail\n", cfg->host_addr.addr); - } - -+ sin->sin_addr.s_addr = cfg->netmask.addr; -+ if (posix_api->ioctl_fn(fd, SIOCSIFNETMASK, &set_ifr) < 0) { -+ LSTACK_LOG(ERR, LSTACK, "set kni netmask=%u fail\n", cfg->netmask.addr); -+ } -+ - posix_api->close_fn(fd); - } - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 2759d7d..3daa09f 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -422,6 +422,7 @@ static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; - bool use_ltran_flag = use_ltran(); -+ bool kni_switch = get_global_cfg_params()->kni_switch; - uint32_t wakeup_tick = 0; - - struct protocol_stack *stack = stack_thread_init(queue_id); -@@ -449,6 +450,13 @@ static void* gazelle_stack_thread(void *arg) - wakeup_kernel_event(stack); - wakeup_stack_epoll(stack); - } -+ -+ /* KNI requests are generally low-rate I/Os, -+ * so processing KNI requests only in the thread with queue_id No.0 is sufficient. */ -+ if (kni_switch && !queue_id && !(wakeup_tick & 0xfff)) { -+ rte_kni_handle_request(get_gazelle_kni()); -+ } -+ - wakeup_tick++; - - sys_timer_run(); --- -2.33.0 - diff --git a/0120-resolve-the-conflict-between-the-eth_dev_ops-variabl.patch b/0120-resolve-the-conflict-between-the-eth_dev_ops-variabl.patch deleted file mode 100644 index e1f0c2c..0000000 --- a/0120-resolve-the-conflict-between-the-eth_dev_ops-variabl.patch +++ /dev/null @@ -1,174 +0,0 @@ -From af42b7871afc5ad80b5b2db5341a852218de0e1e Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 7 Nov 2022 15:15:52 +0800 -Subject: [PATCH] resolve the conflict between the eth_dev_ops variable and the - dpdk-19.11 - ---- - src/common/dpdk_common.h | 2 +- - src/lstack/core/lstack_lwip.c | 3 ++- - src/lstack/include/lstack_ethdev.h | 2 +- - src/lstack/include/lstack_protocol_stack.h | 3 ++- - src/lstack/include/lstack_vdev.h | 6 ++++-- - src/lstack/netif/lstack_ethdev.c | 8 +++----- - src/lstack/netif/lstack_vdev.c | 18 +++++------------- - 7 files changed, 18 insertions(+), 24 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index c2cbda7..753c168 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -135,7 +135,7 @@ static __rte_always_inline uint32_t gazelle_light_ring_dequeue_burst(struct rte_ - cons.tail prod.tail prod.head cons.head - gazelle_ring_sp_enqueue: cons.head-->> cons.tal, enqueue object - gazelle_ring_sc_dequeue: cons.tal -->> prod.tail, dequeue object -- gazelle_ring_read: prod.tail-->> cons.head, read object, prod.head = prod.tail + N -+ gazelle_ring_read: prod.head-->> cons.head, read object, prod.head = prod.tail + N - gazelle_ring_read_over: prod.tail = prod.head, update prod.tail - */ - static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, void **obj_table, uint32_t n) -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 52b4624..0437187 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -619,6 +619,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - ssize_t recvd = 0; - uint16_t copy_len; - struct lwip_sock *sock = get_socket_by_fd(fd); -+ bool latency_enable = get_protocol_stack_group()->latency_start; - - if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) { - return 0; -@@ -650,7 +651,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - if (sock->wakeup) { - sock->wakeup->stat.app_read_cnt += 1; - } -- if (get_protocol_stack_group()->latency_start) { -+ if (latency_enable) { - calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_READ); - } - gazelle_ring_read_over(sock->recv_ring); -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index a174978..c64b4a0 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -15,7 +15,7 @@ - - struct protocol_stack; - struct rte_mbuf; --struct eth_dev_ops { -+struct lstack_dev_ops { - uint32_t (*rx_poll)(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t max_mbuf); - uint32_t (*tx_xmit)(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts); - }; -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index fed1882..2d9053a 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -21,6 +21,7 @@ - - #include "gazelle_dfx_msg.h" - #include "lstack_lockless_queue.h" -+#include "lstack_ethdev.h" - #include "gazelle_opt.h" - - #define SOCK_RECV_RING_SIZE (128) -@@ -61,7 +62,7 @@ struct protocol_stack { - char pad1 __rte_cache_aligned; - - struct netif netif; -- struct eth_dev_ops *dev_ops; -+ struct lstack_dev_ops dev_ops; - uint32_t rx_ring_used; - uint32_t tx_ring_used; - -diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h -index 5836257..0693c4d 100644 ---- a/src/lstack/include/lstack_vdev.h -+++ b/src/lstack/include/lstack_vdev.h -@@ -13,10 +13,12 @@ - #ifndef _GAZELLE_VDEV_H_ - #define _GAZELLE_VDEV_H_ - --struct eth_dev_ops; -+#include -+ -+struct lstack_dev_ops; - struct gazelle_quintuple; - enum reg_ring_type; --void vdev_dev_ops_init(struct eth_dev_ops **dev_ops); -+void vdev_dev_ops_init(struct lstack_dev_ops *dev_ops); - int vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple); - - #endif /* _GAZELLE_VDEV_H_ */ -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 1c35919..d410a5c 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -88,7 +88,7 @@ int32_t eth_dev_poll(void) - struct rte_mbuf *pkts[READ_PKTS_MAX]; - struct protocol_stack *stack = get_protocol_stack(); - -- nr_pkts = stack->dev_ops->rx_poll(stack, pkts, READ_PKTS_MAX); -+ nr_pkts = stack->dev_ops.rx_poll(stack, pkts, READ_PKTS_MAX); - if (nr_pkts == 0) { - return 0; - } -@@ -121,7 +121,7 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag) - uint32_t nr_pkts; - struct rte_mbuf *pkts[READ_PKTS_MAX]; - -- nr_pkts = stack->dev_ops->rx_poll(stack, pkts, READ_PKTS_MAX); -+ nr_pkts = stack->dev_ops.rx_poll(stack, pkts, READ_PKTS_MAX); - if (nr_pkts == 0) { - return 0; - } -@@ -161,13 +161,11 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - mbuf->data_len = pbuf->len; - mbuf->pkt_len = pbuf->tot_len; - rte_mbuf_refcnt_update(mbuf, 1); --#if CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW - mbuf->ol_flags = pbuf->ol_flags; - mbuf->l2_len = pbuf->l2_len; - mbuf->l3_len = pbuf->l3_len; --#endif - -- uint32_t sent_pkts = stack->dev_ops->tx_xmit(stack, &mbuf, 1); -+ uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &mbuf, 1); - stack->stats.tx += sent_pkts; - if (sent_pkts < 1) { - stack->stats.tx_drop++; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 8df0c5e..e2671b4 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -168,21 +168,13 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) - return (int32_t)sent_pkts; - } - --static struct eth_dev_ops g_eth_dev_ops = { -- .rx_poll = vdev_rx_poll, -- .tx_xmit = vdev_tx_xmit, --}; -- --static struct eth_dev_ops g_ltran_eth_dev_ops = { -- .rx_poll = ltran_rx_poll, -- .tx_xmit = ltran_tx_xmit, --}; -- --void vdev_dev_ops_init(struct eth_dev_ops **dev_ops) -+void vdev_dev_ops_init(struct lstack_dev_ops *dev_ops) - { - if (use_ltran()) { -- *dev_ops = &g_ltran_eth_dev_ops; -+ dev_ops->rx_poll = ltran_rx_poll; -+ dev_ops->tx_xmit = ltran_tx_xmit; - } else { -- *dev_ops = &g_eth_dev_ops; -+ dev_ops->rx_poll = vdev_rx_poll; -+ dev_ops->tx_xmit = vdev_tx_xmit; - } - } --- -2.23.0 - diff --git a/0121-add-pdump-support-in-lstack.patch b/0121-add-pdump-support-in-lstack.patch deleted file mode 100644 index 39da366..0000000 --- a/0121-add-pdump-support-in-lstack.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 421ecec20e2dadf33941ab1b42c2eb592845ff21 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Mon, 7 Nov 2022 23:06:50 +0800 -Subject: [PATCH] add pdump support in lstack - ---- - src/lstack/api/lstack_epoll.c | 18 +++++++----------- - src/lstack/core/lstack_dpdk.c | 9 +++++++++ - 2 files changed, 16 insertions(+), 11 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 6ac049c..6979e12 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -172,11 +172,9 @@ int32_t lstack_do_epoll_create(int32_t fd) - wakeup->epollfd = fd; - sock->wakeup = wakeup; - -- if (!get_global_cfg_params()->app_bind_numa) { -- update_epoll_max_stack(wakeup); -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -- wakeup->bind_stack = wakeup->max_stack; -- } -+ update_epoll_max_stack(wakeup); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); -+ wakeup->bind_stack = wakeup->max_stack; - - return fd; - } -@@ -508,12 +506,10 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - list_add_node(&stack_group->poll_list, &wakeup->poll_list); - pthread_spin_unlock(&stack_group->poll_list_lock); - -- if (!get_global_cfg_params()->app_bind_numa) { -- int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -- uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -- wakeup->bind_stack = stack_group->stacks[bind_id]; -- } -+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0}; -+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); -+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); -+ wakeup->bind_stack = stack_group->stacks[bind_id]; - - return 0; - } -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index c63fbaa..77ae3eb 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -104,6 +105,14 @@ int32_t dpdk_eal_init(void) - { - int32_t ret; - struct cfg_params *global_params = get_global_cfg_params(); -+ -+ ret = rte_pdump_init(); -+ if (ret < 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "rte_pdump_init failed init, rte_errno %d\n", rte_errno); -+ /* We do not care whether the pdump is successfully loaded. So, just print an alarm. */ -+ } else { -+ LSTACK_PRE_LOG(LSTACK_INFO, "rte_pdump_init success\n"); -+ } - - ret = rte_eal_init(global_params->dpdk_argc, global_params->dpdk_argv); - if (ret < 0) { --- -2.33.0 - diff --git a/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch b/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch deleted file mode 100644 index 9c8ea57..0000000 --- a/0122-fix-uninit-stack-port_id-when-use-mutil-NIC.patch +++ /dev/null @@ -1,46 +0,0 @@ -From a5c1ea6f66d8ae22b411154409c463899b8076c4 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Thu, 10 Nov 2022 10:21:05 +0800 -Subject: [PATCH 07/20] fix uninit stack->port_id when use mutil NIC - ---- - src/lstack/core/lstack_dpdk.c | 10 ++++++++++ - src/lstack/core/lstack_protocol_stack.c | 1 - - 2 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 77ae3eb..e187bca 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -446,6 +446,16 @@ int32_t dpdk_ethdev_init(void) - stack_group->rx_offload = eth_params->conf.rxmode.offloads; - stack_group->tx_offload = eth_params->conf.txmode.offloads; - -+ for (uint32_t i = 0; i < stack_group->stack_num; i++) { -+ struct protocol_stack *stack = stack_group->stacks[i]; -+ if (likely(stack)) { -+ stack->port_id = stack_group->port_id; -+ } else { -+ LSTACK_LOG(ERR, LSTACK, "empty stack at stack_num %d\n", i); -+ return -EINVAL; -+ } -+ } -+ - ret = rte_eth_dev_configure(port_id, nb_queues, nb_queues, ð_params->conf); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "cannot config eth dev at port %d: %s\n", port_id, rte_strerror(-ret)); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 3daa09f..03ed18e 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -280,7 +280,6 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id) - - stack->tid = rte_gettid(); - stack->queue_id = queue_id; -- stack->port_id = stack_group->port_id; - stack->cpu_id = get_global_cfg_params()->cpus[queue_id]; - stack->lwip_stats = &lwip_stats; - --- -2.23.0 - diff --git a/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch b/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch deleted file mode 100644 index ccc4ca3..0000000 --- a/0123-fix-memleak-in-dpdk_ethdev_init-unlikely-path.patch +++ /dev/null @@ -1,25 +0,0 @@ -From b82f1facd8fabf299719705602b0a2e354573af3 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Thu, 10 Nov 2022 17:34:43 +0800 -Subject: [PATCH 09/20] fix memleak in dpdk_ethdev_init unlikely path - ---- - src/lstack/core/lstack_dpdk.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index e187bca..0198655 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -452,6 +452,8 @@ int32_t dpdk_ethdev_init(void) - stack->port_id = stack_group->port_id; - } else { - LSTACK_LOG(ERR, LSTACK, "empty stack at stack_num %d\n", i); -+ stack_group->eth_params = NULL; -+ free(eth_params); - return -EINVAL; - } - } --- -2.23.0 - diff --git a/0124-fix-epoll_wait-return-when-timeout-is-0.patch b/0124-fix-epoll_wait-return-when-timeout-is-0.patch deleted file mode 100644 index a3e63bc..0000000 --- a/0124-fix-epoll_wait-return-when-timeout-is-0.patch +++ /dev/null @@ -1,38 +0,0 @@ -From b37eb61864e0f54aff78ac11d20828cb57278753 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 12 Nov 2022 14:42:56 +0800 -Subject: [PATCH 10/20] fix epoll_wait return when timeout is 0 - ---- - src/lstack/api/lstack_epoll.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 6979e12..20ed224 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -453,6 +453,10 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - return lwip_num + kernel_num; - } - -+ if (timeout == 0) { -+ return 0; -+ } -+ - if (timeout < 0) { - ret = pthread_mutex_lock(&wakeup->wait); - } else { -@@ -654,6 +658,10 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - return lwip_num + kernel_num; - } - -+ if (timeout == 0) { -+ return 0; -+ } -+ - if (timeout < 0) { - ret = pthread_mutex_lock(&wakeup->wait); - } else { --- -2.23.0 - diff --git a/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch b/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch deleted file mode 100644 index 013bd97..0000000 --- a/0125-fix-gazelle-pdump-init-fail-with-dpdk-21.11.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 732557e3671bed8a71153f4d4f81a650d5a2ecb9 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sat, 12 Nov 2022 16:09:49 +0800 -Subject: [PATCH 11/20] fix gazelle pdump init fail with dpdk-21.11 - ---- - src/lstack/core/lstack_dpdk.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 0198655..5dc2e54 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -106,14 +106,6 @@ int32_t dpdk_eal_init(void) - int32_t ret; - struct cfg_params *global_params = get_global_cfg_params(); - -- ret = rte_pdump_init(); -- if (ret < 0) { -- LSTACK_PRE_LOG(LSTACK_ERR, "rte_pdump_init failed init, rte_errno %d\n", rte_errno); -- /* We do not care whether the pdump is successfully loaded. So, just print an alarm. */ -- } else { -- LSTACK_PRE_LOG(LSTACK_INFO, "rte_pdump_init success\n"); -- } -- - ret = rte_eal_init(global_params->dpdk_argc, global_params->dpdk_argv); - if (ret < 0) { - if (rte_errno == EALREADY) { -@@ -127,6 +119,14 @@ int32_t dpdk_eal_init(void) - LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n"); - } - -+ ret = rte_pdump_init(); -+ if (ret < 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "rte_pdump_init failed init, rte_errno %d\n", rte_errno); -+ /* We do not care whether the pdump is successfully loaded. So, just print an alarm. */ -+ } else { -+ LSTACK_PRE_LOG(LSTACK_INFO, "rte_pdump_init success\n"); -+ } -+ - return ret; - } - --- -2.23.0 - diff --git a/0126-fix-add-outdated-event.patch b/0126-fix-add-outdated-event.patch deleted file mode 100644 index 54982b6..0000000 --- a/0126-fix-add-outdated-event.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 9a7cb66fd9912c3073f3299e8db4167b4882c020 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 12 Nov 2022 16:48:50 +0800 -Subject: [PATCH 12/20] fix add outdated event - ---- - src/lstack/api/lstack_epoll.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 20ed224..759b0c0 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -55,6 +55,15 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) - - if (wakeup->type == WAKEUP_EPOLL) { - pthread_spin_lock(&wakeup->event_list_lock); -+ -+ /* app thread have read/write, event is outdated */ -+ if (event == EPOLLIN && sock->conn->state == NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { -+ return; -+ } -+ if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { -+ return; -+ } -+ - sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); - if (list_is_null(&sock->event_list)) { - list_add_node(&wakeup->event_list, &sock->event_list); --- -2.23.0 - diff --git a/0127-revert-write-usleep.patch b/0127-revert-write-usleep.patch deleted file mode 100644 index dd00741..0000000 --- a/0127-revert-write-usleep.patch +++ /dev/null @@ -1,27 +0,0 @@ -From fb2c23cc1be1171a70f650d2de6c7dad7539d2db Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 12 Nov 2022 16:58:10 +0800 -Subject: [PATCH 13/20] revert write usleep - ---- - src/lstack/core/lstack_lwip.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 0437187..087d09b 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -307,10 +307,6 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - sock->wakeup->stat.app_write_cnt += send_pkt; - } - -- if (send_len == 0) { -- /* 100: give up cpu to other threads, when send_ring is full */ -- usleep(100); -- } - return send_len; - } - --- -2.23.0 - diff --git a/0128-reduce-thread-variable-access.patch b/0128-reduce-thread-variable-access.patch deleted file mode 100644 index f93fdfb..0000000 --- a/0128-reduce-thread-variable-access.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 16d35b610e00b18005049d80ad91bedb2ca64501 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 12 Nov 2022 17:24:02 +0800 -Subject: [PATCH 14/20] reduce thread variable access - ---- - src/lstack/api/lstack_epoll.c | 4 ++-- - src/lstack/core/lstack_protocol_stack.c | 8 +++++--- - src/lstack/include/posix/lstack_epoll.h | 2 +- - 3 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 759b0c0..ebad98e 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -77,14 +77,14 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) - } - } - --void wakeup_stack_epoll(struct protocol_stack *stack) -+void wakeup_stack_epoll(struct protocol_stack *stack, bool wakeup_thread_enable) - { - struct list_node *node, *temp; - - list_for_each_safe(node, temp, &stack->wakeup_list) { - struct wakeup_poll *wakeup = container_of((node - stack->queue_id), struct wakeup_poll, wakeup_list); - -- if (!get_protocol_stack_group()->wakeup_enable) { -+ if (!wakeup_thread_enable) { - if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) { - __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); - rte_mb(); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 03ed18e..7a3955d 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -423,17 +423,19 @@ static void* gazelle_stack_thread(void *arg) - bool use_ltran_flag = use_ltran(); - bool kni_switch = get_global_cfg_params()->kni_switch; - uint32_t wakeup_tick = 0; -+ struct protocol_stack_group *stack_group = get_protocol_stack_group(); -+ bool wakeup_thread_enable = stack_group->wakeup_enable; - - struct protocol_stack *stack = stack_thread_init(queue_id); - if (stack == NULL) { - /* exit in main thread, avoid create mempool and exit at the same time */ - set_init_fail(); -- sem_post(&get_protocol_stack_group()->all_init); -+ sem_post(&stack_group->all_init); - LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%hu\n", queue_id); - return NULL; - } - -- sem_post(&get_protocol_stack_group()->all_init); -+ sem_post(&stack_group->all_init); - LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); - - for (;;) { -@@ -447,7 +449,7 @@ static void* gazelle_stack_thread(void *arg) - - if ((wakeup_tick & 0xf) == 0) { - wakeup_kernel_event(stack); -- wakeup_stack_epoll(stack); -+ wakeup_stack_epoll(stack, wakeup_thread_enable); - } - - /* KNI requests are generally low-rate I/Os, -diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h -index d6c81a7..6aa9d30 100644 ---- a/src/lstack/include/posix/lstack_epoll.h -+++ b/src/lstack/include/posix/lstack_epoll.h -@@ -64,7 +64,7 @@ struct wakeup_poll { - struct netconn; - struct lwip_sock; - void add_sock_event(struct lwip_sock *sock, uint32_t event); --void wakeup_stack_epoll(struct protocol_stack *stack); -+void wakeup_stack_epoll(struct protocol_stack *stack, bool wakeup_thread_enable); - int32_t lstack_epoll_create(int32_t size); - int32_t lstack_epoll_create1(int32_t flags); - int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); --- -2.23.0 - diff --git a/0129-add-readv-and-readv-kernel.patch b/0129-add-readv-and-readv-kernel.patch deleted file mode 100644 index 409e1a5..0000000 --- a/0129-add-readv-and-readv-kernel.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 9a07e4017b13fa4e502ea18f16d7e7f4b49e088e Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 12 Nov 2022 09:58:25 +0000 -Subject: [PATCH 15/20] add readv and readv kernel - ---- - src/lstack/api/lstack_wrap.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 1a654e9..d48fee0 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -339,6 +339,10 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len) - - static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt) - { -+ if (select_path(s) != PATH_LWIP) { -+ return posix_api->readv_fn(s, iov, iovcnt); -+ } -+ - struct msghdr msg; - - msg.msg_name = NULL; -@@ -371,6 +375,10 @@ static inline ssize_t do_write(int32_t s, const void *mem, size_t size) - - static inline ssize_t do_writev(int32_t s, const struct iovec *iov, int iovcnt) - { -+ if (select_path(s) != PATH_LWIP) { -+ return posix_api->writev_fn(s, iov, iovcnt); -+ } -+ - struct msghdr msg; - - msg.msg_name = NULL; --- -2.23.0 - diff --git a/0130-add-unlock-before-after.patch b/0130-add-unlock-before-after.patch deleted file mode 100644 index 084baef..0000000 --- a/0130-add-unlock-before-after.patch +++ /dev/null @@ -1,30 +0,0 @@ -From f77823af16f5eff88203a1c183d4bb5c67e3d3b0 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 12 Nov 2022 13:27:36 +0000 -Subject: [PATCH 16/20] add unlock before after - ---- - src/lstack/api/lstack_epoll.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index ebad98e..8d5439b 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -57,10 +57,12 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) - pthread_spin_lock(&wakeup->event_list_lock); - - /* app thread have read/write, event is outdated */ -- if (event == EPOLLIN && sock->conn->state == NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { -+ if (event == EPOLLIN && sock->conn->state != NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { -+ pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { -+ pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - --- -2.23.0 - diff --git a/0131-add-mutil-NIC-support-in-gazelle.patch b/0131-add-mutil-NIC-support-in-gazelle.patch deleted file mode 100644 index 40a5e58..0000000 --- a/0131-add-mutil-NIC-support-in-gazelle.patch +++ /dev/null @@ -1,432 +0,0 @@ -From 29ce2b92248fce0ce90abbcf0625653a5327b232 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sat, 12 Nov 2022 21:12:03 +0800 -Subject: [PATCH 17/20] add mutil NIC support in gazelle - ---- - src/common/gazelle_base_func.h | 2 + - src/common/gazelle_opt.h | 2 + - src/common/gazelle_parse_config.c | 31 +++++++++++ - src/lstack/core/lstack_cfg.c | 46 ++++++++++++++++ - src/lstack/core/lstack_control_plane.c | 17 ++++-- - src/lstack/include/lstack_cfg.h | 1 + - src/ltran/ltran_base.h | 1 + - src/ltran/ltran_dfx.c | 35 +++++++++++- - src/ltran/ltran_param.c | 75 +++++++++++++++++++++++++- - src/ltran/ltran_param.h | 2 + - src/ltran/main.c | 9 ++++ - 11 files changed, 215 insertions(+), 6 deletions(-) - -diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h -index fe3411a..22d7a7f 100644 ---- a/src/common/gazelle_base_func.h -+++ b/src/common/gazelle_base_func.h -@@ -32,6 +32,8 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size); - - int32_t check_and_set_run_dir(void); - -+int32_t filename_check(const char* args); -+ - #undef container_of - #define container_of(ptr, type, field) ((type *)(void*)(((char *)(ptr)) - offsetof(type, field))) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 7521e8c..e9e3676 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -75,6 +75,8 @@ - #define GAZELLE_MAX_STACK_ARRAY_SIZE GAZELLE_CLIENT_NUM - - #define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock" -+#define GAZELLE_REG_SOCK_FILENAME "gazelle_client.sock" -+#define GAZELLE_SOCK_FILENAME_MAXLEN 128 - - #define GAZELLE_RUN_DIR "/var/run/gazelle/" - #define GAZELLE_FILE_PERMISSION 0700 -diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c -index 8556e37..fc286d9 100644 ---- a/src/common/gazelle_parse_config.c -+++ b/src/common/gazelle_parse_config.c -@@ -21,6 +21,16 @@ - #include "gazelle_opt.h" - #include "gazelle_base_func.h" - -+#ifdef LTRAN_COMPILE -+#include "ltran_log.h" -+#define COMMON_ERR(fmt, ...) LTRAN_ERR(fmt, ##__VA_ARGS__) -+#define COMMON_INFO(fmt, ...) LTRAN_INFO(fmt, ##__VA_ARGS__) -+#else -+#include "lstack_log.h" -+#define COMMON_ERR(fmt, ...) LSTACK_LOG(ERR, LSTACK, fmt, ##__VA_ARGS__) -+#define COMMON_INFO(fmt, ...) LSTACK_LOG(INFO, LSTACK, fmt, ##__VA_ARGS__) -+#endif -+ - static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size) - { - const char *delim = "-"; -@@ -87,3 +97,24 @@ int32_t check_and_set_run_dir(void) - } - return 0; - } -+ -+/* return 1 for check error */ -+int32_t filename_check(const char* args) -+{ -+ if (args == NULL) { -+ return 1; -+ } -+ -+ if (strlen(args) <= 0 || strlen(args) > GAZELLE_SOCK_FILENAME_MAXLEN - 1) { -+ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename exceeds the limit %d.\n", args, GAZELLE_SOCK_FILENAME_MAXLEN); -+ return 1; -+ } -+ -+ char* sensitive_chars = strpbrk(args, "|;&$><`\\!\n"); -+ if (sensitive_chars != NULL) { -+ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename contains sensitive characters.\n", args); -+ return 1; -+ } -+ -+ return 0; -+} -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 2cd9989..1ff3794 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -56,6 +56,7 @@ static int32_t parse_gateway_addr(void); - static int32_t parse_kni_switch(void); - static int32_t parse_listen_shadow(void); - static int32_t parse_app_bind_numa(void); -+static int32_t parse_unix_prefix(void); - - struct config_vector_t { - const char *name; -@@ -75,6 +76,7 @@ static struct config_vector_t g_config_tbl[] = { - { "kni_switch", parse_kni_switch }, - { "listen_shadow", parse_listen_shadow }, - { "app_bind_numa", parse_app_bind_numa }, -+ { "unix_prefix", parse_unix_prefix }, - { NULL, NULL } - }; - -@@ -803,3 +805,47 @@ int32_t cfg_init(void) - free(config_file); - return ret; - } -+ -+static int32_t parse_unix_prefix(void) -+{ -+ const config_setting_t *unix_prefix = NULL; -+ const char *args = NULL; -+ int32_t ret = 0; -+ -+ ret = memset_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -+ 0, sizeof(g_config_params.unix_socket_filename)); -+ if (ret != EOK) { -+ return ret; -+ } -+ -+ ret = strncpy_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); -+ if (ret != EOK) { -+ return ret; -+ } -+ -+ unix_prefix = config_lookup(&g_config, "unix_prefix"); -+ -+ if (unix_prefix) { -+ args = config_setting_get_string(unix_prefix); -+ -+ if (filename_check(args)) { -+ return -EINVAL; -+ } -+ -+ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -+ args, strlen(args) + 1); -+ if (ret != EOK) { -+ return ret; -+ } -+ } -+ -+ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -+ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); -+ if (ret != EOK) { -+ return ret; -+ } -+ -+ return 0; -+} -+ -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 7f62254..0a10d83 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -67,9 +67,12 @@ static int control_unix_sock(struct sockaddr_un *address) - posix_api->close_fn(sockfd); - return -1; - } -+ -+ struct cfg_params *global_params = get_global_cfg_params(); -+ - address->sun_family = AF_UNIX; -- int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), GAZELLE_REG_SOCK_PATHNAME, -- strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); -+ int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), global_params->unix_socket_filename, -+ strlen(global_params->unix_socket_filename) + 1); - if (ret != EOK) { - posix_api->close_fn(sockfd); - return -1; -@@ -459,6 +462,14 @@ void control_fd_close(void) - /* 200ms: wait ltran instance logout */ - rte_delay_ms(200); - } -+ -+ struct cfg_params *global_params = get_global_cfg_params(); -+ if (!global_params->use_ltran) { -+ int ret = unlink(global_params->unix_socket_filename); -+ if (ret == -1) { -+ LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n"); -+ } -+ } - } - - int32_t control_init_client(bool is_reconnect) -@@ -675,7 +686,7 @@ static int32_t control_init_server(void) - return -1; - } - -- ret = unlink(GAZELLE_REG_SOCK_PATHNAME); -+ ret = unlink(get_global_cfg_params()->unix_socket_filename); - if (ret == -1) { - LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n"); - } -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 80dfd24..3864250 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -80,6 +80,7 @@ struct cfg_params { - int dpdk_argc; - char **dpdk_argv; - struct secondary_attach_arg sec_attach_arg; -+ char unix_socket_filename[NAME_MAX]; - }; - - struct cfg_params *get_global_cfg_params(void); -diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h -index 41d4cfb..6be9152 100644 ---- a/src/ltran/ltran_base.h -+++ b/src/ltran/ltran_base.h -@@ -99,5 +99,6 @@ - #define GAZELLE_INET_ADDRSTRLEN 16 - - #define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock" -+#define GAZELLE_DFX_SOCK_FILENAME "gazelle_cmd.sock" - - #endif /* ifndef __GAZELLE_BASE_H__ */ -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index de97a48..bab3f89 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -57,6 +57,8 @@ static struct gazelle_stat_lstack_total g_last_lstack_total[GAZELLE_MAX_STACK_AR - - static bool g_use_ltran = false; - -+static char* g_unix_prefix; -+ - /* Use the largest data structure. */ - #define GAZELLE_CMD_RESP_BUFFER_SIZE (sizeof(struct gazelle_stack_dfx_data) / sizeof(char)) - -@@ -162,15 +164,23 @@ static int32_t dfx_connect_ltran(bool use_ltran, bool probe) - printf("%s:%d memset_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - -+ if (g_unix_prefix) { -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_RUN_DIR, -+ strlen(GAZELLE_RUN_DIR) + 1); -+ if (ret != EOK) { -+ printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -+ } -+ } -+ - addr.sun_family = AF_UNIX; - if (use_ltran) { -- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, - strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1); - if (ret != EOK) { - printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - } else { -- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME, -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME, - strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); - if (ret != EOK) { - printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -@@ -1251,6 +1261,27 @@ int32_t main(int32_t argc, char *argv[]) - struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0}; - int32_t req_msg_num, ret; - -+ int unix_arg = 0; -+ for (int32_t i = 1; i < argc; i++) { -+ if (unix_arg == 0) { -+ if (!strcmp(argv[i], "-u")) { -+ unix_arg++; -+ } -+ } else if (unix_arg == 1) { -+ g_unix_prefix = argv[i]; -+ unix_arg++; -+ } else { -+ argv[i - unix_arg] = argv[i]; -+ } -+ } -+ -+ argv[argc - unix_arg] = argv[argc]; -+ argc -= unix_arg; -+ -+ if (g_unix_prefix && filename_check(g_unix_prefix)) { -+ return -1; -+ } -+ - int32_t fd = dfx_connect_ltran(true, true); - if (fd > 0) { - g_use_ltran = true; -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index fc45895..4974085 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -42,6 +42,7 @@ - #define PARAM_BOND_RX_QUEUE_NUM "bond_rx_queue_num" - #define PARAM_BOND_MACS "bond_macs" - #define PARAM_TCP_CONN_SCAN_INTERVAL "tcp_conn_scan_interval" -+#define PARAM_UNIX_PREFIX "unix_prefix" - - static struct ltran_config g_ltran_config = {0}; - struct ltran_config* get_ltran_config(void) -@@ -537,6 +538,78 @@ struct param_parser { - param_parse_func func; - }; - -+static int32_t parse_unix_prefix(const config_t *config, const char *key, struct ltran_config *ltran_config) -+{ -+ const char *prefix = NULL; -+ int32_t ret = 0; -+ -+ ret = memset_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), -+ 0, sizeof(ltran_config->unix_socket_filename)); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = memset_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), -+ 0, sizeof(ltran_config->dfx_socket_filename)); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = strncpy_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), -+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = strncpy_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), -+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = config_lookup_string(config, key, &prefix); -+ if (ret) { -+ if (filename_check(prefix)) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), -+ prefix, strlen(prefix) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), -+ prefix, strlen(prefix) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ } -+ -+ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename), -+ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename), -+ GAZELLE_DFX_SOCK_FILENAME, strlen(GAZELLE_DFX_SOCK_FILENAME) + 1); -+ if (ret != EOK) { -+ gazelle_set_errno(GAZELLE_EINETATON); -+ return GAZELLE_ERR; -+ } -+ -+ return GAZELLE_OK; -+} -+ - struct param_parser g_param_parse_tbl[] = { - {PARAM_FORWARD_KIT_ARGS, parse_forward_kit_args}, - {PARAM_DISPATCH_MAX_CLIENT, parse_dispatch_max_client}, -@@ -551,6 +624,7 @@ struct param_parser g_param_parse_tbl[] = { - {PARAM_BOND_TX_QUEUE_NUM, parse_bond_tx_queue_num}, - {PARAM_TCP_CONN_SCAN_INTERVAL, parse_tcp_conn_scan_interval}, - {PARAM_KNI_SWITCH, parse_kni_switch}, -+ {PARAM_UNIX_PREFIX, parse_unix_prefix}, - }; - - int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config) -@@ -597,4 +671,3 @@ bool is_same_mac_addr(const uint8_t *smac, const uint8_t *dmac) - } - return true; - } -- -diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h -index 3ec6451..6f013d5 100644 ---- a/src/ltran/ltran_param.h -+++ b/src/ltran/ltran_param.h -@@ -56,6 +56,8 @@ struct ltran_config { - struct { - int32_t log_switch; - } log; -+ char unix_socket_filename[NAME_MAX]; -+ char dfx_socket_filename[NAME_MAX]; - }; - - int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config); -diff --git a/src/ltran/main.c b/src/ltran/main.c -index 691595e..03b3ad5 100644 ---- a/src/ltran/main.c -+++ b/src/ltran/main.c -@@ -58,6 +58,15 @@ static void sig_default_handler(int32_t sig) - LTRAN_ERR("ltran dumped,caught signal:%d.\n", sig); - print_stack(); - dpdk_kni_release(); -+ int ret = 0; -+ ret = unlink(get_ltran_config()->unix_socket_filename); -+ if (ret) { -+ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->unix_socket_filename, errno, ret); -+ } -+ ret = unlink(get_ltran_config()->dfx_socket_filename); -+ if (ret) { -+ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->dfx_socket_filename, errno, ret); -+ } - kill(getpid(), sig); - } - --- -2.23.0 - diff --git a/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch b/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch deleted file mode 100644 index da4c451..0000000 --- a/0132-remove-filename_check-in-gazellectl-to-fix-build-err.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 3149382926845f44a398ba2d29a732c3e42b11ab Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sat, 12 Nov 2022 22:01:06 +0800 -Subject: [PATCH 18/20] remove filename_check in gazellectl to fix build error - ---- - src/ltran/ltran_dfx.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index bab3f89..5d2c305 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -1278,10 +1278,6 @@ int32_t main(int32_t argc, char *argv[]) - argv[argc - unix_arg] = argv[argc]; - argc -= unix_arg; - -- if (g_unix_prefix && filename_check(g_unix_prefix)) { -- return -1; -- } -- - int32_t fd = dfx_connect_ltran(true, true); - if (fd > 0) { - g_use_ltran = true; --- -2.23.0 - diff --git a/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch b/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch deleted file mode 100644 index b9bec6f..0000000 --- a/0133-cancel-kernel-sock-epoll-ctl-when-lwip-sock-connect.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 193937aa1b3bdf0c37059c6bc24504363f728c66 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 12 Nov 2022 14:08:12 +0000 -Subject: [PATCH 19/20] cancel kernel sock epoll ctl when lwip sock connect - ---- - src/lstack/core/lstack_lwip.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 087d09b..d9ae6c0 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -721,6 +721,10 @@ void gazelle_connected_callback(struct netconn *conn) - return; - } - -+ if (sock->wakeup != NULL && sock->wakeup->epollfd > 0){ -+ posix_api->epoll_ctl_fn(sock->wakeup->epollfd, EPOLL_CTL_DEL, fd, NULL); -+ } -+ - posix_api->shutdown_fn(fd, SHUT_RDWR); - - SET_CONN_TYPE_LIBOS(conn); --- -2.23.0 - diff --git a/0134-modify-readv-and-writev-first-buf-is-null.patch b/0134-modify-readv-and-writev-first-buf-is-null.patch deleted file mode 100644 index a35e861..0000000 --- a/0134-modify-readv-and-writev-first-buf-is-null.patch +++ /dev/null @@ -1,66 +0,0 @@ -From fce82f12ef0fde847d291b85057e9e0df07f011c Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Sat, 12 Nov 2022 14:19:30 +0000 -Subject: [PATCH 20/20] modify readv and writev first buf is null - ---- - src/lstack/api/lstack_wrap.c | 7 ++++++- - src/lstack/core/lstack_lwip.c | 10 +++++++++- - 2 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index d48fee0..2eeda6b 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -352,7 +352,12 @@ static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt) - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; -- return recvmsg_from_stack(s, &msg, 0); -+ ssize_t result = recvmsg_from_stack(s, &msg, 0); -+ if(result == -1 && errno == EAGAIN){ -+ errno = 0; -+ return 0; -+ } -+ return result; - } - - static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags) -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d9ae6c0..4fec74e 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -473,7 +473,7 @@ static int32_t check_msg_vaild(const struct msghdr *message) - for (int32_t i = 0; i < message->msg_iovlen; i++) { - if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len < 0) || - ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || -- ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { -+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) < 0)) { - GAZELLE_RETURN(EINVAL); - } - buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); -@@ -491,6 +491,10 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) - } - - for (int32_t i = 0; i < message->msg_iovlen; i++) { -+ if (message->msg_iov[i].iov_len == 0){ -+ continue; -+ } -+ - ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); - if (recvd_local > 0) { - buflen += recvd_local; -@@ -554,6 +558,10 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - continue; - } - -+ if (message->msg_iov[i].iov_len == 0){ -+ continue; -+ } -+ - ret = write_stack_data(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len); - if (ret <= 0) { - buflen = (buflen == 0) ? ret : buflen; --- -2.23.0 - diff --git a/0135-fix-pdump-and-mutil-NIC-init-fail.patch b/0135-fix-pdump-and-mutil-NIC-init-fail.patch deleted file mode 100644 index ffacd4b..0000000 --- a/0135-fix-pdump-and-mutil-NIC-init-fail.patch +++ /dev/null @@ -1,57 +0,0 @@ -From b2b659c8d2567b9553344ef7c4fe3489c2c7906b Mon Sep 17 00:00:00 2001 -From: kircher -Date: Mon, 14 Nov 2022 19:17:00 +0800 -Subject: [PATCH] fix pdump and mutil NIC init fail - ---- - src/lstack/Makefile | 3 ++- - src/ltran/ltran_monitor.c | 5 +++-- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index cb7be16..b6cbd32 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -83,7 +83,8 @@ LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.so \ - $(LIB_PATH)/librte_bpf.so \ - $(LIB_PATH)/librte_pcapng.so \ - $(LIB_PATH)/librte_security.so \ -- $(LIB_PATH)/librte_cryptodev.so -+ $(LIB_PATH)/librte_cryptodev.so \ -+ $(LIB_PATH)/librte_net_pcap.so - - - DEP_LIBS = $(LWIP_LIB) $(LIBRTE_LIB) -diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c -index d535726..bd047fc 100644 ---- a/src/ltran/ltran_monitor.c -+++ b/src/ltran/ltran_monitor.c -@@ -32,6 +32,7 @@ - #include "gazelle_dfx_msg.h" - #include "gazelle_base_func.h" - #include "ltran_monitor.h" -+#include "ltran_param.h" - - #define GAZELLE_LISTEN_BACKLOG 5 - -@@ -180,7 +181,7 @@ static int32_t gazelle_ctl_init(void) - LTRAN_ERR("dir not exist and create fail. ret=%d.\n", ret); - return GAZELLE_ERR; - } -- ret = unix_server_create(GAZELLE_DFX_SOCK_PATHNAME, &listenfd); -+ ret = unix_server_create(get_ltran_config()->dfx_socket_filename, &listenfd); - if (ret != GAZELLE_OK) { - LTRAN_ERR("unix_server_create failed. ret=%d.\n", ret); - return GAZELLE_ERR; -@@ -199,7 +200,7 @@ static int32_t gazelle_ctl_init(void) - return GAZELLE_ERR; - } - -- ret = unix_server_create(GAZELLE_REG_SOCK_PATHNAME, &listenfd); -+ ret = unix_server_create(get_ltran_config()->unix_socket_filename, &listenfd); - if (ret != GAZELLE_OK) { - LTRAN_ERR("unix_server_create failed. ret=%d.\n", ret); - sockfd_data_free(event_dfx.data.ptr); --- -2.33.0 - diff --git a/0136-modify-duplicate-code.patch b/0136-modify-duplicate-code.patch deleted file mode 100644 index 1a5d9ef..0000000 --- a/0136-modify-duplicate-code.patch +++ /dev/null @@ -1,36 +0,0 @@ -From c776269a5565c93b7ad06593901bb2619b828baf Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Tue, 15 Nov 2022 03:21:35 +0000 -Subject: [PATCH] modify duplicate code - ---- - src/lstack/core/lstack_lwip.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 4fec74e..2fbbe97 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -558,10 +558,6 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - continue; - } - -- if (message->msg_iov[i].iov_len == 0){ -- continue; -- } -- - ret = write_stack_data(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len); - if (ret <= 0) { - buflen = (buflen == 0) ? ret : buflen; -@@ -730,7 +726,7 @@ void gazelle_connected_callback(struct netconn *conn) - } - - if (sock->wakeup != NULL && sock->wakeup->epollfd > 0){ -- posix_api->epoll_ctl_fn(sock->wakeup->epollfd, EPOLL_CTL_DEL, fd, NULL); -+ posix_api->epoll_ctl_fn(sock->wakeup->epollfd, EPOLL_CTL_DEL, fd, NULL); - } - - posix_api->shutdown_fn(fd, SHUT_RDWR); --- -2.33.0 - diff --git a/0137-merge-lstack-rx-tx-mbuf-pool.patch b/0137-merge-lstack-rx-tx-mbuf-pool.patch deleted file mode 100644 index 310178a..0000000 --- a/0137-merge-lstack-rx-tx-mbuf-pool.patch +++ /dev/null @@ -1,141 +0,0 @@ -From ac68de66115c072361738a8e5f610310d14d3b46 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 16 Nov 2022 19:24:54 +0800 -Subject: [PATCH] merge lstack rx tx mbuf pool - ---- - src/lstack/core/lstack_dpdk.c | 12 +++--------- - src/lstack/core/lstack_lwip.c | 4 ++-- - src/lstack/core/lstack_protocol_stack.c | 2 +- - src/lstack/include/lstack_dpdk.h | 6 ++---- - src/lstack/include/lstack_protocol_stack.h | 3 +-- - src/lstack/netif/lstack_ethdev.c | 2 +- - src/lstack/netif/lstack_vdev.c | 2 +- - 7 files changed, 11 insertions(+), 20 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 5dc2e54..535a138 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -177,15 +177,9 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ, -+ stack->rxtx_pktmbuf_pool = create_pktmbuf_mempool("rxtx_mbuf", RXTX_NB_MBUF / stack_num, RXTX_CACHE_SZ, - stack->queue_id); -- if (stack->rx_pktmbuf_pool == NULL) { -- return -1; -- } -- -- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ, -- stack->queue_id); -- if (stack->tx_pktmbuf_pool == NULL) { -+ if (stack->rxtx_pktmbuf_pool == NULL) { - return -1; - } - -@@ -488,7 +482,7 @@ static int32_t dpdk_ethdev_setup(const struct eth_params *eth_params, const stru - int32_t ret; - - ret = rte_eth_rx_queue_setup(eth_params->port_id, stack->queue_id, eth_params->nb_rx_desc, stack->socket_id, -- ð_params->rx_conf, stack->rx_pktmbuf_pool); -+ ð_params->rx_conf, stack->rxtx_pktmbuf_pool); - if (ret < 0) { - LSTACK_LOG(ERR, LSTACK, "cannot setup rx_queue %hu: %s\n", stack->queue_id, rte_strerror(-ret)); - return -1; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 2fbbe97..fbc908c 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -106,7 +106,7 @@ static void replenish_send_idlembuf(struct protocol_stack *stack, struct rte_rin - uint32_t replenish_cnt = gazelle_ring_free_count(ring); - - uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); -- if (rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { - stack->stats.tx_allocmbuf_fail++; - return; - } -@@ -207,7 +207,7 @@ struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) - struct rte_mbuf *mbuf; - struct protocol_stack *stack = get_protocol_stack(); - -- if (rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, &mbuf, 1) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, &mbuf, 1) != 0) { - stack->stats.tx_allocmbuf_fail++; - return NULL; - } -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 7a3955d..14c25f5 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -697,7 +697,7 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack - continue; - } - -- ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1); -+ ret = gazelle_alloc_pktmbuf(stack->rxtx_pktmbuf_pool, &mbuf_copy, 1); - if (ret != 0) { - stack->stats.rx_allocmbuf_fail++; - return; -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 684d025..9a4fb35 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -15,10 +15,8 @@ - - #include "gazelle_opt.h" - --#define RX_NB_MBUF ((5 * MAX_CLIENTS) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR)) --#define RX_MBUF_CACHE_SZ (VDEV_RX_QUEUE_SZ) --#define TX_NB_MBUF (128 * DEFAULT_RING_SIZE) --#define TX_MBUF_CACHE_SZ (DEFAULT_RING_SIZE) -+#define RXTX_NB_MBUF (128 * 2000) /* mbuf per connect * connect num */ -+#define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define KNI_NB_MBUF (DEFAULT_RING_SIZE << 2) - #define KNI_MBUF_CACHE_SZ (DEFAULT_RING_SIZE) - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 2d9053a..68cbbfa 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -43,8 +43,7 @@ struct protocol_stack { - cpu_set_t idle_cpuset; /* idle cpu in numa of stack, app thread bind to it */ - int32_t epollfd; /* kernel event thread epoll fd */ - -- struct rte_mempool *rx_pktmbuf_pool; -- struct rte_mempool *tx_pktmbuf_pool; -+ struct rte_mempool *rxtx_pktmbuf_pool; - struct rte_ring *rx_ring; - struct rte_ring *tx_ring; - struct rte_ring *reg_ring; -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index d410a5c..62e4ecf 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -207,7 +207,7 @@ int32_t ethdev_init(struct protocol_stack *stack) - - if (use_ltran()) { - stack->rx_ring_used = 0; -- int32_t ret = fill_mbuf_to_ring(stack->rx_pktmbuf_pool, stack->rx_ring, RING_SIZE(VDEV_RX_QUEUE_SZ)); -+ int32_t ret = fill_mbuf_to_ring(stack->rxtx_pktmbuf_pool, stack->rx_ring, RING_SIZE(VDEV_RX_QUEUE_SZ)); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "fill mbuf to rx_ring failed ret=%d\n", ret); - return ret; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index e2671b4..8b0617e 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -51,7 +51,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk - stack->rx_ring_used += rcvd_pkts; - if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) { - uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, RING_SIZE(DPDK_PKT_BURST_SIZE)); -- int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); -+ int32_t ret = gazelle_alloc_pktmbuf(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt); - if (likely(ret == 0)) { - nr_pkts = gazelle_ring_sp_enqueue(stack->rx_ring, (void **)free_buf, free_cnt); - stack->rx_ring_used -= nr_pkts; --- -2.33.0 - diff --git a/0138-avoid-send-stop-when-mbuf-pool-empty.patch b/0138-avoid-send-stop-when-mbuf-pool-empty.patch deleted file mode 100644 index 3b96104..0000000 --- a/0138-avoid-send-stop-when-mbuf-pool-empty.patch +++ /dev/null @@ -1,142 +0,0 @@ -From 3c8c47b30236f9d213fe7bf5877970941e6cd6ac Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Wed, 16 Nov 2022 19:51:57 +0800 -Subject: [PATCH] avoid send stop when mbuf pool empty - ---- - src/lstack/core/lstack_lwip.c | 57 ++++++++++++++++++++++++----------- - 1 file changed, 40 insertions(+), 17 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index fbc908c..196420d 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -99,7 +99,8 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u - return pbuf; - } - --static void replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring) -+/* true: need replenish again */ -+static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring) - { - void *pbuf[SOCK_SEND_RING_SIZE]; - -@@ -108,7 +109,7 @@ static void replenish_send_idlembuf(struct protocol_stack *stack, struct rte_rin - uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); - if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { - stack->stats.tx_allocmbuf_fail++; -- return; -+ return true; - } - - for (uint32_t i = 0; i < alloc_num; i++) { -@@ -119,6 +120,8 @@ static void replenish_send_idlembuf(struct protocol_stack *stack, struct rte_rin - for (uint32_t i = num; i < alloc_num; i++) { - pbuf_free(pbuf[i]); - } -+ -+ return false; - } - - void gazelle_init_sock(int32_t fd) -@@ -145,7 +148,7 @@ void gazelle_init_sock(int32_t fd) - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -- replenish_send_idlembuf(stack, sock->send_ring); -+ (void)replenish_send_idlembuf(stack, sock->send_ring); - - sock->stack = stack; - sock->stack->conn_num++; -@@ -310,7 +313,22 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - return send_len; - } - --static void do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock, int32_t flags) -+static inline bool replenish_send_ring(struct protocol_stack *stack, struct lwip_sock *sock) -+{ -+ bool replenish_again = false; -+ -+ if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -+ replenish_again = replenish_send_idlembuf(stack, sock->send_ring); -+ } -+ -+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -+ add_sock_event(sock, EPOLLOUT); -+ } -+ -+ return replenish_again; -+} -+ -+static inline bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock, int32_t flags) - { - /* send all send_ring, so len set lwip send max. */ - ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -@@ -320,13 +338,7 @@ static void do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_s - add_sock_event(sock, EPOLLERR); - } - -- if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -- replenish_send_idlembuf(stack, sock->send_ring); -- } -- -- if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -- add_sock_event(sock, EPOLLOUT); -- } -+ return replenish_send_ring(stack, sock); - } - - void stack_send(struct rpc_msg *msg) -@@ -348,10 +360,10 @@ void stack_send(struct rpc_msg *msg) - return; - } - -- do_lwip_send(stack, fd, sock, flags); -+ bool replenish_again = do_lwip_send(stack, fd, sock, flags); - -- /* have remain data add sendlist */ -- if (NETCONN_IS_DATAOUT(sock)) { -+ /* have remain data or replenish again add sendlist */ -+ if (NETCONN_IS_DATAOUT(sock) || replenish_again) { - if (list_is_null(&sock->send_list)) { - list_add_node(&stack->send_list, &sock->send_list); - __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -@@ -365,6 +377,7 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - struct list_node *node, *temp; - struct lwip_sock *sock; - uint32_t read_num = 0; -+ bool replenish_again; - - list_for_each_safe(node, temp, &stack->send_list) { - sock = container_of(node, struct lwip_sock, send_list); -@@ -372,14 +385,24 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); - rte_mb(); - -- if (sock->conn == NULL || sock->errevent > 0 || !NETCONN_IS_DATAOUT(sock)) { -+ if (sock->conn == NULL || sock->errevent > 0) { - list_del_node_null(&sock->send_list); - continue; - } - -- do_lwip_send(stack, sock->conn->socket, sock, 0); -- - if (!NETCONN_IS_DATAOUT(sock)) { -+ replenish_again = replenish_send_ring(stack, sock); -+ if (replenish_again) { -+ continue; -+ } -+ -+ list_del_node_null(&sock->send_list); -+ continue; -+ } -+ -+ replenish_again = do_lwip_send(stack, sock->conn->socket, sock, 0); -+ -+ if (!NETCONN_IS_DATAOUT(sock) && !replenish_again) { - list_del_node_null(&sock->send_list); - } else { - __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); --- -2.33.0 - diff --git a/0139-fix-pcb-snd_buf-flip.patch b/0139-fix-pcb-snd_buf-flip.patch deleted file mode 100644 index 17822a8..0000000 --- a/0139-fix-pcb-snd_buf-flip.patch +++ /dev/null @@ -1,28 +0,0 @@ -From d51be32362f49a53d4c186f8da06a317b8dad21b Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Wed, 16 Nov 2022 20:04:01 +0800 -Subject: [PATCH] fix pcb snd_buf flip - ---- - src/lstack/core/lstack_lwip.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 196420d..8a11aa5 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -227,6 +227,11 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - return NULL; - } - -+ if (pbuf->tot_len > remain_size) { -+ *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ return NULL; -+ } -+ - return pbuf; - } - --- -2.33.0 - diff --git a/0140-fix-lwip-send-return-0-add-err-event.patch b/0140-fix-lwip-send-return-0-add-err-event.patch deleted file mode 100644 index 6e82f88..0000000 --- a/0140-fix-lwip-send-return-0-add-err-event.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ecd6f699994dd335fb0c3187d8296f741ff5fd17 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Wed, 16 Nov 2022 21:40:43 +0800 -Subject: [PATCH] fix lwip send return 0 add err event - ---- - src/lstack/core/lstack_lwip.c | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 8a11aa5..9271bd6 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -336,12 +336,7 @@ static inline bool replenish_send_ring(struct protocol_stack *stack, struct lwip - static inline bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock, int32_t flags) - { - /* send all send_ring, so len set lwip send max. */ -- ssize_t len = lwip_send(fd, sock, UINT16_MAX, flags); -- if (len == 0) { -- /* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */ -- sock->errevent = 1; -- add_sock_event(sock, EPOLLERR); -- } -+ (void)lwip_send(fd, sock, UINT16_MAX, flags); - - return replenish_send_ring(stack, sock); - } --- -2.33.0 - diff --git a/0141-fix-data-flow-error-when-use-NIC-in-kernel.patch b/0141-fix-data-flow-error-when-use-NIC-in-kernel.patch deleted file mode 100644 index 620d4bc..0000000 --- a/0141-fix-data-flow-error-when-use-NIC-in-kernel.patch +++ /dev/null @@ -1,44 +0,0 @@ -From aab5985a79d6002b048e35db7376cdb0e3aa4a1d Mon Sep 17 00:00:00 2001 -From: kircher -Date: Wed, 16 Nov 2022 21:47:46 +0800 -Subject: [PATCH] fix data flow error when use NIC in kernel - ---- - src/lstack/api/lstack_epoll.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 8d5439b..19dd69a 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -456,8 +456,10 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - wakeup->stat.app_events += lwip_num; - - if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { -- __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); - kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0); -+ if (!kernel_num) { -+ __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -+ } - } - - if (lwip_num + kernel_num > 0) { -@@ -657,12 +659,14 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - lwip_num = poll_lwip_event(fds, nfds); - - if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { -- __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); - kernel_num = posix_api->epoll_wait_fn(wakeup->epollfd, wakeup->events, nfds, 0); - for (int32_t i = 0; i < kernel_num; i++) { - uint32_t index = wakeup->events[i].data.u32; - fds[index].revents = wakeup->events[i].events; - } -+ if (!kernel_num) { -+ __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -+ } - } - - if (lwip_num + kernel_num > 0) { --- -2.33.0 - diff --git a/0142-fix-write-event-error.patch b/0142-fix-write-event-error.patch deleted file mode 100644 index f4df6fa..0000000 --- a/0142-fix-write-event-error.patch +++ /dev/null @@ -1,51 +0,0 @@ -From cc46783d0b4e309279b32367a222b19f2bb6defd Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Fri, 18 Nov 2022 12:21:49 +0000 -Subject: [PATCH] fix write event error - ---- - src/lstack/api/lstack_epoll.c | 21 +++++++++++++++++++-- - 1 file changed, 19 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 19dd69a..02889d6 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -128,7 +128,24 @@ static uint32_t update_events(struct lwip_sock *sock) - - static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *sock) - { -- sock->events = update_events(sock); -+ uint32_t event = 0; -+ -+ if (NETCONN_IS_DATAIN(sock) || NETCONN_IS_ACCEPTIN(sock)) { -+ event |= EPOLLIN; -+ } -+ -+ if (NETCONN_IS_OUTIDLE(sock)) { -+ /* lwip_netconn_do_connected set LIBOS FLAGS when connected */ -+ if (sock->conn && CONN_TYPE_IS_LIBOS(sock->conn)) { -+ event |= EPOLLOUT; -+ } -+ } -+ -+ if (sock->errevent > 0) { -+ event |= EPOLLERR | EPOLLIN; -+ } -+ -+ sock->events = event; - if (sock->events) { - pthread_spin_lock(&wakeup->event_list_lock); - if (wakeup->type == WAKEUP_EPOLL && list_is_null(&sock->event_list)) { -@@ -361,7 +378,7 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - sock->epoll_events = 0; - } - -- events[event_num].events = sock->events; -+ events[event_num].events = sock->events & sock->epoll_events; - events[event_num].data = sock->ep_data; - event_num++; - --- -2.33.0 - diff --git a/0143-add-malloc-init-zero.patch b/0143-add-malloc-init-zero.patch deleted file mode 100644 index 081c0ea..0000000 --- a/0143-add-malloc-init-zero.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 31f0d1f4b5d8617ef15226f7c88156308626da0f Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Fri, 18 Nov 2022 20:51:03 +0800 -Subject: [PATCH] add malloc init zero - ---- - src/lstack/core/lstack_cfg.c | 2 +- - src/lstack/core/lstack_control_plane.c | 2 +- - src/lstack/core/lstack_protocol_stack.c | 2 +- - src/ltran/ltran_param.c | 2 +- - src/ltran/ltran_stack.c | 2 +- - src/ltran/ltran_tcp_sock.c | 2 +- - 6 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 1ff3794..52ff3f5 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -785,7 +785,7 @@ static int32_t parse_conf_file(const char *path) - int32_t cfg_init(void) - { - int32_t ret; -- char *config_file = malloc(PATH_MAX * sizeof(char)); -+ char *config_file = calloc(PATH_MAX, sizeof(char)); - if (config_file == NULL) { - return -1; - } -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index 0a10d83..bf55df5 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -586,7 +586,7 @@ static int32_t thread_register(void) - { - int32_t ret; - -- struct gazelle_stat_lstack_conn *conn = malloc(sizeof(struct gazelle_stat_lstack_conn)); -+ struct gazelle_stat_lstack_conn *conn = calloc(1, sizeof(struct gazelle_stat_lstack_conn)); - if (conn == NULL) { - LSTACK_LOG(ERR, LSTACK, "malloc fail\n"); - return -1; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 14c25f5..d5830f1 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -344,7 +344,7 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - { - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - -- struct protocol_stack *stack = malloc(sizeof(*stack)); -+ struct protocol_stack *stack = calloc(1, sizeof(*stack)); - if (stack == NULL) { - LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n"); - sem_post(&stack_group->thread_phase1); -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index 4974085..18854cf 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -101,7 +101,7 @@ static int32_t parse_forward_kit_args_single(char *dpdk_str, size_t len, struct - (void)len; - do { - ltran_config->dpdk.dpdk_argc = 0; -- ltran_config->dpdk.dpdk_argv = malloc(GAZELLE_MAX_DPDK_ARGS_NUM * sizeof(char *)); -+ ltran_config->dpdk.dpdk_argv = calloc(GAZELLE_MAX_DPDK_ARGS_NUM, sizeof(char *)); - if (ltran_config->dpdk.dpdk_argv == NULL) { - gazelle_set_errno(GAZELLE_ENOMEM); - break; -diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c -index 1c0d4f7..d4e935e 100644 ---- a/src/ltran/ltran_stack.c -+++ b/src/ltran/ltran_stack.c -@@ -36,7 +36,7 @@ struct gazelle_stack_htable *gazelle_stack_htable_create(uint32_t max_stack_num) - struct gazelle_stack_htable *stack_htable; - uint32_t i; - -- stack_htable = malloc(sizeof(struct gazelle_stack_htable)); -+ stack_htable = calloc(1, sizeof(struct gazelle_stack_htable)); - if (stack_htable == NULL) { - return NULL; - } -diff --git a/src/ltran/ltran_tcp_sock.c b/src/ltran/ltran_tcp_sock.c -index 7ba23f0..d6a0d17 100644 ---- a/src/ltran/ltran_tcp_sock.c -+++ b/src/ltran/ltran_tcp_sock.c -@@ -40,7 +40,7 @@ struct gazelle_tcp_sock_htable *gazelle_tcp_sock_htable_create(uint32_t max_tcp_ - uint32_t i; - struct gazelle_tcp_sock_htable *tcp_sock_htable = NULL; - -- tcp_sock_htable = malloc(sizeof(struct gazelle_tcp_sock_htable)); -+ tcp_sock_htable = calloc(1, sizeof(struct gazelle_tcp_sock_htable)); - if (tcp_sock_htable == NULL) { - return NULL; - } --- -2.33.0 - diff --git a/0144-modify-event-error.patch b/0144-modify-event-error.patch deleted file mode 100644 index 2ce2773..0000000 --- a/0144-modify-event-error.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 41a1d215efc76fb07630c15cbe5580466f950f30 Mon Sep 17 00:00:00 2001 -From: compile_success <980965867@qq.com> -Date: Tue, 22 Nov 2022 15:31:19 +0000 -Subject: [PATCH] modify event error - ---- - src/lstack/api/lstack_epoll.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 02889d6..c3fd31c 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -145,9 +145,9 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s - event |= EPOLLERR | EPOLLIN; - } - -- sock->events = event; -- if (sock->events) { -+ if (event) { - pthread_spin_lock(&wakeup->event_list_lock); -+ sock->events = event; - if (wakeup->type == WAKEUP_EPOLL && list_is_null(&sock->event_list)) { - list_add_node(&wakeup->event_list, &sock->event_list); - } --- -2.33.0 - diff --git a/0145-add-unix_prefix-in-gazellectl.patch b/0145-add-unix_prefix-in-gazellectl.patch deleted file mode 100644 index 65bcb5b..0000000 --- a/0145-add-unix_prefix-in-gazellectl.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 633f4f3303847c80575af4002394a70669f2a373 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Fri, 18 Nov 2022 16:29:38 +0800 -Subject: [PATCH 06/10] add unix_prefix in gazellectl - ---- - src/ltran/ltran_dfx.c | 28 +++++++++++++++++----------- - 1 file changed, 17 insertions(+), 11 deletions(-) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 5d2c305..c505822 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -164,26 +164,32 @@ static int32_t dfx_connect_ltran(bool use_ltran, bool probe) - printf("%s:%d memset_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - -+ ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_RUN_DIR, -+ strlen(GAZELLE_RUN_DIR) + 1); -+ if (ret != EOK) { -+ printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -+ } -+ - if (g_unix_prefix) { -- ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_RUN_DIR, -- strlen(GAZELLE_RUN_DIR) + 1); -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), g_unix_prefix, -+ strlen(g_unix_prefix) + 1); - if (ret != EOK) { -- printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -+ printf("%s:%d strncat_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - } - - addr.sun_family = AF_UNIX; - if (use_ltran) { -- ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME, -- strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1); -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_FILENAME, -+ strlen(GAZELLE_DFX_SOCK_FILENAME) + 1); - if (ret != EOK) { -- printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -+ printf("%s:%d strncat_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - } else { -- ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME, -- strlen(GAZELLE_REG_SOCK_PATHNAME) + 1); -+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_FILENAME, -+ strlen(GAZELLE_REG_SOCK_FILENAME) + 1); - if (ret != EOK) { -- printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); -+ printf("%s:%d strncat_s fail ret=%d\n", __FUNCTION__, __LINE__, ret); - } - } - -@@ -915,8 +921,8 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - static void show_usage(void) - { - printf("Usage: gazellectl [-h | help] \n" -- " or: gazellectl ltran {quit | show | set} [LTRAN_OPTIONS] \n" -- " or: gazellectl lstack {show | set} ip [LSTACK_OPTIONS] \n \n" -+ " or: gazellectl ltran {quit | show | set} [LTRAN_OPTIONS] [-u UNIX_PREFIX]\n" -+ " or: gazellectl lstack {show | set} ip [LSTACK_OPTIONS] [-u UNIX_PREFIX]\n \n" - " quit ltran process exit \n \n" - " where LTRAN_OPTIONS := \n" - " show: \n" --- -2.23.0 - diff --git a/0146-fix-epoll_wait-report-event0.patch b/0146-fix-epoll_wait-report-event0.patch deleted file mode 100644 index a86fdef..0000000 --- a/0146-fix-epoll_wait-report-event0.patch +++ /dev/null @@ -1,75 +0,0 @@ -From d5fefe68d8f4bdc7e7828b1477b1eba30457c383 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Fri, 2 Dec 2022 11:08:41 +0800 -Subject: [PATCH 10/10] fix epoll_wait report event0 - ---- - src/lstack/api/lstack_epoll.c | 19 ++++++++++--------- - 1 file changed, 10 insertions(+), 9 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index c3fd31c..35df625 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -58,11 +58,11 @@ void add_sock_event(struct lwip_sock *sock, uint32_t event) - - /* app thread have read/write, event is outdated */ - if (event == EPOLLIN && sock->conn->state != NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { -- pthread_spin_unlock(&wakeup->event_list_lock); -+ pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { -- pthread_spin_unlock(&wakeup->event_list_lock); -+ pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - -@@ -147,8 +147,9 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s - - if (event) { - pthread_spin_lock(&wakeup->event_list_lock); -- sock->events = event; -- if (wakeup->type == WAKEUP_EPOLL && list_is_null(&sock->event_list)) { -+ sock->events = event; -+ if (wakeup->type == WAKEUP_EPOLL && (sock->events & sock->epoll_events) && -+ list_is_null(&sock->event_list)) { - list_add_node(&wakeup->event_list, &sock->event_list); - } - pthread_spin_unlock(&wakeup->event_list_lock); -@@ -362,7 +363,7 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event * - list_for_each_safe(node, temp, &wakeup->event_list) { - struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list); - -- if (sock->epoll_events == 0) { -+ if ((sock->epoll_events & sock->events) == 0) { - list_del_node_null(&sock->event_list); - continue; - } -@@ -474,9 +475,9 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - - if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { - kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0); -- if (!kernel_num) { -+ if (!kernel_num) { - __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -- } -+ } - } - - if (lwip_num + kernel_num > 0) { -@@ -681,9 +682,9 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - uint32_t index = wakeup->events[i].data.u32; - fds[index].revents = wakeup->events[i].events; - } -- if (!kernel_num) { -+ if (!kernel_num) { - __atomic_store_n(&wakeup->have_kernel_event, false, __ATOMIC_RELEASE); -- } -+ } - } - - if (lwip_num + kernel_num > 0) { --- -2.23.0 - diff --git a/0147-add-TSO.patch b/0147-add-TSO.patch deleted file mode 100644 index 4a31af9..0000000 --- a/0147-add-TSO.patch +++ /dev/null @@ -1,268 +0,0 @@ -From 228fdc88fb871692653dc4fd0cde8fa8fe2a54b7 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Dec 2022 21:14:05 +0800 -Subject: [PATCH 1/2] add TSO - ---- - src/common/dpdk_common.c | 18 +++++++++- - src/common/gazelle_dfx_msg.h | 1 + - src/common/gazelle_opt.h | 2 +- - src/lstack/core/lstack_dpdk.c | 3 +- - src/lstack/core/lstack_lwip.c | 15 +++++++- - src/lstack/include/lstack_dpdk.h | 5 ++- - src/lstack/netif/lstack_ethdev.c | 62 ++++++++++++++++++++++++-------- - src/lstack/netif/lstack_vdev.c | 4 +++ - 8 files changed, 89 insertions(+), 21 deletions(-) - -diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c -index 7298d05..89f7dfa 100644 ---- a/src/common/dpdk_common.c -+++ b/src/common/dpdk_common.c -@@ -118,6 +118,11 @@ void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev - COMMON_INFO("DEV_TX_OFFLOAD_TCP_CKSUM\n"); - } - -+ //if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_TSO) { -+ // tx_ol |= (DEV_TX_OFFLOAD_TCP_TSO | DEV_TX_OFFLOAD_MULTI_SEGS); -+ // COMMON_INFO("DEV_TX_OFFLOAD_TCP_TSO\n"); -+ //} -+ - if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) { - rx_ol = 0; - } -@@ -195,7 +200,18 @@ void dpdk_kni_release(void) - - int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count) - { -- uint32_t i = rte_kni_tx_burst(g_pkni, pkts_burst, count); -+ uint32_t i; -+ -+ for (i = 0; i < count; ++i) { -+ struct rte_ipv4_hdr * ipv4_hdr = (struct rte_ipv4_hdr *)(rte_pktmbuf_mtod(pkts_burst[i], char*) -+ + pkts_burst[i]->l2_len); -+ if (pkts_burst[i]->nb_segs > 1) { -+ ipv4_hdr->hdr_checksum = 0; -+ ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); -+ } -+ } -+ -+ i = rte_kni_tx_burst(g_pkni, pkts_burst, count); - for (; i < count; ++i) { - rte_pktmbuf_free(pkts_burst[i]); - pkts_burst[i] = NULL; -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 4d838c0..f6f8d0e 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -65,6 +65,7 @@ struct gazelle_stack_stat { - uint64_t rx; - uint64_t tx_drop; - uint64_t tx; -+ uint64_t tx_prepare_fail; - }; - - struct gazelle_wakeup_stat { -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index e9e3676..4262e90 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -44,7 +44,7 @@ - #define VDEV_TX_QUEUE_SZ DEFAULT_RING_SIZE - #define FREE_RX_QUEUE_SZ DPDK_PKT_BURST_SIZE - --#define RTE_TEST_TX_DESC_DEFAULT 512 -+#define RTE_TEST_TX_DESC_DEFAULT 2048 - #define RTE_TEST_RX_DESC_DEFAULT 4096 - - #define DPDK_PKT_BURST_SIZE 512 -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 535a138..2e8fb45 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -33,6 +33,7 @@ - #include - #include - #include -+#include - - #include "lstack_log.h" - #include "dpdk_common.h" -@@ -144,7 +145,7 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - - /* time stamp before pbuf_custom as priv_data */ - pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, -- sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id()); -+ sizeof(struct tcp_seg) + sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id()); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 9271bd6..d30ecdc 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -94,6 +94,9 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u - pbuf->ol_flags = 0; - pbuf->l2_len = 0; - pbuf->l3_len = 0; -+ pbuf->l4_len = 0; -+ pbuf->header_off = 0; -+ pbuf->rexmit = 0; - } - - return pbuf; -@@ -185,7 +188,8 @@ void gazelle_free_pbuf(struct pbuf *pbuf) - } - - struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -- rte_pktmbuf_free(mbuf); -+ pbuf->next = NULL; -+ rte_pktmbuf_free_seg(mbuf); - } - - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) -@@ -315,6 +319,9 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - sock->wakeup->stat.app_write_cnt += send_pkt; - } - -+ if (send_len == 0) { -+ usleep(100); -+ } - return send_len; - } - -@@ -390,9 +397,15 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - continue; - } - -+ if (tcp_sndbuf(sock->conn->pcb.tcp) < TCP_MSS) { -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -+ continue; -+ } -+ - if (!NETCONN_IS_DATAOUT(sock)) { - replenish_again = replenish_send_ring(stack, sock); - if (replenish_again) { -+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - continue; - } - -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 9a4fb35..8d68e06 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -16,9 +16,8 @@ - #include "gazelle_opt.h" - - #define RXTX_NB_MBUF (128 * 2000) /* mbuf per connect * connect num */ --#define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) --#define KNI_NB_MBUF (DEFAULT_RING_SIZE << 2) --#define KNI_MBUF_CACHE_SZ (DEFAULT_RING_SIZE) -+#define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) -+#define KNI_NB_MBUF (DEFAULT_RING_SIZE << 4) - - #define MBUF_HEADER_LEN 64 - -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 62e4ecf..87fe9ae 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -29,7 +29,8 @@ - #include "lstack_protocol_stack.h" - #include "lstack_ethdev.h" - --#define PKTMBUF_MALLOC_FLAG NULL -+/* FRAME_MTU + 14byte header */ -+#define MBUF_MAX_LEN 1514 - - void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - { -@@ -151,25 +152,58 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag) - static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - { - struct protocol_stack *stack = get_protocol_stack(); -- struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -+ struct rte_mbuf *pre_mbuf = NULL; -+ struct rte_mbuf *first_mbuf = NULL; -+ struct pbuf *first_pbuf = NULL; -+ -+ while (likely(pbuf != NULL)) { -+ struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -+ -+ mbuf->data_len = pbuf->len; -+ mbuf->pkt_len = pbuf->tot_len; -+ mbuf->ol_flags = pbuf->ol_flags; -+ -+ if (first_mbuf == NULL) { -+ first_mbuf = mbuf; -+ first_pbuf = pbuf; -+ first_mbuf->nb_segs = 1; -+ if (pbuf->header_off > 0) { -+ mbuf->data_off -= first_pbuf->l2_len + first_pbuf->l3_len + first_pbuf->l4_len; -+ pbuf->header_off = 0; -+ } -+ } else { -+ first_mbuf->nb_segs++; -+ pre_mbuf->next = mbuf; -+ if (pbuf->header_off == 0) { -+ uint16_t header_len = first_pbuf->l2_len + first_pbuf->l3_len + first_pbuf->l4_len; -+ mbuf->data_off += header_len; -+ pbuf->header_off = header_len; -+ } -+ } - -- if (mbuf->buf_addr == 0) { -- stack->stats.tx_drop++; -- return ERR_BUF; -+ if (likely(first_mbuf->pkt_len > MBUF_MAX_LEN)) { -+ mbuf->ol_flags |= RTE_MBUF_F_TX_TCP_SEG; -+ mbuf->tso_segsz = TCP_MSS; -+ } -+ mbuf->l2_len = first_pbuf->l2_len; -+ mbuf->l3_len = first_pbuf->l3_len; -+ mbuf->l4_len = first_pbuf->l4_len; -+ -+ pre_mbuf = mbuf; -+ rte_mbuf_refcnt_update(mbuf, 1); -+ if (pbuf->rexmit) { -+ mbuf->next = NULL; -+ break; -+ } -+ pbuf->rexmit = 1; -+ pbuf = pbuf->next; - } - -- mbuf->data_len = pbuf->len; -- mbuf->pkt_len = pbuf->tot_len; -- rte_mbuf_refcnt_update(mbuf, 1); -- mbuf->ol_flags = pbuf->ol_flags; -- mbuf->l2_len = pbuf->l2_len; -- mbuf->l3_len = pbuf->l3_len; -- -- uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &mbuf, 1); -+ uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1); - stack->stats.tx += sent_pkts; - if (sent_pkts < 1) { - stack->stats.tx_drop++; -- rte_pktmbuf_free(mbuf); -+ rte_pktmbuf_free(first_mbuf); - return ERR_MEM; - } - -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 8b0617e..5bdaf63 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -113,6 +113,10 @@ static uint32_t vdev_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkt - { - uint32_t sent_pkts = 0; - -+ if (rte_eth_tx_prepare(stack->port_id, stack->queue_id, pkts, nr_pkts) != nr_pkts) { -+ stack->stats.tx_prepare_fail++; -+ } -+ - do { - sent_pkts += rte_eth_tx_burst(stack->port_id, stack->queue_id, &pkts[sent_pkts], nr_pkts - sent_pkts); - } while (sent_pkts < nr_pkts); --- -2.23.0 - diff --git a/0148-optimize-app-thread-write-buff-block.patch b/0148-optimize-app-thread-write-buff-block.patch deleted file mode 100644 index 59aec83..0000000 --- a/0148-optimize-app-thread-write-buff-block.patch +++ /dev/null @@ -1,1001 +0,0 @@ -From 8fcc0033d10f7bac263759794199b4ec96372a92 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Dec 2022 21:20:28 +0800 -Subject: [PATCH 2/2] optimize app thread write buff block - ---- - src/common/dpdk_common.h | 39 +-- - src/common/gazelle_dfx_msg.h | 6 +- - src/common/gazelle_opt.h | 2 + - src/lstack/api/lstack_epoll.c | 2 +- - src/lstack/core/lstack_dpdk.c | 9 + - src/lstack/core/lstack_lwip.c | 389 +++++++++++++++++++------ - src/lstack/core/lstack_stack_stat.c | 2 +- - src/lstack/core/lstack_thread_rpc.c | 13 + - src/lstack/include/lstack_dpdk.h | 10 +- - src/lstack/include/lstack_lwip.h | 7 +- - src/lstack/include/lstack_thread_rpc.h | 2 + - src/lstack/netif/lstack_ethdev.c | 4 +- - src/ltran/ltran_dfx.c | 17 +- - 13 files changed, 366 insertions(+), 136 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 753c168..a0c304c 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -13,6 +13,7 @@ - #ifndef __GAZELLE_DPDK_COMMON_H__ - #define __GAZELLE_DPDK_COMMON_H__ - -+#include - #include - #include - -@@ -24,7 +25,7 @@ - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - - /* Layout: -- * | rte_mbuf | pbuf | custom_free_function | payload | -+ * | rte_mbuf | pbuf | custom_free_function | tcp_seg | payload | - **/ - struct pbuf; - static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) -@@ -148,7 +149,6 @@ static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, - return 0; - } - -- - __rte_ring_enqueue_elems(r, head, obj_table, sizeof(void *), n); - - __atomic_store_n(&r->cons.head, head + n, __ATOMIC_RELEASE); -@@ -169,39 +169,13 @@ static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, - return 0; - } - -- - __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); - -- r->cons.tail = cons + n; -- -- return n; --} -- --/* get ring obj dont dequeue */ --static __rte_always_inline uint32_t gazelle_ring_sc_peek(struct rte_ring *r, void **obj_table, uint32_t n) --{ -- uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); -- uint32_t cons = r->cons.tail; -- -- uint32_t entries = prod - cons; -- if (n > entries) { -- n = entries; -- } -- if (unlikely(n == 0)) { -- return 0; -- } -- -- -- __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n); -+ __atomic_store_n(&r->cons.tail, cons + n, __ATOMIC_RELEASE); - - return n; - } - --static __rte_always_inline void gazelle_ring_dequeue_over(struct rte_ring *r, uint32_t n) --{ -- r->cons.tail += n; --} -- - static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void **obj_table, uint32_t n) - { - uint32_t cons = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE); -@@ -222,11 +196,6 @@ static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void * - return n; - } - --static __rte_always_inline void gazelle_ring_read_n(struct rte_ring *r, uint32_t n) --{ -- __atomic_store_n(&r->prod.tail, r->prod.tail + n, __ATOMIC_RELEASE); --} -- - static __rte_always_inline void gazelle_ring_read_over(struct rte_ring *r) - { - __atomic_store_n(&r->prod.tail, r->prod.head, __ATOMIC_RELEASE); -@@ -240,7 +209,7 @@ static __rte_always_inline uint32_t gazelle_ring_readover_count(struct rte_ring - static __rte_always_inline uint32_t gazelle_ring_readable_count(const struct rte_ring *r) - { - rte_smp_rmb(); -- return r->cons.head - r->prod.tail; -+ return r->cons.head - r->prod.head; - } - - static __rte_always_inline uint32_t gazelle_ring_count(const struct rte_ring *r) -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index f6f8d0e..0bdd238 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -70,7 +70,7 @@ struct gazelle_stack_stat { - - struct gazelle_wakeup_stat { - uint64_t app_events; -- uint64_t app_write_idlefail; -+ uint64_t app_write_rpc; - uint64_t app_write_cnt; - uint64_t app_read_cnt; - uint64_t read_null; -@@ -157,8 +157,10 @@ struct gazelle_stat_lstack_conn_info { - uint32_t send_ring_cnt; - uint32_t recv_ring_cnt; - uint32_t tcp_sub_state; -- int32_t sem_cnt; -+ uint32_t send_back_cnt; - int32_t fd; -+ uint64_t recv_all; -+ uint64_t send_all; - }; - - struct gazelle_stat_lstack_conn { -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 4262e90..aac1ec9 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -47,6 +47,8 @@ - #define RTE_TEST_TX_DESC_DEFAULT 2048 - #define RTE_TEST_RX_DESC_DEFAULT 4096 - -+#define MBUF_MAX_DATA_LEN 1460 -+ - #define DPDK_PKT_BURST_SIZE 512 - - /* total:33 client, index 32 is invaild client */ -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 35df625..4ea6474 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -321,7 +321,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even - if (CONN_TYPE_HAS_HOST(sock->conn)) { - int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event); - if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d\n", fd, epfd, op); -+ LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d errno=%d\n", fd, epfd, op, errno); - } - } - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 2e8fb45..b9f2793 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -194,6 +194,15 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return 0; - } - -+int32_t gazelle_alloc_mbuf_with_reserve(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count) -+{ -+ if (rte_mempool_avail_count(pool) < RESERVE_NIC_RECV) { -+ return -1; -+ } -+ -+ return rte_pktmbuf_alloc_bulk(pool, mbufs, count); -+} -+ - struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id) - { - char ring_name[RTE_RING_NAMESIZE] = {0}; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d30ecdc..2cda2d9 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -34,9 +34,6 @@ - #include "dpdk_common.h" - #include "lstack_lwip.h" - --#define HALF_DIVISOR (2) --#define USED_IDLE_WATERMARK (VDEV_IDLE_QUEUE_SZ >> 2) -- - static void free_ring_pbuf(struct rte_ring *ring) - { - void *pbufs[SOCK_RECV_RING_SIZE]; -@@ -55,20 +52,41 @@ static void free_ring_pbuf(struct rte_ring *ring) - } while (gazelle_ring_readover_count(ring)); - } - -+static void free_list_pbuf(struct pbuf *pbuf) -+{ -+ while (pbuf) { -+ struct pbuf *del_pbuf = pbuf; -+ pbuf = pbuf->next; -+ -+ del_pbuf->next = NULL; -+ pbuf_free(del_pbuf); -+ } -+} -+ - static void reset_sock_data(struct lwip_sock *sock) - { - /* check null pointer in ring_free func */ - if (sock->recv_ring) { - free_ring_pbuf(sock->recv_ring); - rte_ring_free(sock->recv_ring); -+ sock->recv_ring = NULL; - } -- sock->recv_ring = NULL; - - if (sock->send_ring) { - free_ring_pbuf(sock->send_ring); - rte_ring_free(sock->send_ring); -+ sock->send_ring = NULL; -+ } -+ -+ if (sock->send_lastdata) { -+ free_list_pbuf(sock->send_lastdata); -+ sock->send_lastdata = NULL; -+ } -+ -+ if (sock->send_pre_del) { -+ pbuf_free(sock->send_pre_del); -+ sock->send_pre_del = NULL; - } -- sock->send_ring = NULL; - - sock->stack = NULL; - sock->wakeup = NULL; -@@ -76,6 +94,7 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->epoll_events = 0; - sock->events = 0; - sock->in_send = 0; -+ sock->remain_len = 0; - - if (sock->recv_lastdata) { - pbuf_free(sock->recv_lastdata); -@@ -97,6 +116,9 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u - pbuf->l4_len = 0; - pbuf->header_off = 0; - pbuf->rexmit = 0; -+ pbuf->in_write = 0; -+ pbuf->head = 0; -+ pbuf->last = pbuf; - } - - return pbuf; -@@ -110,13 +132,13 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_rin - uint32_t replenish_cnt = gazelle_ring_free_count(ring); - - uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); -- if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { -+ if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { - stack->stats.tx_allocmbuf_fail++; - return true; - } - - for (uint32_t i = 0; i < alloc_num; i++) { -- pbuf[i] = init_mbuf_to_pbuf(pbuf[i], PBUF_TRANSPORT, TCP_MSS, PBUF_RAM); -+ pbuf[i] = init_mbuf_to_pbuf(pbuf[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - } - - uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, alloc_num); -@@ -158,6 +180,7 @@ void gazelle_init_sock(int32_t fd) - init_list_node_null(&sock->recv_list); - init_list_node_null(&sock->event_list); - init_list_node_null(&sock->send_list); -+ pthread_spin_init(&sock->sock_lock, PTHREAD_PROCESS_PRIVATE); - } - - void gazelle_clean_sock(int32_t fd) -@@ -179,6 +202,7 @@ void gazelle_clean_sock(int32_t fd) - - list_del_node_null(&sock->recv_list); - list_del_node_null(&sock->send_list); -+ pthread_spin_destroy(&sock->sock_lock); - } - - void gazelle_free_pbuf(struct pbuf *pbuf) -@@ -196,7 +220,7 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - { - struct pbuf_custom *pbuf_custom = NULL; - -- int32_t ret = rte_pktmbuf_alloc_bulk(pool, mbufs, num); -+ int32_t ret = gazelle_alloc_mbuf_with_reserve(pool, mbufs, num); - if (ret != 0) { - return ret; - } -@@ -214,7 +238,7 @@ struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) - struct rte_mbuf *mbuf; - struct protocol_stack *stack = get_protocol_stack(); - -- if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, &mbuf, 1) != 0) { -+ if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, &mbuf, 1) != 0) { - stack->stats.tx_allocmbuf_fail++; - return NULL; - } -@@ -226,23 +250,55 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - { - struct pbuf *pbuf = NULL; - -- if (gazelle_ring_sc_peek(sock->send_ring, (void **)&pbuf, 1) != 1) { -- *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ if (unlikely(sock->send_pre_del)) { -+ pbuf = sock->send_pre_del; -+ if (pbuf->tot_len > remain_size || -+ (pbuf->head && __atomic_load_n(&pbuf->in_write, __ATOMIC_ACQUIRE))) { -+ *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ return NULL; -+ } -+ -+ if (pbuf->next) { -+ sock->send_lastdata = pbuf->next; -+ pbuf->next = NULL; -+ } -+ return pbuf; -+ } -+ -+ if (sock->send_lastdata) { -+ pbuf = sock->send_lastdata; -+ if (pbuf->tot_len > remain_size) { -+ *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ return NULL; -+ } -+ sock->send_pre_del = pbuf; -+ sock->send_lastdata = pbuf->next; -+ pbuf->next = NULL; -+ return pbuf; -+ } -+ -+ gazelle_ring_sc_dequeue(sock->send_ring, (void **)&pbuf, 1); -+ if (pbuf == NULL) { - return NULL; - } -+ sock->send_pre_del = pbuf; - -- if (pbuf->tot_len > remain_size) { -+ if (pbuf->tot_len > remain_size || __atomic_load_n(&pbuf->in_write, __ATOMIC_ACQUIRE)) { - *apiflags &= ~TCP_WRITE_FLAG_MORE; -+ pbuf->head = 1; - return NULL; - } - -+ sock->send_lastdata = pbuf->next; -+ pbuf->next = NULL; - return pbuf; - } - --void write_lwip_over(struct lwip_sock *sock, uint32_t n) -+void write_lwip_over(struct lwip_sock *sock) - { -- gazelle_ring_dequeue_over(sock->send_ring, n); -- sock->stack->stats.write_lwip_cnt += n; -+ sock->send_pre_del = NULL; -+ sock->send_all++; -+ sock->stack->stats.write_lwip_cnt++; - } - - static inline void del_data_out_event(struct lwip_sock *sock) -@@ -261,21 +317,174 @@ static inline void del_data_out_event(struct lwip_sock *sock) - pthread_spin_unlock(&sock->wakeup->event_list_lock); - } - --void write_stack_over(struct lwip_sock *sock) -+static ssize_t do_app_write(struct pbuf *pbufs[], void *buf, size_t len, uint32_t write_num) - { -- if (sock->send_lastdata) { -- sock->send_lastdata->tot_len = sock->send_lastdata->len = sock->send_datalen; -- sock->send_lastdata = NULL; -+ ssize_t send_len = 0; -+ uint32_t i = 0; -+ -+ for (i = 0; i < write_num - 1; i++) { -+ rte_prefetch0(pbufs[i + 1]); -+ rte_prefetch0(pbufs[i + 1]->payload); -+ rte_prefetch0((char *)buf + send_len + MBUF_MAX_DATA_LEN); -+ pbuf_take(pbufs[i], (char *)buf + send_len, MBUF_MAX_DATA_LEN); -+ pbufs[i]->tot_len = pbufs[i]->len = MBUF_MAX_DATA_LEN; -+ send_len += MBUF_MAX_DATA_LEN; - } - -+ /* reduce the branch in loop */ -+ uint16_t copy_len = len - send_len; -+ pbuf_take(pbufs[i], (char *)buf + send_len, copy_len); -+ pbufs[i]->tot_len = pbufs[i]->len = copy_len; -+ send_len += copy_len; -+ -+ return send_len; -+} -+ -+static inline ssize_t app_direct_write(struct protocol_stack *stack, struct lwip_sock *sock, void *buf, -+ size_t len, uint32_t write_num) -+{ -+ struct pbuf **pbufs = (struct pbuf **)malloc(write_num * sizeof(struct pbuf *)); -+ if (pbufs == NULL) { -+ return 0; -+ } -+ -+ /* first pbuf get from send_ring. and malloc pbufs attach to first pbuf */ -+ if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)&pbufs[1], write_num - 1) != 0) { -+ stack->stats.tx_allocmbuf_fail++; -+ free(pbufs); -+ return 0; -+ } -+ -+ (void)gazelle_ring_read(sock->send_ring, (void **)&pbufs[0], 1); -+ -+ uint32_t i = 1; -+ for (; i < write_num - 1; i++) { -+ rte_prefetch0(mbuf_to_pbuf((void *)pbufs[i + 1])); -+ pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ pbufs[i - 1]->next = pbufs[i]; -+ } -+ if (write_num > 1) { -+ pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ pbufs[i - 1]->next = pbufs[i]; -+ } -+ -+ ssize_t send_len = do_app_write(pbufs, buf, len, write_num); -+ - gazelle_ring_read_over(sock->send_ring); - -- if (sock->wakeup) { -- sock->wakeup->stat.app_write_cnt++; -- if (sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -- del_data_out_event(sock); -- } -+ pbufs[0]->last = pbufs[write_num - 1]; -+ sock->remain_len = 0; -+ free(pbufs); -+ return send_len; -+} -+ -+static inline ssize_t app_direct_attach(struct protocol_stack *stack, struct pbuf *attach_pbuf, void *buf, -+ size_t len, uint32_t write_num) -+{ -+ struct pbuf **pbufs = (struct pbuf **)malloc(write_num * sizeof(struct pbuf *)); -+ if (pbufs == NULL) { -+ return 0; -+ } -+ -+ /* first pbuf get from send_ring. and malloc pbufs attach to first pbuf */ -+ if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbufs, write_num) != 0) { -+ stack->stats.tx_allocmbuf_fail++; -+ free(pbufs); -+ return 0; -+ } -+ -+ pbufs[0] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[0], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ uint32_t i = 1; -+ for (; i < write_num - 1; i++) { -+ rte_prefetch0(mbuf_to_pbuf((void *)pbufs[i + 1])); -+ pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ pbufs[i - 1]->next = pbufs[i]; - } -+ if (write_num > 1) { -+ pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ pbufs[i - 1]->next = pbufs[i]; -+ } -+ -+ ssize_t send_len = do_app_write(pbufs, buf, len, write_num); -+ -+ attach_pbuf->last->next = pbufs[0]; -+ attach_pbuf->last = pbufs[write_num - 1]; -+ -+ free(pbufs); -+ return send_len; -+} -+ -+static inline ssize_t app_buff_write(struct lwip_sock *sock, void *buf, size_t len, uint32_t write_num) -+{ -+ struct pbuf *pbufs[SOCK_SEND_RING_SIZE]; -+ -+ (void)gazelle_ring_read(sock->send_ring, (void **)pbufs, write_num); -+ -+ ssize_t send_len = do_app_write(pbufs, buf, len, write_num); -+ -+ gazelle_ring_read_over(sock->send_ring); -+ -+ sock->remain_len = MBUF_MAX_DATA_LEN - pbufs[write_num - 1]->len; -+ return send_len; -+} -+ -+static inline struct pbuf *gazelle_ring_readlast(struct rte_ring *r) -+{ -+ struct pbuf *last_pbuf = NULL; -+ volatile uint32_t tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ uint32_t last = r->prod.tail - 1; -+ if (last == tail || last - tail > r->capacity) { -+ return NULL; -+ } -+ -+ __rte_ring_dequeue_elems(r, last, (void **)&last_pbuf, sizeof(void *), 1); -+ __atomic_store_n(&last_pbuf->in_write, 1, __ATOMIC_RELEASE); -+ -+ rte_mb(); -+ -+ tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); -+ if (last == tail || last - tail > r->capacity) { -+ __atomic_store_n(&last_pbuf->in_write, 0, __ATOMIC_RELEASE); -+ return NULL; -+ } -+ -+ return last_pbuf; -+} -+ -+static inline void gazelle_ring_lastover(struct pbuf *last_pbuf) -+{ -+ __atomic_store_n(&last_pbuf->in_write, 0, __ATOMIC_RELEASE); -+} -+ -+static inline size_t merge_data_lastpbuf(struct lwip_sock *sock, void *buf, size_t len) -+{ -+ struct pbuf *last_pbuf = gazelle_ring_readlast(sock->send_ring); -+ if (last_pbuf == NULL) { -+ sock->remain_len = 0; -+ return 0; -+ } -+ -+ if (last_pbuf->next || last_pbuf->len >= MBUF_MAX_DATA_LEN) { -+ sock->remain_len = 0; -+ gazelle_ring_lastover(last_pbuf); -+ return 0; -+ } -+ -+ size_t send_len = MBUF_MAX_DATA_LEN - last_pbuf->len; -+ if (send_len >= len) { -+ sock->remain_len = send_len - len; -+ send_len = len; -+ } else { -+ sock->remain_len = 0; -+ } -+ -+ uint16_t offset = last_pbuf->len; -+ last_pbuf->tot_len = last_pbuf->len = offset + send_len; -+ pbuf_take_at(last_pbuf, buf, send_len, offset); -+ -+ gazelle_ring_lastover(last_pbuf); -+ -+ return send_len; - } - - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) -@@ -284,44 +493,49 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - GAZELLE_RETURN(ENOTCONN); - } - -- struct pbuf *pbuf = NULL; -+ struct protocol_stack *stack = sock->stack; -+ struct wakeup_poll *wakeup = sock->wakeup; -+ if (!stack|| len == 0 || !wakeup) { -+ return 0; -+ } -+ - ssize_t send_len = 0; -- uint32_t send_pkt = 0; - -- while (send_len < len) { -- if (sock->send_lastdata) { -- pbuf = sock->send_lastdata; -- } else { -- if (gazelle_ring_read(sock->send_ring, (void **)&pbuf, 1) != 1) { -- if (sock->wakeup) { -- sock->wakeup->stat.app_write_idlefail++; -- } -- break; -- } -- sock->send_lastdata = pbuf; -- sock->send_datalen = 0; -+ /* merge data into last pbuf */ -+ if (sock->remain_len) { -+ send_len = merge_data_lastpbuf(sock, (char *)buf, len); -+ if (send_len >= len) { -+ return len; - } -+ } - -- uint16_t remian_len = pbuf->len - sock->send_datalen; -- uint16_t copy_len = (len - send_len > remian_len) ? remian_len : (len - send_len); -- pbuf_take_at(pbuf, (char *)buf + send_len, copy_len, sock->send_datalen); -- sock->send_datalen += copy_len; -- if (sock->send_datalen >= pbuf->len) { -- sock->send_lastdata = NULL; -- pbuf->tot_len = pbuf->len = sock->send_datalen; -- send_pkt++; -- } -+ uint32_t write_num = (len - send_len + MBUF_MAX_DATA_LEN - 1) / MBUF_MAX_DATA_LEN; -+ uint32_t write_avail = gazelle_ring_readable_count(sock->send_ring); - -- send_len += copy_len; -+ /* send_ring is full, data attach last pbuf */ -+ if (write_avail == 0) { -+ struct pbuf *last_pbuf = gazelle_ring_readlast(sock->send_ring); -+ if (last_pbuf) { -+ send_len += app_direct_attach(stack, last_pbuf, (char *)buf + send_len, len - send_len, write_num); -+ gazelle_ring_lastover(last_pbuf); -+ wakeup->stat.app_write_cnt += write_num; -+ } else { -+ (void)rpc_call_replenish(stack, sock); -+ wakeup->stat.app_write_rpc++; -+ } -+ sock->remain_len = 0; -+ return send_len; - } - -- if (sock->wakeup) { -- sock->wakeup->stat.app_write_cnt += send_pkt; -- } -+ /* send_ring have idle */ -+ send_len += (write_num <= write_avail) ? app_buff_write(sock, (char *)buf + send_len, len - send_len, write_num) : -+ app_direct_write(stack, sock, (char *)buf + send_len, len - send_len, write_num); -+ wakeup->stat.app_write_cnt += write_num; - -- if (send_len == 0) { -- usleep(100); -+ if (wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -+ del_data_out_event(sock); - } -+ - return send_len; - } - -@@ -340,6 +554,14 @@ static inline bool replenish_send_ring(struct protocol_stack *stack, struct lwip - return replenish_again; - } - -+void rpc_replenish(struct rpc_msg *msg) -+{ -+ struct protocol_stack *stack = (struct protocol_stack *)msg->args[MSG_ARG_0].p; -+ struct lwip_sock *sock = (struct lwip_sock *)msg->args[MSG_ARG_1].p; -+ -+ msg->result = replenish_send_ring(stack, sock); -+} -+ - static inline bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock, int32_t flags) - { - /* send all send_ring, so len set lwip send max. */ -@@ -375,6 +597,7 @@ void stack_send(struct rpc_msg *msg) - list_add_node(&stack->send_list, &sock->send_list); - __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - } -+ - stack->stats.send_self_rpc++; - } - } -@@ -389,6 +612,13 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - list_for_each_safe(node, temp, &stack->send_list) { - sock = container_of(node, struct lwip_sock, send_list); - -+ if (++read_num > send_max) { -+ /* list head move to next send */ -+ list_del_node(&stack->send_list); -+ list_add_node(&sock->send_list, &stack->send_list); -+ break; -+ } -+ - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); - rte_mb(); - -@@ -397,22 +627,6 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - continue; - } - -- if (tcp_sndbuf(sock->conn->pcb.tcp) < TCP_MSS) { -- __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -- continue; -- } -- -- if (!NETCONN_IS_DATAOUT(sock)) { -- replenish_again = replenish_send_ring(stack, sock); -- if (replenish_again) { -- __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); -- continue; -- } -- -- list_del_node_null(&sock->send_list); -- continue; -- } -- - replenish_again = do_lwip_send(stack, sock->conn->socket, sock, 0); - - if (!NETCONN_IS_DATAOUT(sock) && !replenish_again) { -@@ -420,10 +634,6 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max) - } else { - __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - } -- -- if (++read_num >= send_max) { -- break; -- } - } - } - -@@ -491,6 +701,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); - } - -+ sock->recv_all += read_count; - sock->stack->stats.read_lwip_cnt += read_count; - if (recv_len == 0) { - GAZELLE_RETURN(EAGAIN); -@@ -572,7 +783,6 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags) - if (send <= 0) { - return send; - } -- write_stack_over(sock); - - notice_stack_send(sock, fd, send, flags); - return send; -@@ -608,7 +818,6 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - } - - if (buflen > 0) { -- write_stack_over(sock); - notice_stack_send(sock, s, buflen, flags); - } - return buflen; -@@ -724,10 +933,16 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - struct lwip_sock *sock; - uint32_t read_num = 0; - -- struct list_node *last_node = list->prev; - list_for_each_safe(node, temp, list) { - sock = container_of(node, struct lwip_sock, recv_list); - -+ if (++read_num >= max_num) { -+ /* list head move to next send */ -+ list_del_node(&stack->recv_list); -+ list_add_node(&sock->recv_list, &stack->recv_list); -+ break; -+ } -+ - if (sock->conn == NULL || sock->conn->recvmbox == NULL || rte_ring_count(sock->conn->recvmbox->ring) == 0) { - list_del_node_null(&sock->recv_list); - continue; -@@ -741,11 +956,6 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - } else if (len > 0) { - add_sock_event(sock, EPOLLIN); - } -- -- /* last_node:recv only once per sock. max_num avoid cost too much time this loop */ -- if (++read_num >= max_num || last_node == node) { -- break; -- } - } - } - -@@ -772,6 +982,19 @@ void gazelle_connected_callback(struct netconn *conn) - add_sock_event(sock, EPOLLOUT); - } - -+static uint32_t send_back_count(struct lwip_sock *sock) -+{ -+ uint32_t count = 0; -+ struct pbuf *pbuf = sock->send_lastdata; -+ -+ while (pbuf) { -+ count++; -+ pbuf = pbuf->next; -+ } -+ -+ return count; -+} -+ - static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const struct tcp_pcb *pcb) - { - struct netconn *netconn = (struct netconn *)pcb->callback_arg; -@@ -791,8 +1014,10 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { - conn->recv_ring_cnt = gazelle_ring_readable_count(sock->recv_ring); - conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; -- -+ conn->send_back_cnt = send_back_count(sock); - conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring); -+ conn->recv_all = sock->recv_all; -+ conn->send_all = sock->send_all; - } - } - } -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 6261fa9..45f84a7 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -106,7 +106,7 @@ static void get_wakeup_stat(struct protocol_stack_group *stack_group, struct pro - stat->app_events += wakeup->stat.app_events; - stat->read_null += wakeup->stat.read_null; - stat->app_write_cnt += wakeup->stat.app_write_cnt; -- stat->app_write_idlefail += wakeup->stat.app_write_idlefail; -+ stat->app_write_rpc += wakeup->stat.app_write_rpc; - stat->app_read_cnt += wakeup->stat.app_read_cnt; - } - } -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 295baf3..29ca4e4 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -440,6 +440,19 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp) - return rpc_sync_call(&stack->rpc_queue, msg); - } - -+int32_t rpc_call_replenish(struct protocol_stack *stack, struct lwip_sock *sock) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_replenish); -+ if (msg == NULL) { -+ return -1; -+ } -+ -+ msg->args[MSG_ARG_0].p = stack; -+ msg->args[MSG_ARG_1].p = sock; -+ -+ return rpc_sync_call(&stack->rpc_queue, msg); -+} -+ - int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags) - { - struct protocol_stack *stack = get_protocol_stack_by_fd(fd); -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 8d68e06..c042ef5 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -15,13 +15,15 @@ - - #include "gazelle_opt.h" - --#define RXTX_NB_MBUF (128 * 2000) /* mbuf per connect * connect num */ -+#define RXTX_NB_MBUF (256 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ - #define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define KNI_NB_MBUF (DEFAULT_RING_SIZE << 4) - --#define MBUF_HEADER_LEN 64 -+#define RESERVE_NIC_RECV (1024) - --#define MAX_PACKET_SZ 2048 -+#define MBUF_HEADER_LEN 64 -+ -+#define MAX_PACKET_SZ 2048 - - #define RING_SIZE(x) ((x) - 1) - -@@ -37,6 +39,7 @@ int thread_affinity_init(int cpu_id); - struct protocol_stack; - struct rte_mempool; - struct rte_ring; -+struct rte_mbuf; - int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num); - int32_t dpdk_eal_init(void); - int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num); -@@ -49,5 +52,6 @@ void dpdk_skip_nic_init(void); - int32_t dpdk_init_lstack_kni(void); - void dpdk_restore_pci(void); - bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port); -+int32_t gazelle_alloc_mbuf_with_reserve(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count); - - #endif /* GAZELLE_DPDK_H */ -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index 968eff2..b24006a 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -15,19 +15,20 @@ - - #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) - #define NETCONN_IS_DATAIN(sock) ((gazelle_ring_readable_count((sock)->recv_ring) || (sock)->recv_lastdata)) --#define NETCONN_IS_DATAOUT(sock) gazelle_ring_readover_count((sock)->send_ring) -+#define NETCONN_IS_DATAOUT(sock) (gazelle_ring_readover_count((sock)->send_ring) || (sock)->send_lastdata || (sock)->send_pre_del) - #define NETCONN_IS_OUTIDLE(sock) gazelle_ring_readable_count((sock)->send_ring) - - struct lwip_sock; - struct rte_mempool; - struct rpc_msg; - struct rte_mbuf; -+struct protocol_stack; - void create_shadow_fd(struct rpc_msg *msg); - void gazelle_init_sock(int32_t fd); - int32_t gazelle_socket(int domain, int type, int protocol); - void gazelle_clean_sock(int32_t fd); - struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags); --void write_lwip_over(struct lwip_sock *sock, uint32_t n); -+void write_lwip_over(struct lwip_sock *sock); - ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len); - ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags); - ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, uint8_t apiflags); -@@ -39,10 +40,12 @@ void get_lwip_conntable(struct rpc_msg *msg); - void get_lwip_connnum(struct rpc_msg *msg); - void stack_recvlist_count(struct rpc_msg *msg); - void stack_send(struct rpc_msg *msg); -+void app_rpc_write(struct rpc_msg *msg); - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num); - void gazelle_free_pbuf(struct pbuf *pbuf); - ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags); - ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags); - ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags); -+void rpc_replenish(struct rpc_msg *msg); - - #endif -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 6928f98..2c1202e 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -51,6 +51,7 @@ struct rpc_msg { - struct protocol_stack; - struct rte_mbuf; - struct wakeup_poll; -+struct lwip_sock; - void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num); - void rpc_call_clean_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup); - int32_t rpc_call_msgcnt(struct protocol_stack *stack); -@@ -75,5 +76,6 @@ int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, sockle - int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen); - int32_t rpc_call_fcntl(int fd, int cmd, long val); - int32_t rpc_call_ioctl(int fd, long cmd, void *argp); -+int32_t rpc_call_replenish(struct protocol_stack *stack, struct lwip_sock *sock); - - #endif -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 87fe9ae..7984ded 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -82,7 +82,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - } - } - --#define READ_PKTS_MAX 32 -+#define READ_PKTS_MAX 128 - int32_t eth_dev_poll(void) - { - uint32_t nr_pkts; -@@ -183,7 +183,7 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - - if (likely(first_mbuf->pkt_len > MBUF_MAX_LEN)) { - mbuf->ol_flags |= RTE_MBUF_F_TX_TCP_SEG; -- mbuf->tso_segsz = TCP_MSS; -+ mbuf->tso_segsz = MBUF_MAX_DATA_LEN; - } - mbuf->l2_len = first_pbuf->l2_len; - mbuf->l3_len = first_pbuf->l3_len; -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index c505822..54839af 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -568,7 +568,7 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("read_lwip_drop: %-13"PRIu64" \n", lstack_stat->data.pkts.stack_stat.read_lwip_drop); - printf("app_write: %-18"PRIu64" ", lstack_stat->data.pkts.wakeup_stat.app_write_cnt); - printf("write_lwip: %-17"PRIu64" ", lstack_stat->data.pkts.stack_stat.write_lwip_cnt); -- printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.app_write_idlefail); -+ printf("app_write_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.wakeup_stat.app_write_rpc); - printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list_cnt); - printf("send_list: %-18"PRIu64" ", lstack_stat->data.pkts.send_list_cnt); - printf("conn_num: %-19hu \n", lstack_stat->data.pkts.conn_num); -@@ -875,8 +875,8 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - printf("Active Internet connections (servers and established)\n"); - do { - printf("\n------ stack tid: %6u ------\n", stat->tid); -- printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt fd Local Address " -- " Foreign Address State\n"); -+ printf("No. Proto lwip_recv recv_ring recv_all in_send send_ring send_back_cnt send_all " -+ "fd Local Address Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { -@@ -885,20 +885,21 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%-7d%s:%hu %s:%hu %s\n", i, conn_info->recv_cnt, -- conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt, -+ printf("%-6utcp %-11u%-11u%-10lu%-9u%-11u%-15d%-10lu%-7d%s:%hu %s:%hu %s\n", i, -+ conn_info->recv_cnt, conn_info->recv_ring_cnt, conn_info->recv_all, conn_info->in_send, -+ conn_info->send_ring_cnt, conn_info->send_back_cnt, conn_info->send_all, - conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-50u%-7d%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-57u%-7d%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, - conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, conn_info->state); - } -- unread_pkts += conn_info->recv_ring_cnt; -- unsend_pkts += conn_info->send_ring_cnt; -+ unread_pkts += conn_info->recv_ring_cnt + conn_info->recv_cnt; -+ unsend_pkts += conn_info->send_ring_cnt + conn_info->in_send + conn_info->send_back_cnt; - } - if (conn->conn_num > 0) { - printf("Total unread pkts:%u unsend pkts:%u\n", unread_pkts, unsend_pkts); --- -2.23.0 - diff --git a/0149-expand-rxtx-mbuf-pool.patch b/0149-expand-rxtx-mbuf-pool.patch deleted file mode 100644 index a4d592f..0000000 --- a/0149-expand-rxtx-mbuf-pool.patch +++ /dev/null @@ -1,25 +0,0 @@ -From a056a039d37ba93b1a3859da28156f86fc914090 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sat, 3 Dec 2022 22:57:13 +0800 -Subject: [PATCH] expand rxtx mbuf pool - ---- - src/lstack/include/lstack_dpdk.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index c042ef5..54b8fc2 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -15,7 +15,7 @@ - - #include "gazelle_opt.h" - --#define RXTX_NB_MBUF (256 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ -+#define RXTX_NB_MBUF (512 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ - #define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define KNI_NB_MBUF (DEFAULT_RING_SIZE << 4) - --- -2.23.0 - diff --git a/0150-add-pdump-support-in-ltran.patch b/0150-add-pdump-support-in-ltran.patch deleted file mode 100644 index 79135ce..0000000 --- a/0150-add-pdump-support-in-ltran.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 4e7af8dfba06983f5907478c560df479b0418a2a Mon Sep 17 00:00:00 2001 -From: kircher -Date: Mon, 12 Dec 2022 16:22:15 +0800 -Subject: [PATCH] add pdump support in ltran - ---- - src/ltran/CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt -index 9c6751c..1c82dae 100644 ---- a/src/ltran/CMakeLists.txt -+++ b/src/ltran/CMakeLists.txt -@@ -53,7 +53,7 @@ set_target_properties(ltran PROPERTIES LINK_FLAGS "-L$ENV{DPDK_LIB_PATH} -Wl,--w - -Wl,-lrte_mempool_dpaa2 -Wl,-lrte_net_af_packet -Wl,-lrte_net_ark -Wl,-lrte_net_atlantic -Wl,-lrte_net_axgbe \ - -Wl,-lrte_net_bnxt -Wl,-lrte_net_bond -Wl,-lrte_net_cxgbe -Wl,-lrte_net_dpaa -Wl,-lrte_net_dpaa2 -Wl,-lrte_net_e1000 -Wl,-lrte_net_ena \ - -Wl,-lrte_net_enetc -Wl,-lrte_net_enic -Wl,-lrte_net_failsafe -Wl,-lrte_net_i40e -Wl,-lrte_net_hinic -Wl,-lrte_net_ixgbe -Wl,-lrte_net_kni \ -- -Wl,-lrte_net_nfp -Wl,-lrte_net_null -Wl,-lpcap -Wl,-lrte_net_qede -Wl,-lrte_net_ring -Wl,-lrte_net_softnic \ -+ -Wl,-lrte_net_nfp -Wl,-lrte_net_null -Wl,-lpcap -Wl,-lrte_net_qede -Wl,-lrte_net_ring -Wl,-lrte_net_softnic -Wl,-lrte_net_pcap \ - -Wl,-lrte_net_tap -Wl,-lrte_net_vdev_netvsc -Wl,-lrte_net_virtio -Wl,-lrte_net_vhost \ - -Wl,-lrte_bus_vmbus -Wl,-lrte_net_netvsc -Wl,-lrte_mempool_octeontx -Wl,-lrte_net_octeontx \ - -Wl,-lrte_bus_ifpga -Wl,-lrte_stack -Wl,-lrte_telemetry\ --- -2.33.0 - diff --git a/0151-dfx-gazellectl-add-pcb-wins-info.patch b/0151-dfx-gazellectl-add-pcb-wins-info.patch deleted file mode 100644 index 3567785..0000000 --- a/0151-dfx-gazellectl-add-pcb-wins-info.patch +++ /dev/null @@ -1,222 +0,0 @@ -From 0a034f7bf644660c09a12af6c5e5d4cc3e1521d2 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 12 Dec 2022 11:37:45 +0800 -Subject: [PATCH 1/4] dfx:gazellectl add pcb wins info - ---- - src/common/gazelle_dfx_msg.h | 12 ++++++--- - src/lstack/core/lstack_lwip.c | 49 ++++++++++++++--------------------- - src/ltran/ltran_dfx.c | 21 +++++++++------ - 3 files changed, 42 insertions(+), 40 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 0bdd238..d14f1b9 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -157,10 +157,16 @@ struct gazelle_stat_lstack_conn_info { - uint32_t send_ring_cnt; - uint32_t recv_ring_cnt; - uint32_t tcp_sub_state; -- uint32_t send_back_cnt; -+ uint32_t cwn; -+ uint32_t rcv_wnd; -+ uint32_t snd_wnd; -+ uint32_t snd_buf; -+ uint32_t lastack; -+ uint32_t snd_nxt; - int32_t fd; -- uint64_t recv_all; -- uint64_t send_all; -+ uint32_t events; -+ uint32_t epoll_events; -+ uint32_t eventlist; - }; - - struct gazelle_stat_lstack_conn { -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 2cda2d9..d4a2861 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -125,21 +125,22 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u - } - - /* true: need replenish again */ --static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring) -+static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring, uint32_t replenish_cnt) - { - void *pbuf[SOCK_SEND_RING_SIZE]; - -- uint32_t replenish_cnt = gazelle_ring_free_count(ring); -- - uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); - if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { - stack->stats.tx_allocmbuf_fail++; - return true; - } - -- for (uint32_t i = 0; i < alloc_num; i++) { -+ uint32_t i = 0; -+ for (; i < alloc_num - 1; i++) { -+ rte_prefetch0(mbuf_to_pbuf((void *)pbuf[i + 1])); - pbuf[i] = init_mbuf_to_pbuf(pbuf[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - } -+ pbuf[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbuf[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - - uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, alloc_num); - for (uint32_t i = num; i < alloc_num; i++) { -@@ -173,7 +174,7 @@ void gazelle_init_sock(int32_t fd) - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -- (void)replenish_send_idlembuf(stack, sock->send_ring); -+ (void)replenish_send_idlembuf(stack, sock->send_ring, RING_SIZE(SOCK_SEND_RING_SIZE)); - - sock->stack = stack; - sock->stack->conn_num++; -@@ -297,7 +298,6 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8 - void write_lwip_over(struct lwip_sock *sock) - { - sock->send_pre_del = NULL; -- sock->send_all++; - sock->stack->stats.write_lwip_cnt++; - } - -@@ -363,10 +363,8 @@ static inline ssize_t app_direct_write(struct protocol_stack *stack, struct lwip - pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - pbufs[i - 1]->next = pbufs[i]; - } -- if (write_num > 1) { -- pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -- pbufs[i - 1]->next = pbufs[i]; -- } -+ pbufs[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbufs[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); -+ pbufs[i - 1]->next = pbufs[i]; - - ssize_t send_len = do_app_write(pbufs, buf, len, write_num); - -@@ -543,8 +541,9 @@ static inline bool replenish_send_ring(struct protocol_stack *stack, struct lwip - { - bool replenish_again = false; - -- if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) { -- replenish_again = replenish_send_idlembuf(stack, sock->send_ring); -+ uint32_t replenish_cnt = gazelle_ring_free_count(sock->send_ring); -+ if (replenish_cnt >= SOCK_SEND_REPLENISH_THRES) { -+ replenish_again = replenish_send_idlembuf(stack, sock->send_ring, replenish_cnt); - } - - if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { -@@ -701,7 +700,6 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); - } - -- sock->recv_all += read_count; - sock->stack->stats.read_lwip_cnt += read_count; - if (recv_len == 0) { - GAZELLE_RETURN(EAGAIN); -@@ -982,19 +980,6 @@ void gazelle_connected_callback(struct netconn *conn) - add_sock_event(sock, EPOLLOUT); - } - --static uint32_t send_back_count(struct lwip_sock *sock) --{ -- uint32_t count = 0; -- struct pbuf *pbuf = sock->send_lastdata; -- -- while (pbuf) { -- count++; -- pbuf = pbuf->next; -- } -- -- return count; --} -- - static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const struct tcp_pcb *pcb) - { - struct netconn *netconn = (struct netconn *)pcb->callback_arg; -@@ -1005,6 +990,12 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - conn->r_port = pcb->remote_port; - conn->in_send = pcb->snd_queuelen; - conn->tcp_sub_state = pcb->state; -+ conn->cwn = pcb->cwnd; -+ conn->rcv_wnd = pcb->rcv_wnd; -+ conn->snd_wnd = pcb->snd_wnd; -+ conn->snd_buf = pcb->snd_buf; -+ conn->lastack = pcb->lastack; -+ conn->snd_nxt = pcb->snd_nxt; - - if (netconn != NULL && netconn->recvmbox != NULL) { - conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring); -@@ -1014,10 +1005,10 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) { - conn->recv_ring_cnt = gazelle_ring_readable_count(sock->recv_ring); - conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0; -- conn->send_back_cnt = send_back_count(sock); - conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring); -- conn->recv_all = sock->recv_all; -- conn->send_all = sock->send_all; -+ conn->events = sock->events; -+ conn->epoll_events = sock->epoll_events; -+ conn->eventlist = !list_is_null(&sock->event_list); - } - } - } -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 54839af..3801f19 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -12,6 +12,7 @@ - - #include - #include -+#include - - #include - #include -@@ -871,12 +872,14 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - char str_rip[GAZELLE_SUBNET_LENGTH_MAX] = {0}; - struct gazelle_stack_dfx_data *stat = (struct gazelle_stack_dfx_data *)buf; - struct gazelle_stat_lstack_conn *conn = &stat->data.conn; -+ struct timeval time = {0}; -+ gettimeofday(&time, NULL); - - printf("Active Internet connections (servers and established)\n"); - do { -- printf("\n------ stack tid: %6u ------\n", stat->tid); -- printf("No. Proto lwip_recv recv_ring recv_all in_send send_ring send_back_cnt send_all " -- "fd Local Address Foreign Address State\n"); -+ printf("\n------ stack tid: %6u ------time=%lu\n", stat->tid, time.tv_sec * 1000000 + time.tv_usec); -+ printf("No. Proto lwip_recv recv_ring in_send send_ring cwn rcv_wnd snd_wnd snd_buf snd_nxt" -+ " lastack events epoll_ev evlist fd Local Address Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { -@@ -885,10 +888,12 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-11u%-11u%-10lu%-9u%-11u%-15d%-10lu%-7d%s:%hu %s:%hu %s\n", i, -- conn_info->recv_cnt, conn_info->recv_ring_cnt, conn_info->recv_all, conn_info->in_send, -- conn_info->send_ring_cnt, conn_info->send_back_cnt, conn_info->send_all, -- conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, -+ printf("%-6utcp %-10u%-10u%-8u%-10u%-9d%-9d%-10d%-10d%-15u%-15u%-10x%-10x%-7d%-7d" -+ "%s:%hu %s:%hu %s\n", i, conn_info->recv_cnt, conn_info->recv_ring_cnt, conn_info->in_send, -+ conn_info->send_ring_cnt, conn_info->cwn, conn_info->rcv_wnd, conn_info->snd_wnd, -+ conn_info->snd_buf, conn_info->snd_nxt, conn_info->lastack, conn_info->events, -+ conn_info->epoll_events, conn_info->eventlist, conn_info->fd, -+ inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -@@ -899,7 +904,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, conn_info->state); - } - unread_pkts += conn_info->recv_ring_cnt + conn_info->recv_cnt; -- unsend_pkts += conn_info->send_ring_cnt + conn_info->in_send + conn_info->send_back_cnt; -+ unsend_pkts += conn_info->send_ring_cnt + conn_info->in_send; - } - if (conn->conn_num > 0) { - printf("Total unread pkts:%u unsend pkts:%u\n", unread_pkts, unsend_pkts); --- -2.23.0 - diff --git a/0152-fix-genarate-out-event-untimely.patch b/0152-fix-genarate-out-event-untimely.patch deleted file mode 100644 index 2cd699e..0000000 --- a/0152-fix-genarate-out-event-untimely.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 5b3acd311fe20e9055b5faeced028e3099773e5b Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Mon, 12 Dec 2022 11:48:31 +0800 -Subject: [PATCH 2/4] fix genarate out event untimely - ---- - src/lstack/core/lstack_lwip.c | 23 ++++++++++++----------- - 1 file changed, 12 insertions(+), 11 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d4a2861..0aaae30 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -125,25 +125,29 @@ static struct pbuf *init_mbuf_to_pbuf(struct rte_mbuf *mbuf, pbuf_layer layer, u - } - - /* true: need replenish again */ --static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring, uint32_t replenish_cnt) -+static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_ring *ring) - { - void *pbuf[SOCK_SEND_RING_SIZE]; - -- uint32_t alloc_num = LWIP_MIN(replenish_cnt, RING_SIZE(SOCK_SEND_RING_SIZE)); -- if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, alloc_num) != 0) { -+ uint32_t replenish_cnt = gazelle_ring_free_count(ring); -+ if (replenish_cnt == 0) { -+ return false; -+ } -+ -+ if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, replenish_cnt) != 0) { - stack->stats.tx_allocmbuf_fail++; - return true; - } - - uint32_t i = 0; -- for (; i < alloc_num - 1; i++) { -+ for (; i < replenish_cnt - 1; i++) { - rte_prefetch0(mbuf_to_pbuf((void *)pbuf[i + 1])); - pbuf[i] = init_mbuf_to_pbuf(pbuf[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - } - pbuf[i] = init_mbuf_to_pbuf((struct rte_mbuf *)pbuf[i], PBUF_TRANSPORT, MBUF_MAX_DATA_LEN, PBUF_RAM); - -- uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, alloc_num); -- for (uint32_t i = num; i < alloc_num; i++) { -+ uint32_t num = gazelle_ring_sp_enqueue(ring, pbuf, replenish_cnt); -+ for (uint32_t i = num; i < replenish_cnt; i++) { - pbuf_free(pbuf[i]); - } - -@@ -174,7 +178,7 @@ void gazelle_init_sock(int32_t fd) - LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; - } -- (void)replenish_send_idlembuf(stack, sock->send_ring, RING_SIZE(SOCK_SEND_RING_SIZE)); -+ (void)replenish_send_idlembuf(stack, sock->send_ring); - - sock->stack = stack; - sock->stack->conn_num++; -@@ -541,10 +545,7 @@ static inline bool replenish_send_ring(struct protocol_stack *stack, struct lwip - { - bool replenish_again = false; - -- uint32_t replenish_cnt = gazelle_ring_free_count(sock->send_ring); -- if (replenish_cnt >= SOCK_SEND_REPLENISH_THRES) { -- replenish_again = replenish_send_idlembuf(stack, sock->send_ring, replenish_cnt); -- } -+ replenish_again = replenish_send_idlembuf(stack, sock->send_ring); - - if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) { - add_sock_event(sock, EPOLLOUT); --- -2.23.0 - diff --git a/0153-rxtx-mbuf-pool-size-config-by-conf.patch b/0153-rxtx-mbuf-pool-size-config-by-conf.patch deleted file mode 100644 index ec49a47..0000000 --- a/0153-rxtx-mbuf-pool-size-config-by-conf.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 00252d8017d1f58787052b74ec8cd434ea3cacc1 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 13 Dec 2022 22:37:12 +0800 -Subject: [PATCH 4/4] rxtx mbuf pool size config by conf - ---- - src/common/gazelle_opt.h | 2 ++ - src/lstack/core/lstack_cfg.c | 18 ++++++++++++++++++ - src/lstack/core/lstack_dpdk.c | 4 ++-- - src/lstack/include/lstack_cfg.h | 1 + - src/lstack/include/lstack_dpdk.h | 1 - - src/lstack/lstack.conf | 3 +++ - 6 files changed, 26 insertions(+), 3 deletions(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index aac1ec9..a23b329 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -47,6 +47,8 @@ - #define RTE_TEST_TX_DESC_DEFAULT 2048 - #define RTE_TEST_RX_DESC_DEFAULT 4096 - -+#define RXTX_NB_MBUF_DEFAULT (128 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ -+ - #define MBUF_MAX_DATA_LEN 1460 - - #define DPDK_PKT_BURST_SIZE 512 -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 52ff3f5..5a6eb2a 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -57,6 +57,7 @@ static int32_t parse_kni_switch(void); - static int32_t parse_listen_shadow(void); - static int32_t parse_app_bind_numa(void); - static int32_t parse_unix_prefix(void); -+static int32_t parse_rxtx_pool_size(void); - - struct config_vector_t { - const char *name; -@@ -77,6 +78,7 @@ static struct config_vector_t g_config_tbl[] = { - { "listen_shadow", parse_listen_shadow }, - { "app_bind_numa", parse_app_bind_numa }, - { "unix_prefix", parse_unix_prefix }, -+ { "mbuf_pool_size", parse_rxtx_pool_size }, - { NULL, NULL } - }; - -@@ -698,6 +700,22 @@ static int32_t parse_use_ltran(void) - return 0; - } - -+static int32_t parse_rxtx_pool_size(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "mbuf_pool_size"); -+ if (arg == NULL) { -+ g_config_params.mbuf_pool_size = RXTX_NB_MBUF_DEFAULT; -+ return 0; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ g_config_params.mbuf_pool_size = val; -+ -+ return 0; -+} -+ - static int32_t parse_listen_shadow(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index b9f2793..4be31c3 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -178,8 +178,8 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return -1; - } - -- stack->rxtx_pktmbuf_pool = create_pktmbuf_mempool("rxtx_mbuf", RXTX_NB_MBUF / stack_num, RXTX_CACHE_SZ, -- stack->queue_id); -+ stack->rxtx_pktmbuf_pool = create_pktmbuf_mempool("rxtx_mbuf", -+ get_global_cfg_params()->mbuf_pool_size / stack_num, RXTX_CACHE_SZ, stack->queue_id); - if (stack->rxtx_pktmbuf_pool == NULL) { - return -1; - } -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 3864250..053208b 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -73,6 +73,7 @@ struct cfg_params { - uint16_t lpm_rx_pkts; - uint32_t lpm_detect_ms; - uint32_t lpm_pkts_in_detect; -+ uint32_t mbuf_pool_size; - bool use_ltran; // ture:lstack read from nic false:read form ltran - bool kni_switch; - bool listen_shadow; // true:listen in all stack thread. false:listen in one stack thread. -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index 54b8fc2..a0f09af 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -15,7 +15,6 @@ - - #include "gazelle_opt.h" - --#define RXTX_NB_MBUF (512 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ - #define RXTX_CACHE_SZ (VDEV_RX_QUEUE_SZ) - #define KNI_NB_MBUF (DEFAULT_RING_SIZE << 4) - -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index 1a91aee..22d519e 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -15,6 +15,9 @@ kni_switch=0 - - low_power_mode=0 - listen_shadow=0 -+ -+#number of mbuf for tx and rx. per mbuf is 2560 Byte. -+#mbuf_pool_size = 256000 - - num_cpus="2" - num_wakeup="3" --- -2.23.0 - diff --git a/0154-fix-kernel-event-thread-bind-numa-failed.patch b/0154-fix-kernel-event-thread-bind-numa-failed.patch deleted file mode 100644 index 766f0ba..0000000 --- a/0154-fix-kernel-event-thread-bind-numa-failed.patch +++ /dev/null @@ -1,134 +0,0 @@ -From be7a7d55a672a72328f1a6844c610152ea142053 Mon Sep 17 00:00:00 2001 -From: jianheng -Date: Wed, 14 Dec 2022 09:51:36 +0800 -Subject: [PATCH] fix kernel event thread bind numa failed - ---- - src/lstack/core/lstack_cfg.c | 13 +++++------- - src/lstack/core/lstack_protocol_stack.c | 28 ++++++++++--------------- - src/lstack/include/lstack_cfg.h | 3 ++- - 3 files changed, 18 insertions(+), 26 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 1731c0f..81452e8 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -329,11 +329,10 @@ static int32_t stack_idle_cpuset(struct protocol_stack *stack, cpu_set_t *exclud - return 0; - } - --int32_t init_stack_numa_cpuset(void) -+int32_t init_stack_numa_cpuset(struct protocol_stack *stack) - { - int32_t ret; - struct cfg_params *cfg = get_global_cfg_params(); -- struct protocol_stack_group *stack_group = get_protocol_stack_group(); - - cpu_set_t stack_cpuset; - CPU_ZERO(&stack_cpuset); -@@ -344,12 +343,10 @@ int32_t init_stack_numa_cpuset(void) - CPU_SET(cfg->wakeup[idx], &stack_cpuset); - } - -- for (int32_t idx = 0; idx < stack_group->stack_num; ++idx) { -- ret = stack_idle_cpuset(stack_group->stacks[idx], &stack_cpuset); -- if (ret < 0) { -- LSTACK_LOG(ERR, LSTACK, "thread_get_cpuset stack_%d failed\n", idx); -- return -1; -- } -+ ret = stack_idle_cpuset(stack, &stack_cpuset); -+ if (ret < 0) { -+ LSTACK_LOG(ERR, LSTACK, "thread_get_cpuset stack(%u) failed\n", stack->tid); -+ return -1; - } - - return 0; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index d5830f1..c0925a1 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -352,21 +352,18 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - } - - if (init_stack_value(stack, queue_id) != 0) { -- sem_post(&stack_group->thread_phase1); -- free(stack); -- return NULL; -+ goto END; - } - -+ if (init_stack_numa_cpuset(stack) < 0) { -+ goto END; -+ } - if (create_affiliate_thread(queue_id, stack_group->wakeup_enable) < 0) { -- sem_post(&stack_group->thread_phase1); -- free(stack); -- return NULL; -+ goto END; - } - - if (thread_affinity_init(stack->cpu_id) != 0) { -- sem_post(&stack_group->thread_phase1); -- free(stack); -- return NULL; -+ goto END; - } - RTE_PER_LCORE(_lcore_id) = stack->cpu_id; - -@@ -376,9 +373,7 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - - if (use_ltran()) { - if (client_reg_thrd_ring() != 0) { -- sem_post(&stack_group->thread_phase1); -- free(stack); -- return NULL; -+ goto END; - } - } - -@@ -394,6 +389,10 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id) - } - - return stack; -+END: -+ sem_post(&stack_group->thread_phase1); -+ free(stack); -+ return NULL; - } - - static void wakeup_kernel_event(struct protocol_stack *stack) -@@ -526,11 +525,6 @@ int32_t init_protocol_stack(void) - return -1; - } - -- ret = init_stack_numa_cpuset(); -- if (ret < 0) { -- return -1; -- } -- - return 0; - } - -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index 7075bbc..fe92bc9 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -16,6 +16,7 @@ - - #include - -+#include "lstack_protocol_stack.h" - #include "gazelle_opt.h" - - #define BASE_BIN_SCALE 2 -@@ -97,6 +98,6 @@ int gazelle_copy_param(const char *param, bool is_double, - int *argc, char argv[][PATH_MAX]); - - int match_host_addr(uint32_t ipv4); --int32_t init_stack_numa_cpuset(void); -+int32_t init_stack_numa_cpuset(struct protocol_stack *stack); - - #endif /* GAZELLE_NET_CFG_H */ --- -2.33.0 - diff --git a/0155-stack-thread-parms-config-by-conf.patch b/0155-stack-thread-parms-config-by-conf.patch deleted file mode 100644 index 681ccde..0000000 --- a/0155-stack-thread-parms-config-by-conf.patch +++ /dev/null @@ -1,375 +0,0 @@ -From 17b822be314e95aa6e32d019143b606df06545c6 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 15 Dec 2022 17:54:42 +0800 -Subject: [PATCH] aaaa - ---- - src/lstack/core/lstack_cfg.c | 94 ++++++++++++++++++++++ - src/lstack/core/lstack_protocol_stack.c | 33 ++++---- - src/lstack/include/lstack_cfg.h | 4 + - src/lstack/include/lstack_ethdev.h | 2 +- - src/lstack/include/lstack_protocol_stack.h | 1 + - src/lstack/lstack.conf | 18 ++++- - src/lstack/netif/lstack_ethdev.c | 34 ++++---- - 7 files changed, 149 insertions(+), 37 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index dabb74e..52a34a4 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -58,6 +58,10 @@ static int32_t parse_listen_shadow(void); - static int32_t parse_app_bind_numa(void); - static int32_t parse_unix_prefix(void); - static int32_t parse_rxtx_pool_size(void); -+static int32_t parse_send_connect_number(void); -+static int32_t parse_read_connect_number(void); -+static int32_t parse_rpc_number(void); -+static int32_t parse_nic_read_number(void); - - struct config_vector_t { - const char *name; -@@ -79,6 +83,10 @@ static struct config_vector_t g_config_tbl[] = { - { "app_bind_numa", parse_app_bind_numa }, - { "unix_prefix", parse_unix_prefix }, - { "mbuf_pool_size", parse_rxtx_pool_size }, -+ { "send_connect_number", parse_send_connect_number }, -+ { "read_connect_number", parse_read_connect_number }, -+ { "rpc_number", parse_rpc_number }, -+ { "nic_read_number", parse_nic_read_number }, - { NULL, NULL } - }; - -@@ -704,15 +712,101 @@ static int32_t parse_rxtx_pool_size(void) - arg = config_lookup(&g_config, "mbuf_pool_size"); - if (arg == NULL) { - g_config_params.mbuf_pool_size = RXTX_NB_MBUF_DEFAULT; -+ LSTACK_PRE_LOG(LSTACK_ERR, "use default mbuf_pool_size %d.\n", RXTX_NB_MBUF_DEFAULT); - return 0; - } - - int32_t val = config_setting_get_int(arg); -+ if (val <= 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg mbuf_pool_size %d invaild.\n", val); -+ return -EINVAL; -+ } -+ - g_config_params.mbuf_pool_size = val; - - return 0; - } - -+static int32_t parse_send_connect_number(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "send_connect_number"); -+ if (arg == NULL) { -+ return -EINVAL; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ if (val <= 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg send_connect_number %d invaild.\n", val); -+ return -EINVAL; -+ } -+ -+ g_config_params.send_connect_number = val; -+ -+ return 0; -+} -+ -+static int32_t parse_read_connect_number(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "read_connect_number"); -+ if (arg == NULL) { -+ return -EINVAL; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ if (val <= 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg read_connect_number %d invaild.\n", val); -+ return -EINVAL; -+ } -+ -+ g_config_params.read_connect_number = val; -+ -+ return 0; -+} -+ -+static int32_t parse_rpc_number(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "rpc_number"); -+ if (arg == NULL) { -+ return -EINVAL; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ if (val <= 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg rpc_number %d invaild.\n", val); -+ return -EINVAL; -+ } -+ -+ g_config_params.rpc_number = val; -+ -+ return 0; -+} -+ -+static int32_t parse_nic_read_number(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "nic_read_number"); -+ if (arg == NULL) { -+ return -EINVAL; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ if (val <= 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg nic_read_number %d invaild.\n", val); -+ return -EINVAL; -+ } -+ -+ g_config_params.nic_read_number = val; -+ -+ return 0; -+} -+ - static int32_t parse_listen_shadow(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index c0925a1..2a866e0 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -36,9 +36,6 @@ - #include "posix/lstack_epoll.h" - #include "lstack_stack_stat.h" - --#define READ_LIST_MAX 32 --#define SEND_LIST_MAX 32 --#define HANDLE_RPC_MSG_MAX 32 - #define KERNEL_EVENT_100us 100 - - static PER_THREAD struct protocol_stack *g_stack_p = NULL; -@@ -419,8 +416,14 @@ static void wakeup_kernel_event(struct protocol_stack *stack) - static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -- bool use_ltran_flag = use_ltran(); -- bool kni_switch = get_global_cfg_params()->kni_switch; -+ struct cfg_params *cfg = get_global_cfg_params(); -+ bool use_ltran_flag = cfg->use_ltran;; -+ bool kni_switch = cfg->kni_switch; -+ uint32_t send_connect_number = cfg->send_connect_number; -+ uint32_t read_connect_number = cfg->read_connect_number; -+ uint32_t rpc_number = cfg->rpc_number; -+ uint32_t nic_read_number = cfg->nic_read_number; -+ uint16_t low_power_mod = cfg->low_power_mod; - uint32_t wakeup_tick = 0; - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - bool wakeup_thread_enable = stack_group->wakeup_enable; -@@ -438,30 +441,30 @@ static void* gazelle_stack_thread(void *arg) - LSTACK_LOG(INFO, LSTACK, "stack_%02hu init success\n", queue_id); - - for (;;) { -- poll_rpc_msg(stack, HANDLE_RPC_MSG_MAX); -+ poll_rpc_msg(stack, rpc_number); - -- gazelle_eth_dev_poll(stack, use_ltran_flag); -+ gazelle_eth_dev_poll(stack, use_ltran_flag, nic_read_number); - -- read_recv_list(stack, READ_LIST_MAX); -+ read_recv_list(stack, read_connect_number); - -- send_stack_list(stack, SEND_LIST_MAX); -+ send_stack_list(stack, send_connect_number); - - if ((wakeup_tick & 0xf) == 0) { - wakeup_kernel_event(stack); - wakeup_stack_epoll(stack, wakeup_thread_enable); - } - -- /* KNI requests are generally low-rate I/Os, -- * so processing KNI requests only in the thread with queue_id No.0 is sufficient. */ -- if (kni_switch && !queue_id && !(wakeup_tick & 0xfff)) { -- rte_kni_handle_request(get_gazelle_kni()); -- } -+ /* KNI requests are generally low-rate I/Os, -+ * so processing KNI requests only in the thread with queue_id No.0 is sufficient. */ -+ if (kni_switch && !queue_id && !(wakeup_tick & 0xfff)) { -+ rte_kni_handle_request(get_gazelle_kni()); -+ } - - wakeup_tick++; - - sys_timer_run(); - -- if (get_global_cfg_params()->low_power_mod != 0) { -+ if (low_power_mod != 0) { - low_power_idling(stack); - } - } -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index e0d488f..e33a484 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -75,6 +75,10 @@ struct cfg_params { - uint32_t lpm_detect_ms; - uint32_t lpm_pkts_in_detect; - uint32_t mbuf_pool_size; -+ uint32_t send_connect_number; -+ uint32_t read_connect_number; -+ uint32_t rpc_number; -+ uint32_t nic_read_number; - bool use_ltran; // ture:lstack read from nic false:read form ltran - bool kni_switch; - bool listen_shadow; // true:listen in all stack thread. false:listen in one stack thread. -diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h -index c64b4a0..0b53cde 100644 ---- a/src/lstack/include/lstack_ethdev.h -+++ b/src/lstack/include/lstack_ethdev.h -@@ -22,7 +22,7 @@ struct lstack_dev_ops { - - int32_t ethdev_init(struct protocol_stack *stack); - int32_t eth_dev_poll(void); --int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag); -+int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag, uint32_t nic_read_number); - void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack); - - #endif /* __GAZELLE_ETHDEV_H__ */ -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 68cbbfa..4cfa243 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -65,6 +65,7 @@ struct protocol_stack { - uint32_t rx_ring_used; - uint32_t tx_ring_used; - -+ struct rte_mbuf *pkts[RTE_TEST_RX_DESC_DEFAULT]; - struct list_node recv_list; - struct list_node send_list; - struct list_node wakeup_list; -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index 7d536a9..d4e9810 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -16,11 +16,23 @@ kni_switch=0 - low_power_mode=0 - listen_shadow=0 - --#number of mbuf for tx and rx. per mbuf is 2560 Byte. --#mbuf_pool_size = 256000 -+#number of mbuf pool for tx and rx. per mbuf is 2560 Byte. -+mbuf_pool_size = 256000 -+ -+#protocol stack thread per loop params -+#send connect to nic -+send_connect_number = 8 -+#read data form protocol stack into recv_ring -+read_connect_number = 8 -+#process rpc msg number -+rpc_number = 8 -+#read nic pkts number -+nic_read_number = 128 - -+#each cpu core start a protocol stack thread. - num_cpus="2" --num_wakeup="3" -+#each cpu core start a wakeup thread. -+#num_wakeup="3" - - host_addr="192.168.1.10" - mask_addr="255.255.255.0" -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 965b32f..7f1e48f 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -82,33 +82,32 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack) - } - } - --#define READ_PKTS_MAX 128 - int32_t eth_dev_poll(void) - { - uint32_t nr_pkts; -- struct rte_mbuf *pkts[READ_PKTS_MAX]; -+ struct cfg_params *cfg = get_global_cfg_params(); - struct protocol_stack *stack = get_protocol_stack(); - -- nr_pkts = stack->dev_ops.rx_poll(stack, pkts, READ_PKTS_MAX); -- if (nr_pkts == 0) { -+ nr_pkts = stack->dev_ops.rx_poll(stack, stack->pkts, cfg->nic_read_number); -+ if (nr_pkts == 0) { - return 0; - } - -- if (!use_ltran() && get_protocol_stack_group()->latency_start) { -+ if (!cfg->use_ltran && get_protocol_stack_group()->latency_start) { - uint64_t time_stamp = get_current_time(); -- time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); -- } -+ time_stamp_into_mbuf(nr_pkts, stack->pkts, time_stamp); -+ } - - for (uint32_t i = 0; i < nr_pkts; i++) { - /* copy arp into other stack */ -- if (!use_ltran()) { -- struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(pkts[i], struct rte_ether_hdr *); -+ if (!cfg->use_ltran) { -+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(stack->pkts[i], struct rte_ether_hdr *); - if (unlikely(RTE_BE16(RTE_ETHER_TYPE_ARP) == ethh->ether_type)) { -- stack_broadcast_arp(pkts[i], stack); -+ stack_broadcast_arp(stack->pkts[i], stack); - } - } - -- eth_dev_recv(pkts[i], stack); -+ eth_dev_recv(stack->pkts[i], stack); - } - - stack->stats.rx += nr_pkts; -@@ -117,31 +116,30 @@ int32_t eth_dev_poll(void) - } - - /* optimized eth_dev_poll() in lstack */ --int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag) -+int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag, uint32_t nic_read_number) - { - uint32_t nr_pkts; -- struct rte_mbuf *pkts[READ_PKTS_MAX]; - -- nr_pkts = stack->dev_ops.rx_poll(stack, pkts, READ_PKTS_MAX); -+ nr_pkts = stack->dev_ops.rx_poll(stack, stack->pkts, nic_read_number); - if (nr_pkts == 0) { - return 0; - } - - if (!use_ltran_flag && get_protocol_stack_group()->latency_start) { - uint64_t time_stamp = get_current_time(); -- time_stamp_into_mbuf(nr_pkts, pkts, time_stamp); -+ time_stamp_into_mbuf(nr_pkts, stack->pkts, time_stamp); - } - - for (uint32_t i = 0; i < nr_pkts; i++) { - /* copy arp into other stack */ - if (!use_ltran_flag) { -- struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(pkts[i], struct rte_ether_hdr *); -+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(stack->pkts[i], struct rte_ether_hdr *); - if (unlikely(RTE_BE16(RTE_ETHER_TYPE_ARP) == ethh->ether_type)) { -- stack_broadcast_arp(pkts[i], stack); -+ stack_broadcast_arp(stack->pkts[i], stack); - } - } - -- eth_dev_recv(pkts[i], stack); -+ eth_dev_recv(stack->pkts[i], stack); - } - - stack->stats.rx += nr_pkts; --- -2.23.0 - diff --git a/0156-ltran-rxtx-mbuf-pool-size-config-by-conf.patch b/0156-ltran-rxtx-mbuf-pool-size-config-by-conf.patch deleted file mode 100644 index a891b37..0000000 --- a/0156-ltran-rxtx-mbuf-pool-size-config-by-conf.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 3ed8f430fb3070404d5b77da99964623877a01dd Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Thu, 15 Dec 2022 16:35:46 +0800 -Subject: [PATCH] ltran rxtx mbuf pool size config by conf - ---- - src/ltran/ltran.conf | 3 +++ - src/ltran/ltran_ethdev.c | 18 ++++++++---------- - src/ltran/ltran_param.c | 32 ++++++++++++++++++++++++++++++++ - src/ltran/ltran_param.h | 2 ++ - src/ltran/ltran_stat.h | 2 +- - 5 files changed, 46 insertions(+), 11 deletions(-) - -diff --git a/src/ltran/ltran.conf b/src/ltran/ltran.conf -index 3c1a2bc..4bfcbef 100644 ---- a/src/ltran/ltran.conf -+++ b/src/ltran/ltran.conf -@@ -24,3 +24,6 @@ bond_macs="aa:bb:cc:dd:ee:ff" - bond_ports="0x1" - - tcp_conn_scan_interval=10 -+# number of mbuf for tx and rx. default tx is 30720, default rx is 307200. -+#rx_pool_mbuf_size = 307200 -+#tx_pool_mbuf_size = 30720 -diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c -index 45bf2ef..62a662d 100644 ---- a/src/ltran/ltran_ethdev.c -+++ b/src/ltran/ltran_ethdev.c -@@ -78,8 +78,8 @@ static int32_t ltran_log_init(void); - static int32_t ltran_eal_init(void); - static int32_t ltran_pdump_init(void); - static int32_t ltran_log_level_init(void); --static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index, uint32_t scale); --static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index, uint32_t scale); -+static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index); -+static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index); - static int32_t ltran_parse_port(void); - static int32_t ltran_mbuf_pool_init(void); - static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempool *pktmbuf_rxpool); -@@ -133,9 +133,9 @@ static int32_t ltran_pdump_init(void) - return GAZELLE_OK; - } - --static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index, uint32_t scale) -+static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index) - { -- uint32_t num_mbufs = GAZELLE_MBUFS_RX_COUNT * scale; -+ uint32_t num_mbufs = get_ltran_config()->rx_mbuf_pool_size; - - char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH] = {0}; - -@@ -151,9 +151,9 @@ static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index, u - RTE_MBUF_DEFAULT_BUF_SIZE, (int32_t)rte_socket_id()); - } - --static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index, uint32_t scale) -+static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index) - { -- const uint32_t num_mbufs = GAZELLE_MBUFS_TX_COUNT * scale; -+ const uint32_t num_mbufs = get_ltran_config()->tx_mbuf_pool_size; - - char mbuf_pool_name[GAZELLE_PKT_MBUF_POOL_NAME_LENGTH] = {0}; - -@@ -174,17 +174,15 @@ static int32_t ltran_mbuf_pool_init(void) - uint32_t bond_num = get_bond_num(); - struct rte_mempool** rxpool = get_pktmbuf_rxpool(); - struct rte_mempool** txpool = get_pktmbuf_txpool(); -- struct ltran_config* ltran_config = get_ltran_config(); -- struct port_info* port_info = get_port_info(); - - for (uint32_t i = 0; i < bond_num; i++) { -- rxpool[i] = ltran_create_rx_mbuf_pool(i, 1); -+ rxpool[i] = ltran_create_rx_mbuf_pool(i); - if (rxpool[i] == NULL) { - LTRAN_ERR("rxpool[%u] is NULL, pktmbuf_pool init failed. rte_errno: %d. \n", i, rte_errno); - return GAZELLE_ERR; - } - -- txpool[i] = ltran_create_tx_mbuf_pool(i, port_info[i].num_ports * ltran_config->bond.tx_queue_num); -+ txpool[i] = ltran_create_tx_mbuf_pool(i); - if (txpool[i] == NULL) { - LTRAN_ERR("txpool[%u] is NULL, pktmbuf_pool init failed. rte_errno: %d. \n", i, rte_errno); - return GAZELLE_ERR; -diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c -index 18854cf..1b9d82b 100644 ---- a/src/ltran/ltran_param.c -+++ b/src/ltran/ltran_param.c -@@ -43,6 +43,8 @@ - #define PARAM_BOND_MACS "bond_macs" - #define PARAM_TCP_CONN_SCAN_INTERVAL "tcp_conn_scan_interval" - #define PARAM_UNIX_PREFIX "unix_prefix" -+#define PARAM_RX_MBUF_POOL_SIZE "rx_mbuf_pool_size" -+#define PARAM_TX_MBUF_POOL_SIZE "tx_mbuf_pool_size" - - static struct ltran_config g_ltran_config = {0}; - struct ltran_config* get_ltran_config(void) -@@ -610,6 +612,34 @@ static int32_t parse_unix_prefix(const config_t *config, const char *key, struct - return GAZELLE_OK; - } - -+static int32_t parse_rx_mbuf_pool_size(const config_t *config, const char *key, struct ltran_config *ltran_config) -+{ -+ int32_t ret; -+ int32_t rx_mbuf_pool_size = 0; -+ ret = config_lookup_int(config, key, &rx_mbuf_pool_size); -+ if (ret == 0) { -+ ltran_config->rx_mbuf_pool_size = GAZELLE_MBUFS_RX_COUNT; -+ return GAZELLE_OK; -+ } -+ -+ ltran_config->rx_mbuf_pool_size = rx_mbuf_pool_size; -+ return GAZELLE_OK; -+} -+ -+static int32_t parse_tx_mbuf_pool_size(const config_t *config, const char *key, struct ltran_config *ltran_config) -+{ -+ int32_t ret; -+ int32_t tx_mbuf_pool_size = 0; -+ ret = config_lookup_int(config, key, &tx_mbuf_pool_size); -+ if (ret == 0) { -+ ltran_config->tx_mbuf_pool_size = GAZELLE_MBUFS_TX_COUNT; -+ return GAZELLE_OK; -+ } -+ -+ ltran_config->tx_mbuf_pool_size = tx_mbuf_pool_size; -+ return GAZELLE_OK; -+} -+ - struct param_parser g_param_parse_tbl[] = { - {PARAM_FORWARD_KIT_ARGS, parse_forward_kit_args}, - {PARAM_DISPATCH_MAX_CLIENT, parse_dispatch_max_client}, -@@ -625,6 +655,8 @@ struct param_parser g_param_parse_tbl[] = { - {PARAM_TCP_CONN_SCAN_INTERVAL, parse_tcp_conn_scan_interval}, - {PARAM_KNI_SWITCH, parse_kni_switch}, - {PARAM_UNIX_PREFIX, parse_unix_prefix}, -+ {PARAM_RX_MBUF_POOL_SIZE, parse_rx_mbuf_pool_size}, -+ {PARAM_TX_MBUF_POOL_SIZE, parse_tx_mbuf_pool_size}, - }; - - int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config) -diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h -index 6f013d5..40a92b1 100644 ---- a/src/ltran/ltran_param.h -+++ b/src/ltran/ltran_param.h -@@ -58,6 +58,8 @@ struct ltran_config { - } log; - char unix_socket_filename[NAME_MAX]; - char dfx_socket_filename[NAME_MAX]; -+ uint32_t rx_mbuf_pool_size; -+ uint32_t tx_mbuf_pool_size; - }; - - int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config); -diff --git a/src/ltran/ltran_stat.h b/src/ltran/ltran_stat.h -index f91b0c4..16d03a1 100644 ---- a/src/ltran/ltran_stat.h -+++ b/src/ltran/ltran_stat.h -@@ -23,7 +23,7 @@ - * When doing reads from the NIC or the client queues, - * use this batch size - */ --#define BACKUP_SIZE_FACTOR (256) -+#define BACKUP_SIZE_FACTOR (1024) - #define RING_MAX_SIZE (512) /* determined by g_mbuf_ring.rx_ring in func create_shared_ring in file dpdk.c */ - #define PACKET_READ_SIZE (32) - #define BACKUP_MBUF_SIZE (BACKUP_SIZE_FACTOR * PACKET_READ_SIZE) --- -2.33.0 - diff --git a/0157-move-select_thread_path-after-posix_api_init.patch b/0157-move-select_thread_path-after-posix_api_init.patch deleted file mode 100644 index d7ea8df..0000000 --- a/0157-move-select_thread_path-after-posix_api_init.patch +++ /dev/null @@ -1,43 +0,0 @@ -From bd238ab678150c216d672409a5ddb4b7dd778fec Mon Sep 17 00:00:00 2001 -From: kircher -Date: Fri, 16 Dec 2022 16:53:21 +0800 -Subject: [PATCH] move select_thread_path after posix_api_init - ---- - src/lstack/api/lstack_wrap.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c -index 2eeda6b..d976f74 100644 ---- a/src/lstack/api/lstack_wrap.c -+++ b/src/lstack/api/lstack_wrap.c -@@ -50,18 +50,21 @@ bool select_thread_path(void); - - static enum KERNEL_LWIP_PATH select_path(int fd) - { -- if (!select_thread_path()) { -- return PATH_KERNEL; -- } -- - if (unlikely(posix_api == NULL)) { -- /* posix api maybe call before gazelle init */ -+ /* -+ * posix api maybe call before gazelle init -+ * So, we must call posix_api_init at the head of select_path -+ */ - if (posix_api_init() != 0) { - LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n"); - } - return PATH_KERNEL; - } - -+ if (!select_thread_path()) { -+ return PATH_KERNEL; -+ } -+ - if (unlikely(posix_api->ues_posix)) { - return PATH_KERNEL; - } --- -2.33.0 - diff --git a/0158-add-RXTX_NB_MBUF_MAX-to-limit-mbuf_pool_size-to-its-.patch b/0158-add-RXTX_NB_MBUF_MAX-to-limit-mbuf_pool_size-to-its-.patch deleted file mode 100644 index ac91772..0000000 --- a/0158-add-RXTX_NB_MBUF_MAX-to-limit-mbuf_pool_size-to-its-.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 546cde6494913a9d5b1c12578385ca586ee999ef Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sat, 17 Dec 2022 15:25:26 +0800 -Subject: [PATCH] add RXTX_NB_MBUF_MAX to limit mbuf_pool_size to its range - ---- - src/common/gazelle_opt.h | 1 + - src/lstack/core/lstack_cfg.c | 4 ++-- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index a23b329..7e55422 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -48,6 +48,7 @@ - #define RTE_TEST_RX_DESC_DEFAULT 4096 - - #define RXTX_NB_MBUF_DEFAULT (128 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ -+#define RXTX_NB_MBUF_MAX (2560 * 2000) - - #define MBUF_MAX_DATA_LEN 1460 - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 52a34a4..9c23115 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -717,8 +717,8 @@ static int32_t parse_rxtx_pool_size(void) - } - - int32_t val = config_setting_get_int(arg); -- if (val <= 0) { -- LSTACK_PRE_LOG(LSTACK_ERR, "cfg mbuf_pool_size %d invaild.\n", val); -+ if (val <= 0 || val > RXTX_NB_MBUF_MAX) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg mbuf_pool_size %d invaild, it should be in (0,%d].\n", val, RXTX_NB_MBUF_MAX); - return -EINVAL; - } - --- -2.33.0 - diff --git a/0159-stack-thread-params-default-val.patch b/0159-stack-thread-params-default-val.patch deleted file mode 100644 index aa0bd47..0000000 --- a/0159-stack-thread-params-default-val.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 850f4dced20b3bcbb838239037ac230d99576e4f Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 16 Dec 2022 17:31:41 +0800 -Subject: [PATCH] stack thread params default val - ---- - src/common/gazelle_opt.h | 2 + - src/lstack/core/lstack_cfg.c | 82 ++++++++++++++++++++---------------- - src/lstack/lstack.conf | 6 +-- - 3 files changed, 50 insertions(+), 40 deletions(-) - -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 7e55422..94f274d 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -49,6 +49,8 @@ - - #define RXTX_NB_MBUF_DEFAULT (128 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */ - #define RXTX_NB_MBUF_MAX (2560 * 2000) -+#define STACK_THREAD_DEFAULT 4 -+#define STACK_NIC_READ_DEFAULT 128 - - #define MBUF_MAX_DATA_LEN 1460 - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 9c23115..55d16f9 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -222,29 +222,29 @@ static int32_t get_param_idx(int32_t argc, char **argv, const char *param) - - static bool have_corelist_arg(int32_t argc, char **argv) - { -- for (uint32_t i = 0; i < argc; i++) { -- if (strncmp(argv[i], OPT_BIND_CORELIST, strlen(OPT_BIND_CORELIST)) == 0) { -- return true; -- } -- -- if (strncmp(argv[i], "--lcores", strlen("--lcores")) == 0) { -- return true; -- } -+ for (uint32_t i = 0; i < argc; i++) { -+ if (strncmp(argv[i], OPT_BIND_CORELIST, strlen(OPT_BIND_CORELIST)) == 0) { -+ return true; -+ } - -- if (strncmp(argv[i], "-c", strlen("-c")) == 0) { -- return true; -- } -+ if (strncmp(argv[i], "--lcores", strlen("--lcores")) == 0) { -+ return true; -+ } -+ -+ if (strncmp(argv[i], "-c", strlen("-c")) == 0) { -+ return true; -+ } - -- if (strncmp(argv[i], "-s", strlen("-s")) == 0) { -- return true; -- } -+ if (strncmp(argv[i], "-s", strlen("-s")) == 0) { -+ return true; -+ } - -- if (strncmp(argv[i], "-S", strlen("-S")) == 0) { -- return true; -- } -- } -+ if (strncmp(argv[i], "-S", strlen("-S")) == 0) { -+ return true; -+ } -+ } - -- return false; -+ return false; - } - - static int32_t parse_stack_cpu_number(void) -@@ -733,7 +733,9 @@ static int32_t parse_send_connect_number(void) - - arg = config_lookup(&g_config, "send_connect_number"); - if (arg == NULL) { -- return -EINVAL; -+ g_config_params.send_connect_number = STACK_THREAD_DEFAULT; -+ LSTACK_PRE_LOG(LSTACK_ERR, "use default send_connect_number %d.\n", STACK_THREAD_DEFAULT); -+ return 0; - } - - int32_t val = config_setting_get_int(arg); -@@ -753,7 +755,9 @@ static int32_t parse_read_connect_number(void) - - arg = config_lookup(&g_config, "read_connect_number"); - if (arg == NULL) { -- return -EINVAL; -+ g_config_params.read_connect_number = STACK_THREAD_DEFAULT; -+ LSTACK_PRE_LOG(LSTACK_ERR, "use default read_connect_number %d.\n", STACK_THREAD_DEFAULT); -+ return 0; - } - - int32_t val = config_setting_get_int(arg); -@@ -773,7 +777,9 @@ static int32_t parse_rpc_number(void) - - arg = config_lookup(&g_config, "rpc_number"); - if (arg == NULL) { -- return -EINVAL; -+ g_config_params.rpc_number = STACK_THREAD_DEFAULT; -+ LSTACK_PRE_LOG(LSTACK_ERR, "use default rpc_number %d.\n", STACK_THREAD_DEFAULT); -+ return 0; - } - - int32_t val = config_setting_get_int(arg); -@@ -793,7 +799,9 @@ static int32_t parse_nic_read_number(void) - - arg = config_lookup(&g_config, "nic_read_number"); - if (arg == NULL) { -- return -EINVAL; -+ g_config_params.nic_read_number = STACK_NIC_READ_DEFAULT; -+ LSTACK_PRE_LOG(LSTACK_ERR, "use default nic_read_number %d.\n", STACK_NIC_READ_DEFAULT); -+ return 0; - } - - int32_t val = config_setting_get_int(arg); -@@ -922,15 +930,15 @@ static int32_t parse_unix_prefix(void) - int32_t ret = 0; - - ret = memset_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -- 0, sizeof(g_config_params.unix_socket_filename)); -+ 0, sizeof(g_config_params.unix_socket_filename)); - if (ret != EOK) { -- return ret; -+ return ret; - } - - ret = strncpy_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -- GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); -+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1); - if (ret != EOK) { -- return ret; -+ return ret; - } - - unix_prefix = config_lookup(&g_config, "unix_prefix"); -@@ -938,21 +946,21 @@ static int32_t parse_unix_prefix(void) - if (unix_prefix) { - args = config_setting_get_string(unix_prefix); - -- if (filename_check(args)) { -- return -EINVAL; -- } -+ if (filename_check(args)) { -+ return -EINVAL; -+ } - -- ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -- args, strlen(args) + 1); -- if (ret != EOK) { -- return ret; -- } -+ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -+ args, strlen(args) + 1); -+ if (ret != EOK) { -+ return ret; -+ } - } - - ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename), -- GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); -+ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1); - if (ret != EOK) { -- return ret; -+ return ret; - } - - return 0; -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index ee96d4d..47140ad 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -21,11 +21,11 @@ mbuf_pool_size = 256000 - - #protocol stack thread per loop params - #send connect to nic --send_connect_number = 8 -+send_connect_number = 4 - #read data form protocol stack into recv_ring --read_connect_number = 8 -+read_connect_number = 4 - #process rpc msg number --rpc_number = 8 -+rpc_number = 4 - #read nic pkts number - nic_read_number = 128 - --- -2.23.0 - diff --git a/0160-optimite-net-type.patch b/0160-optimite-net-type.patch deleted file mode 100644 index 39ace40..0000000 --- a/0160-optimite-net-type.patch +++ /dev/null @@ -1,72 +0,0 @@ -From bad6066508dcefeabac220df948d7505c3191b66 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 16 Dec 2022 20:13:57 +0800 -Subject: [PATCH 2/2] optimite net type - ---- - src/lstack/core/lstack_lwip.c | 2 +- - src/lstack/netif/lstack_vdev.c | 28 +++++++++++++++++++++++----- - 2 files changed, 24 insertions(+), 6 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 0aaae30..d4e2d9c 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -935,7 +935,7 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num) - list_for_each_safe(node, temp, list) { - sock = container_of(node, struct lwip_sock, recv_list); - -- if (++read_num >= max_num) { -+ if (++read_num > max_num) { - /* list head move to next send */ - list_del_node(&stack->recv_list); - list_add_node(&sock->recv_list, &stack->recv_list); -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index 5bdaf63..f6e7a1a 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -40,6 +40,11 @@ - #define INUSE_TX_PKTS_WATERMARK (VDEV_TX_QUEUE_SZ >> 2) - #define USED_RX_PKTS_WATERMARK (FREE_RX_QUEUE_SZ >> 2) - -+#define IPV4_MASK (0xf0) -+#define IPV4_VERION (0x40) -+ -+#define TCP_HDR_LEN(tcp_hdr) ((tcp_hdr->data_off & 0xf0) >> 2) -+ - static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t max_mbuf) - { - uint32_t rcvd_pkts; -@@ -78,11 +83,24 @@ static uint32_t vdev_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pkt - } - - for (uint32_t i = 0; i < pkt_num; i++) { -- struct rte_net_hdr_lens hdr_lens; -- pkts[i]->packet_type = rte_net_get_ptype(pkts[i], &hdr_lens, RTE_PTYPE_ALL_MASK); -- pkts[i]->l2_len = hdr_lens.l2_len; -- pkts[i]->l3_len = hdr_lens.l3_len; -- pkts[i]->l4_len = hdr_lens.l4_len; -+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(pkts[i], struct rte_ether_hdr *); -+ if (unlikely(RTE_BE16(RTE_ETHER_TYPE_IPV4) != ethh->ether_type)) { -+ continue; -+ } -+ pkts[i]->l2_len = sizeof(struct rte_ether_hdr); -+ -+ struct rte_ipv4_hdr *iph = rte_pktmbuf_mtod_offset(pkts[i], struct rte_ipv4_hdr *, -+ sizeof(struct rte_ether_hdr)); -+ if (unlikely((iph->version_ihl & IPV4_MASK) != IPV4_VERION)) { -+ continue; -+ } -+ pkts[i]->l3_len = sizeof(struct rte_ipv4_hdr); -+ -+ struct rte_tcp_hdr *tcp_hdr = rte_pktmbuf_mtod_offset(pkts[i], struct rte_tcp_hdr *, -+ sizeof(struct rte_ether_hdr) + sizeof(struct rte_ipv4_hdr)); -+ pkts[i]->l4_len = TCP_HDR_LEN(tcp_hdr); -+ -+ pkts[i]->packet_type = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP; - } - return rte_gro_reassemble_burst(pkts, pkt_num, &gro_param); - } --- -2.8.4.windows.1 - diff --git a/0161-app-bind-numa-when-epoll-poll-create.patch b/0161-app-bind-numa-when-epoll-poll-create.patch deleted file mode 100644 index 5a945f5..0000000 --- a/0161-app-bind-numa-when-epoll-poll-create.patch +++ /dev/null @@ -1,36 +0,0 @@ -From ccfc2e04ee98ee843c1c5365bfa0e0ddfe5bf108 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Sat, 17 Dec 2022 15:09:31 +0800 -Subject: [PATCH] app bind numa when epoll/poll create - ---- - src/lstack/api/lstack_epoll.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 4ea6474..605984f 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -204,6 +204,9 @@ int32_t lstack_do_epoll_create(int32_t fd) - update_epoll_max_stack(wakeup); - change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack); - wakeup->bind_stack = wakeup->max_stack; -+ if (get_global_cfg_params()->app_bind_numa) { -+ bind_to_stack_numa(wakeup->bind_stack); -+ } - - return fd; - } -@@ -545,6 +548,9 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack); - change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]); - wakeup->bind_stack = stack_group->stacks[bind_id]; -+ if (get_global_cfg_params()->app_bind_numa) { -+ bind_to_stack_numa(wakeup->bind_stack); -+ } - - return 0; - } --- -2.23.0 - diff --git a/0162-remove-mbuf-reserve-in-mbuf-alloc.patch b/0162-remove-mbuf-reserve-in-mbuf-alloc.patch deleted file mode 100644 index 7ec6a30..0000000 --- a/0162-remove-mbuf-reserve-in-mbuf-alloc.patch +++ /dev/null @@ -1,94 +0,0 @@ -From aacafde3598f8e9ec4e9fd13a17ce9d0a23c3fe5 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Sat, 17 Dec 2022 20:33:16 +0800 -Subject: [PATCH] remove mbuf reserve in mbuf alloc - ---- - src/lstack/core/lstack_dpdk.c | 9 --------- - src/lstack/core/lstack_lwip.c | 10 +++++----- - src/lstack/include/lstack_dpdk.h | 1 - - 3 files changed, 5 insertions(+), 15 deletions(-) - -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 4be31c3..76ebe96 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -194,15 +194,6 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num) - return 0; - } - --int32_t gazelle_alloc_mbuf_with_reserve(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count) --{ -- if (rte_mempool_avail_count(pool) < RESERVE_NIC_RECV) { -- return -1; -- } -- -- return rte_pktmbuf_alloc_bulk(pool, mbufs, count); --} -- - struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id) - { - char ring_name[RTE_RING_NAMESIZE] = {0}; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index d4e2d9c..c04ed27 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -134,7 +134,7 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct rte_rin - return false; - } - -- if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, replenish_cnt) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbuf, replenish_cnt) != 0) { - stack->stats.tx_allocmbuf_fail++; - return true; - } -@@ -225,7 +225,7 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, - { - struct pbuf_custom *pbuf_custom = NULL; - -- int32_t ret = gazelle_alloc_mbuf_with_reserve(pool, mbufs, num); -+ int32_t ret = rte_pktmbuf_alloc_bulk(pool, mbufs, num); - if (ret != 0) { - return ret; - } -@@ -243,7 +243,7 @@ struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type) - struct rte_mbuf *mbuf; - struct protocol_stack *stack = get_protocol_stack(); - -- if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, &mbuf, 1) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, &mbuf, 1) != 0) { - stack->stats.tx_allocmbuf_fail++; - return NULL; - } -@@ -353,7 +353,7 @@ static inline ssize_t app_direct_write(struct protocol_stack *stack, struct lwip - } - - /* first pbuf get from send_ring. and malloc pbufs attach to first pbuf */ -- if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)&pbufs[1], write_num - 1) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)&pbufs[1], write_num - 1) != 0) { - stack->stats.tx_allocmbuf_fail++; - free(pbufs); - return 0; -@@ -389,7 +389,7 @@ static inline ssize_t app_direct_attach(struct protocol_stack *stack, struct pbu - } - - /* first pbuf get from send_ring. and malloc pbufs attach to first pbuf */ -- if (gazelle_alloc_mbuf_with_reserve(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbufs, write_num) != 0) { -+ if (rte_pktmbuf_alloc_bulk(stack->rxtx_pktmbuf_pool, (struct rte_mbuf **)pbufs, write_num) != 0) { - stack->stats.tx_allocmbuf_fail++; - free(pbufs); - return 0; -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index a0f09af..c3bc527 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -51,6 +51,5 @@ void dpdk_skip_nic_init(void); - int32_t dpdk_init_lstack_kni(void); - void dpdk_restore_pci(void); - bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port); --int32_t gazelle_alloc_mbuf_with_reserve(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count); - - #endif /* GAZELLE_DPDK_H */ --- -2.23.0 - diff --git a/0163-pkts-bulk-send-to-nic.patch b/0163-pkts-bulk-send-to-nic.patch deleted file mode 100644 index 184357a..0000000 --- a/0163-pkts-bulk-send-to-nic.patch +++ /dev/null @@ -1,123 +0,0 @@ -From dab68f20b3d6d66fe0c400db81c15cc200c22b22 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 18 Dec 2022 19:22:33 +0800 -Subject: [PATCH 1/2] pkts bulk send to nic - ---- - src/lstack/core/lstack_protocol_stack.c | 19 +++++++++++++++++++ - src/lstack/include/lstack_protocol_stack.h | 3 +++ - src/lstack/netif/lstack_ethdev.c | 16 ++++++++++------ - src/lstack/netif/lstack_vdev.c | 8 +------- - 4 files changed, 33 insertions(+), 13 deletions(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 2a866e0..870e496 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -413,6 +413,23 @@ static void wakeup_kernel_event(struct protocol_stack *stack) - stack->kernel_event_num = 0; - } - -+static void stack_send_pkts(struct protocol_stack *stack) -+{ -+ if (stack->send_cnt == 0) { -+ return; -+ } -+ -+ uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, stack->send_pkts, stack->send_cnt); -+ if (sent_pkts < stack->send_cnt && sent_pkts != 0) { -+ for (uint32_t i = sent_pkts; i < stack->send_cnt; i++) { -+ stack->send_pkts[i - sent_pkts] = stack->send_pkts[i]; -+ } -+ } -+ -+ stack->send_cnt -= sent_pkts; -+ stack->stats.tx += sent_pkts; -+} -+ - static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -@@ -449,6 +466,8 @@ static void* gazelle_stack_thread(void *arg) - - send_stack_list(stack, send_connect_number); - -+ stack_send_pkts(stack); -+ - if ((wakeup_tick & 0xf) == 0) { - wakeup_kernel_event(stack); - wakeup_stack_epoll(stack, wakeup_thread_enable); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 4cfa243..9463707 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -29,6 +29,7 @@ - #define SOCK_SEND_RING_SIZE (32) - #define SOCK_SEND_REPLENISH_THRES (16) - #define WAKEUP_MAX_NUM (32) -+#define STACK_SEND_MAX RTE_TEST_TX_DESC_DEFAULT - - struct rte_mempool; - struct rte_ring; -@@ -65,6 +66,8 @@ struct protocol_stack { - uint32_t rx_ring_used; - uint32_t tx_ring_used; - -+ uint16_t send_cnt; -+ struct rte_mbuf *send_pkts[STACK_SEND_MAX]; - struct rte_mbuf *pkts[RTE_TEST_RX_DESC_DEFAULT]; - struct list_node recv_list; - struct list_node send_list; -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 3958e8d..d870dd3 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -197,12 +197,16 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - pbuf = pbuf->next; - } - -- uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1); -- stack->stats.tx += sent_pkts; -- if (sent_pkts < 1) { -- stack->stats.tx_drop++; -- rte_pktmbuf_free(first_mbuf); -- return ERR_MEM; -+ if (stack->send_cnt + 1 < STACK_SEND_MAX) { -+ stack->send_pkts[stack->send_cnt++] = first_mbuf; -+ } else { -+ uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1); -+ stack->stats.tx += sent_pkts; -+ if (sent_pkts < 1) { -+ stack->stats.tx_drop++; -+ rte_pktmbuf_free(first_mbuf); -+ return ERR_MEM; -+ } - } - - return ERR_OK; -diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c -index f6e7a1a..801edf8 100644 ---- a/src/lstack/netif/lstack_vdev.c -+++ b/src/lstack/netif/lstack_vdev.c -@@ -129,17 +129,11 @@ static uint32_t ltran_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pk - - static uint32_t vdev_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts) - { -- uint32_t sent_pkts = 0; -- - if (rte_eth_tx_prepare(stack->port_id, stack->queue_id, pkts, nr_pkts) != nr_pkts) { - stack->stats.tx_prepare_fail++; - } - -- do { -- sent_pkts += rte_eth_tx_burst(stack->port_id, stack->queue_id, &pkts[sent_pkts], nr_pkts - sent_pkts); -- } while (sent_pkts < nr_pkts); -- -- return sent_pkts; -+ return rte_eth_tx_burst(stack->port_id, stack->queue_id, pkts, nr_pkts); - } - - int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) --- -2.23.0 - diff --git a/0164-rpc-dont-send.patch b/0164-rpc-dont-send.patch deleted file mode 100644 index dcb6c45..0000000 --- a/0164-rpc-dont-send.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 4b7dd71bd8ab1023b73b2c157719d6a939d75b49 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 18 Dec 2022 19:36:52 +0800 -Subject: [PATCH 2/2] rpc-dont-send - ---- - src/common/dpdk_common.h | 4 +++- - src/lstack/core/lstack_lwip.c | 12 +----------- - 2 files changed, 4 insertions(+), 12 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index a0c304c..63d651d 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -25,7 +25,9 @@ - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - - /* Layout: -- * | rte_mbuf | pbuf | custom_free_function | tcp_seg | payload | -+ * | rte_mbuf | gazelle_prive | pbuf | custom_free_function | tcp_seg | payload | -+ * rte_prefetch0 in lwip project,tcp_out.c,tcp_output_segment use constants -+ sizeof(struct rte_mbuf) + GAZELLE_MBUFF_PRIV_SIZE = 128 + 16 - **/ - struct pbuf; - static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index c04ed27..ae6c98d 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -573,7 +573,6 @@ static inline bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct - void stack_send(struct rpc_msg *msg) - { - int32_t fd = msg->args[MSG_ARG_0].i; -- int32_t flags = msg->args[MSG_ARG_2].i; - struct protocol_stack *stack = (struct protocol_stack *)msg->args[MSG_ARG_3].p; - - struct lwip_sock *sock = get_socket(fd); -@@ -583,22 +582,13 @@ void stack_send(struct rpc_msg *msg) - } - - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -- rte_mb(); -- -- if (!NETCONN_IS_DATAOUT(sock) || sock->errevent > 0) { -- return; -- } -- -- bool replenish_again = do_lwip_send(stack, fd, sock, flags); - - /* have remain data or replenish again add sendlist */ -- if (NETCONN_IS_DATAOUT(sock) || replenish_again) { -+ if (sock->errevent == 0 && NETCONN_IS_DATAOUT(sock)) { - if (list_is_null(&sock->send_list)) { - list_add_node(&stack->send_list, &sock->send_list); - __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE); - } -- -- stack->stats.send_self_rpc++; - } - } - --- -2.23.0 - diff --git a/0165-recv-pbuf-free-timely.patch b/0165-recv-pbuf-free-timely.patch deleted file mode 100644 index 73f9834..0000000 --- a/0165-recv-pbuf-free-timely.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 90575a74f2a4b50ac5ab89a529c5c4426cdf507c Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Sun, 18 Dec 2022 20:18:53 +0800 -Subject: [PATCH] recv pbuf free timely - ---- - src/lstack/core/lstack_lwip.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index ae6c98d..0b9b684 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -642,9 +642,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - return 0; - } - -- if (gazelle_ring_readover_count(sock->recv_ring) >= SOCK_RECV_FREE_THRES) { -- free_recv_ring_readover(sock->recv_ring); -- } -+ free_recv_ring_readover(sock->recv_ring); - - uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); - if (free_count == 0) { --- -2.23.0 - diff --git a/0166-optimite-send-pkts-dul-index.patch b/0166-optimite-send-pkts-dul-index.patch deleted file mode 100644 index f95b3ca..0000000 --- a/0166-optimite-send-pkts-dul-index.patch +++ /dev/null @@ -1,165 +0,0 @@ -From bd6d329cc57086996302fdd46fbd434f945ecd26 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 20 Dec 2022 15:39:39 +0800 -Subject: [PATCH 1/2] optimite-send-pkts-dul-index - ---- - src/common/gazelle_dfx_msg.h | 2 +- - src/lstack/core/lstack_protocol_stack.c | 23 +++++++++++----- - src/lstack/include/lstack_protocol_stack.h | 8 ++++-- - src/lstack/netif/lstack_ethdev.c | 31 ++++++++++++++-------- - src/ltran/ltran_dfx.c | 2 +- - 5 files changed, 44 insertions(+), 22 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index d14f1b9..83b6fe9 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -55,7 +55,7 @@ enum GAZELLE_LATENCY_TYPE { - struct gazelle_stack_stat { - uint64_t wakeup_events; - uint64_t write_lwip_cnt; -- uint64_t send_self_rpc; -+ uint64_t send_pkts_fail; - uint64_t read_lwip_drop; - uint64_t read_lwip_cnt; - uint64_t rx_allocmbuf_fail; -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 870e496..16b124e 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -413,20 +413,29 @@ static void wakeup_kernel_event(struct protocol_stack *stack) - stack->kernel_event_num = 0; - } - --static void stack_send_pkts(struct protocol_stack *stack) -+void stack_send_pkts(struct protocol_stack *stack) - { -- if (stack->send_cnt == 0) { -+ uint32_t send_num = stack->send_end - stack->send_start; -+ -+ if (send_num == 0) { - return; - } - -- uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, stack->send_pkts, stack->send_cnt); -- if (sent_pkts < stack->send_cnt && sent_pkts != 0) { -- for (uint32_t i = sent_pkts; i < stack->send_cnt; i++) { -- stack->send_pkts[i - sent_pkts] = stack->send_pkts[i]; -+ uint32_t start = stack->send_start & STACK_SEND_MASK; -+ uint32_t end = stack->send_end & STACK_SEND_MASK; -+ uint32_t sent_pkts = 0; -+ -+ if (start < end) { -+ sent_pkts = stack->dev_ops.tx_xmit(stack, &stack->send_pkts[start], send_num); -+ } else { -+ send_num = STACK_SEND_MAX - start; -+ sent_pkts = stack->dev_ops.tx_xmit(stack, &stack->send_pkts[start], send_num); -+ if (sent_pkts == send_num) { -+ sent_pkts += stack->dev_ops.tx_xmit(stack, stack->send_pkts, end); - } - } - -- stack->send_cnt -= sent_pkts; -+ stack->send_start += sent_pkts; - stack->stats.tx += sent_pkts; - } - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 9463707..c706afc 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -29,7 +29,8 @@ - #define SOCK_SEND_RING_SIZE (32) - #define SOCK_SEND_REPLENISH_THRES (16) - #define WAKEUP_MAX_NUM (32) --#define STACK_SEND_MAX RTE_TEST_TX_DESC_DEFAULT -+#define STACK_SEND_MAX 2048 -+#define STACK_SEND_MASK (STACK_SEND_MAX - 1) - - struct rte_mempool; - struct rte_ring; -@@ -66,7 +67,8 @@ struct protocol_stack { - uint32_t rx_ring_used; - uint32_t tx_ring_used; - -- uint16_t send_cnt; -+ uint32_t send_start; -+ uint32_t send_end; - struct rte_mbuf *send_pkts[STACK_SEND_MAX]; - struct rte_mbuf *pkts[RTE_TEST_RX_DESC_DEFAULT]; - struct list_node recv_list; -@@ -131,6 +133,8 @@ int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *ad - struct wakeup_poll; - void stack_broadcast_clean_epoll(struct wakeup_poll *wakeup); - -+void stack_send_pkts(struct protocol_stack *stack); -+ - struct rpc_msg; - void stack_clean_epoll(struct rpc_msg *msg); - void stack_arp(struct rpc_msg *msg); -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index d870dd3..5729ebf 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -147,6 +147,25 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag, - return nr_pkts; - } - -+static void add_send_pkt(struct protocol_stack *stack, struct rte_mbuf *mbuf) -+{ -+ if (stack->send_end + 1 != stack->send_start) { -+ stack->send_pkts[stack->send_end & STACK_SEND_MASK] = mbuf; -+ stack->send_end++; -+ return; -+ } -+ -+ stack->stats.send_pkts_fail++; -+ do { -+ stack_send_pkts(stack); -+ if (stack->send_end + 1 != stack->send_start) { -+ stack->send_pkts[stack->send_end & STACK_SEND_MASK] = mbuf; -+ stack->send_end++; -+ return; -+ } -+ } while (1); -+} -+ - static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - { - struct protocol_stack *stack = get_protocol_stack(); -@@ -197,17 +216,7 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf) - pbuf = pbuf->next; - } - -- if (stack->send_cnt + 1 < STACK_SEND_MAX) { -- stack->send_pkts[stack->send_cnt++] = first_mbuf; -- } else { -- uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1); -- stack->stats.tx += sent_pkts; -- if (sent_pkts < 1) { -- stack->stats.tx_drop++; -- rte_pktmbuf_free(first_mbuf); -- return ERR_MEM; -- } -- } -+ add_send_pkt(stack, first_mbuf); - - return ERR_OK; - } -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 3801f19..651f279 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -579,7 +579,7 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.stack_stat.call_null); -- printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.stack_stat.send_self_rpc); -+ printf("send_pkts_fail: %-13"PRIu64" \n", lstack_stat->data.pkts.stack_stat.send_pkts_fail); - } - - static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat, --- -2.23.0 - diff --git a/0167-expand-data-recv-buff.patch b/0167-expand-data-recv-buff.patch deleted file mode 100644 index 6dd7029..0000000 --- a/0167-expand-data-recv-buff.patch +++ /dev/null @@ -1,357 +0,0 @@ -From da54963163baf9213c8cd34da6ec3c533ab1ef9d Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 20 Dec 2022 15:42:33 +0800 -Subject: [PATCH 2/2] expand-data-recv-buff - ---- - src/common/dpdk_common.h | 2 +- - src/lstack/core/lstack_lwip.c | 202 ++++++++++++++++++++++++------- - src/lstack/include/lstack_dpdk.h | 2 + - 3 files changed, 164 insertions(+), 42 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 63d651d..c93f506 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -193,7 +193,7 @@ static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void * - - __rte_ring_dequeue_elems(r, prod, obj_table, sizeof(void *), n); - -- r->prod.head = prod + n; -+ __atomic_store_n(&r->prod.head, prod + n, __ATOMIC_RELEASE); - - return n; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 0b9b684..32d21b6 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -83,6 +83,11 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->send_lastdata = NULL; - } - -+ if (sock->lwip_lastdata) { -+ free_list_pbuf(sock->lwip_lastdata); -+ sock->lwip_lastdata = NULL; -+ } -+ - if (sock->send_pre_del) { - pbuf_free(sock->send_pre_del); - sock->send_pre_del = NULL; -@@ -95,6 +100,7 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->events = 0; - sock->in_send = 0; - sock->remain_len = 0; -+ sock->read_wait = false; - - if (sock->recv_lastdata) { - pbuf_free(sock->recv_lastdata); -@@ -185,7 +191,6 @@ void gazelle_init_sock(int32_t fd) - init_list_node_null(&sock->recv_list); - init_list_node_null(&sock->event_list); - init_list_node_null(&sock->send_list); -- pthread_spin_init(&sock->sock_lock, PTHREAD_PROCESS_PRIVATE); - } - - void gazelle_clean_sock(int32_t fd) -@@ -207,7 +212,6 @@ void gazelle_clean_sock(int32_t fd) - - list_del_node_null(&sock->recv_list); - list_del_node_null(&sock->send_list); -- pthread_spin_destroy(&sock->sock_lock); - } - - void gazelle_free_pbuf(struct pbuf *pbuf) -@@ -636,64 +640,166 @@ static inline void free_recv_ring_readover(struct rte_ring *ring) - } - } - --ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) -+static inline struct pbuf *gazelle_ring_enqueuelast(struct rte_ring *r) - { -- if (sock->conn->recvmbox == NULL) { -- return 0; -+ struct pbuf *last_pbuf = NULL; -+ volatile uint32_t head = __atomic_load_n(&r->prod.head, __ATOMIC_ACQUIRE); -+ uint32_t last = r->cons.head - 1; -+ if (last == head || last - head > r->capacity) { -+ return NULL; - } - -- free_recv_ring_readover(sock->recv_ring); -+ __rte_ring_dequeue_elems(r, last, (void **)&last_pbuf, sizeof(void *), 1); -+ __atomic_store_n(&last_pbuf->in_write, 1, __ATOMIC_RELEASE); - -- uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); -- if (free_count == 0) { -- GAZELLE_RETURN(EAGAIN); -+ rte_mb(); -+ -+ head = __atomic_load_n(&r->prod.head, __ATOMIC_ACQUIRE); -+ if (last == head || last - head > r->capacity) { -+ __atomic_store_n(&last_pbuf->in_write, 0, __ATOMIC_RELEASE); -+ return NULL; - } - -- uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -- uint32_t read_num = LWIP_MIN(free_count, data_count); -- read_num = LWIP_MIN(read_num, SOCK_RECV_RING_SIZE); -- struct pbuf *pbufs[SOCK_RECV_RING_SIZE]; -- uint32_t read_count = 0; -- ssize_t recv_len = 0; -+ return last_pbuf; -+} -+ -+static inline struct pbuf *pbuf_last(struct pbuf *pbuf) -+{ -+ while (pbuf->next) { -+ pbuf = pbuf->next; -+ } -+ return pbuf; -+} -+ -+static struct pbuf *merge_pbufs(struct pbuf *pbufs[], uint32_t data_count, uint32_t data_len) -+{ -+ struct pbuf *pre_last = (pbufs[0]->last) ? pbufs[0]->last : pbuf_last(pbufs[0]); -+ -+ if (data_count <= 1) { -+ pbufs[0]->last = pre_last; -+ return pbufs[0]; -+ } -+ -+ for (uint32_t i = 1; i < data_count; i++) { -+ pre_last->next = pbufs[i]; -+ pre_last = pbuf_last(pbufs[i]); -+ } -+ -+ pbufs[0]->tot_len = data_len; -+ pbufs[0]->last = pre_last; -+ -+ return pbufs[0]; -+} - -- for (uint32_t i = 0; i < read_num; i++) { -+static int32_t get_lwip_pbufs(struct lwip_sock *sock, struct pbuf *pbufs[], uint32_t *data_count, u8_t apiflags) -+{ -+ uint32_t data_len = 0; -+ -+ for (uint32_t i = 0; i < *data_count; i++) { - err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbufs[i], apiflags); - if (err != ERR_OK) { -- if (recv_len > 0) { -+ *data_count = i; -+ if (data_len > 0) { - /* already received data, return that (this trusts in getting the same error from - netconn layer again next time netconn_recv is called) */ - break; - } -- -- return (err == ERR_CLSD) ? 0 : -1; -+ return (err == ERR_CLSD) ? -1 : 0; - } - -- recv_len += pbufs[i]->tot_len; -- read_count++; -+ pbufs[i]->last = NULL; -+ pbufs[i]->in_write = 0; -+ data_len += pbufs[i]->tot_len; - - /* once we have some data to return, only add more if we don't need to wait */ - apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN; - } - -- if (!(flags & MSG_PEEK)) { -- uint32_t enqueue_num = gazelle_ring_sp_enqueue(sock->recv_ring, (void **)pbufs, read_count); -- for (uint32_t i = enqueue_num; i < read_count; i++) { -- /* update receive window */ -- tcp_recved(sock->conn->pcb.tcp, pbufs[i]->tot_len); -- pbuf_free(pbufs[i]); -- sock->stack->stats.read_lwip_drop++; -- } -+ return (int32_t)data_len; -+} -+ -+static void put_pbufs_into_recv_ring(struct lwip_sock *sock, struct pbuf *pbufs[], -+ uint32_t data_count, uint32_t data_len) -+{ -+ uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); -+ -+ if (data_count <= free_count) { -+ (void)gazelle_ring_sp_enqueue(sock->recv_ring, (void **)pbufs, data_count); -+ return; - } - -- for (uint32_t i = 0; get_protocol_stack_group()->latency_start && i < read_count; i++) { -- calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); -+ struct pbuf *new_pbuf = merge_pbufs(pbufs, data_count, data_len); -+ -+ if (free_count) { -+ (void)gazelle_ring_sp_enqueue(sock->recv_ring, (void **)&new_pbuf, 1); -+ return; -+ } -+ -+ struct pbuf *last_pbuf = gazelle_ring_enqueuelast(sock->recv_ring); -+ if (last_pbuf == NULL) { -+ sock->lwip_lastdata = new_pbuf; -+ return; - } - -- sock->stack->stats.read_lwip_cnt += read_count; -- if (recv_len == 0) { -+ if (last_pbuf->last == NULL) { -+ last_pbuf->last = pbuf_last(last_pbuf); -+ } -+ last_pbuf->last->next = new_pbuf; -+ last_pbuf->tot_len += new_pbuf->tot_len; -+ last_pbuf->last = new_pbuf->last; -+ gazelle_ring_lastover(last_pbuf); -+ -+ if (last_pbuf->tot_len > SOCK_READ_MAXLEN) { -+ sock->read_wait = true; -+ } -+} -+ -+ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) -+{ -+ if (sock->conn->recvmbox == NULL) { -+ return 0; -+ } -+ -+ free_recv_ring_readover(sock->recv_ring); -+ -+ if (sock->read_wait) { - GAZELLE_RETURN(EAGAIN); - } -- return recv_len; -+ -+ struct pbuf *pbufs[SOCK_RECV_RING_SIZE]; -+ uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -+ int32_t data_len = get_lwip_pbufs(sock, pbufs, &data_count, apiflags); -+ if (unlikely(data_len < 0)) { -+ /* ERR_CLSD */ -+ return 0; -+ } else if (unlikely(data_len == 0) && !sock->lwip_lastdata) { -+ GAZELLE_RETURN(EAGAIN); -+ } -+ -+ if (get_protocol_stack_group()->latency_start) { -+ for (uint32_t i = 0; i < data_count; i++) { -+ calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); -+ } -+ } -+ -+ if (data_count) { -+ uint32_t last_len = 0; -+ if (sock->lwip_lastdata) { -+ last_len = sock->lwip_lastdata->tot_len; -+ sock->lwip_lastdata->last->next = pbufs[0]; -+ sock->lwip_lastdata->tot_len += pbufs[0]->tot_len; -+ sock->lwip_lastdata->last = pbuf_last(pbufs[0]); -+ pbufs[0] = sock->lwip_lastdata; -+ sock->lwip_lastdata = NULL; -+ } -+ put_pbufs_into_recv_ring(sock, pbufs, data_count, data_len + last_len); -+ } else { -+ put_pbufs_into_recv_ring(sock, &sock->lwip_lastdata, 1, sock->lwip_lastdata->tot_len); -+ sock->lwip_lastdata = NULL; -+ } -+ sock->stack->stats.read_lwip_cnt += data_count; -+ -+ return data_len; - } - - static int32_t check_msg_vaild(const struct msghdr *message) -@@ -725,9 +831,9 @@ ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags) - } - - for (int32_t i = 0; i < message->msg_iovlen; i++) { -- if (message->msg_iov[i].iov_len == 0){ -- continue; -- } -+ if (message->msg_iov[i].iov_len == 0) { -+ continue; -+ } - - ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags); - if (recvd_local > 0) { -@@ -828,7 +934,7 @@ static inline void del_data_in_event(struct lwip_sock *sock) - - static struct pbuf *pbuf_free_partial(struct pbuf *pbuf, uint16_t free_len) - { -- uint16_t tot_len = pbuf->tot_len - free_len; -+ uint32_t tot_len = pbuf->tot_len - free_len; - - while (free_len && pbuf) { - if (free_len >= pbuf->len) { -@@ -840,7 +946,9 @@ static struct pbuf *pbuf_free_partial(struct pbuf *pbuf, uint16_t free_len) - } - } - -- pbuf->tot_len = tot_len; -+ if (pbuf) { -+ pbuf->tot_len = tot_len; -+ } - return pbuf; - } - -@@ -849,7 +957,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - size_t recv_left = len; - struct pbuf *pbuf = NULL; - ssize_t recvd = 0; -- uint16_t copy_len; -+ uint32_t copy_len; - struct lwip_sock *sock = get_socket_by_fd(fd); - bool latency_enable = get_protocol_stack_group()->latency_start; - -@@ -870,8 +978,15 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - break; - } - } -+ if (__atomic_load_n(&pbuf->in_write, __ATOMIC_ACQUIRE)) { -+ sock->recv_lastdata = pbuf; -+ break; -+ } - -- copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : (uint16_t)recv_left; -+ copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : recv_left; -+ if (copy_len > UINT16_MAX) { -+ copy_len = UINT16_MAX; -+ } - pbuf_copy_partial(pbuf, (char *)buf + recvd, copy_len, 0); - - recvd += copy_len; -@@ -879,6 +994,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - - if (pbuf->tot_len > copy_len) { - sock->recv_lastdata = pbuf_free_partial(pbuf, copy_len); -+ break; - } else { - if (sock->wakeup) { - sock->wakeup->stat.app_read_cnt += 1; -@@ -890,6 +1006,10 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -+ if (sock->read_wait) { -+ sock->read_wait = false; -+ } -+ - /* rte_ring_count reduce lock */ - if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN)) { - del_data_in_event(sock); -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index c3bc527..ac068b8 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -24,6 +24,8 @@ - - #define MAX_PACKET_SZ 2048 - -+#define SOCK_READ_MAXLEN 0x200000 -+ - #define RING_SIZE(x) ((x) - 1) - - #define MBUF_SZ (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM) --- -2.23.0 - diff --git a/0168-dfx-add-mempool-count-info.patch b/0168-dfx-add-mempool-count-info.patch deleted file mode 100644 index f3a7ee9..0000000 --- a/0168-dfx-add-mempool-count-info.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 7472711c423224694f438db1c49f0c4196b0728d Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 20 Dec 2022 22:34:09 +0800 -Subject: [PATCH 1/2] dfx add-mempool-count-info - ---- - src/common/gazelle_dfx_msg.h | 1 + - src/lstack/core/lstack_lwip.c | 15 +++++++++++++-- - src/lstack/core/lstack_stack_stat.c | 3 +++ - src/lstack/core/lstack_thread_rpc.c | 16 ++++++++++++++++ - src/lstack/include/lstack_lwip.h | 1 + - src/lstack/include/lstack_thread_rpc.h | 1 + - src/ltran/ltran_dfx.c | 3 ++- - 7 files changed, 37 insertions(+), 3 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 83b6fe9..9225b53 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -82,6 +82,7 @@ struct gazelle_stat_pkts { - uint64_t recv_list_cnt; - uint64_t call_alloc_fail; - uint64_t send_list_cnt; -+ uint32_t mempool_freecnt; - struct gazelle_stack_stat stack_stat; - struct gazelle_wakeup_stat wakeup_stat; - }; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 32d21b6..9442d3f 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -1273,12 +1273,23 @@ static uint32_t get_list_count(struct list_node *list) - return count; - } - -+void stack_mempool_size(struct rpc_msg *msg) -+{ -+ struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_0].p; -+ -+ msg->result = rte_mempool_avail_count(stack->rxtx_pktmbuf_pool); -+} -+ - void stack_sendlist_count(struct rpc_msg *msg) - { -- msg->result = get_list_count(&get_protocol_stack()->send_list); -+ struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_0].p; -+ -+ msg->result = get_list_count(&stack->send_list); - } - - void stack_recvlist_count(struct rpc_msg *msg) - { -- msg->result = get_list_count(&get_protocol_stack()->recv_list); -+ struct protocol_stack *stack = (struct protocol_stack*)msg->args[MSG_ARG_0].p; -+ -+ msg->result = get_list_count(&stack->recv_list); - } -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 45f84a7..59c8e66 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -146,6 +146,9 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_ - int32_t rpc_call_result = rpc_call_msgcnt(stack); - dfx->data.pkts.call_msg_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; - -+ rpc_call_result = rpc_call_mempoolsize(stack); -+ dfx->data.pkts.mempool_freecnt = (rpc_call_result < 0) ? 0 : rpc_call_result; -+ - rpc_call_result = rpc_call_recvlistcnt(stack); - dfx->data.pkts.recv_list_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result; - -diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c -index 29ca4e4..08fe20d 100644 ---- a/src/lstack/core/lstack_thread_rpc.c -+++ b/src/lstack/core/lstack_thread_rpc.c -@@ -205,6 +205,18 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn) - return rpc_sync_call(&stack->rpc_queue, msg); - } - -+int32_t rpc_call_mempoolsize(struct protocol_stack *stack) -+{ -+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_mempool_size); -+ if (msg == NULL) { -+ return -1; -+ } -+ -+ msg->args[MSG_ARG_0].p = stack; -+ -+ return rpc_sync_call(&stack->rpc_queue, msg); -+} -+ - int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) - { - struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendlist_count); -@@ -212,6 +224,8 @@ int32_t rpc_call_sendlistcnt(struct protocol_stack *stack) - return -1; - } - -+ msg->args[MSG_ARG_0].p = stack; -+ - return rpc_sync_call(&stack->rpc_queue, msg); - } - -@@ -222,6 +236,8 @@ int32_t rpc_call_recvlistcnt(struct protocol_stack *stack) - return -1; - } - -+ msg->args[MSG_ARG_0].p = stack; -+ - return rpc_sync_call(&stack->rpc_queue, msg); - } - -diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h -index b24006a..6f5b4f4 100644 ---- a/src/lstack/include/lstack_lwip.h -+++ b/src/lstack/include/lstack_lwip.h -@@ -47,5 +47,6 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags) - ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags); - ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags); - void rpc_replenish(struct rpc_msg *msg); -+void stack_mempool_size(struct rpc_msg *msg); - - #endif -diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h -index 2c1202e..aff30dc 100644 ---- a/src/lstack/include/lstack_thread_rpc.h -+++ b/src/lstack/include/lstack_thread_rpc.h -@@ -77,5 +77,6 @@ int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, - int32_t rpc_call_fcntl(int fd, int cmd, long val); - int32_t rpc_call_ioctl(int fd, long cmd, void *argp); - int32_t rpc_call_replenish(struct protocol_stack *stack, struct lwip_sock *sock); -+int32_t rpc_call_mempoolsize(struct protocol_stack *stack); - - #endif -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 651f279..7dda51c 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -579,7 +579,8 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat) - printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt); - printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail); - printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.stack_stat.call_null); -- printf("send_pkts_fail: %-13"PRIu64" \n", lstack_stat->data.pkts.stack_stat.send_pkts_fail); -+ printf("send_pkts_fail: %-13"PRIu64" ", lstack_stat->data.pkts.stack_stat.send_pkts_fail); -+ printf("mempool_freecnt: %-12"PRIu32" \n", lstack_stat->data.pkts.mempool_freecnt); - } - - static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat, --- -2.23.0 - diff --git a/0169--write-support-without-epoll-poll.patch b/0169--write-support-without-epoll-poll.patch deleted file mode 100644 index ffee8b7..0000000 --- a/0169--write-support-without-epoll-poll.patch +++ /dev/null @@ -1,82 +0,0 @@ -From d4d8516449ed6c8d7685cc1aaec403763a5d5afa Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Wed, 21 Dec 2022 23:04:57 +0800 -Subject: [PATCH 2/2] write support without epoll/poll - ---- - src/common/dpdk_common.h | 4 ++-- - src/lstack/core/lstack_lwip.c | 18 ++++++++++++------ - 2 files changed, 14 insertions(+), 8 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index c93f506..e4a447a 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -25,9 +25,9 @@ - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - - /* Layout: -- * | rte_mbuf | gazelle_prive | pbuf | custom_free_function | tcp_seg | payload | -+ * | rte_mbuf | gazelle_prive | custom_free_function | tcp_seg | payload | -+ * | 128 | 16 | 56 | 32 | - * rte_prefetch0 in lwip project,tcp_out.c,tcp_output_segment use constants -- sizeof(struct rte_mbuf) + GAZELLE_MBUFF_PRIV_SIZE = 128 + 16 - **/ - struct pbuf; - static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 9442d3f..018b6c6 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -500,8 +500,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - } - - struct protocol_stack *stack = sock->stack; -- struct wakeup_poll *wakeup = sock->wakeup; -- if (!stack|| len == 0 || !wakeup) { -+ if (!stack|| len == 0) { - return 0; - } - -@@ -517,6 +516,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - - uint32_t write_num = (len - send_len + MBUF_MAX_DATA_LEN - 1) / MBUF_MAX_DATA_LEN; - uint32_t write_avail = gazelle_ring_readable_count(sock->send_ring); -+ struct wakeup_poll *wakeup = sock->wakeup; - - /* send_ring is full, data attach last pbuf */ - if (write_avail == 0) { -@@ -524,10 +524,14 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - if (last_pbuf) { - send_len += app_direct_attach(stack, last_pbuf, (char *)buf + send_len, len - send_len, write_num); - gazelle_ring_lastover(last_pbuf); -- wakeup->stat.app_write_cnt += write_num; -+ if (wakeup) { -+ wakeup->stat.app_write_cnt += write_num; -+ } - } else { - (void)rpc_call_replenish(stack, sock); -- wakeup->stat.app_write_rpc++; -+ if (wakeup) { -+ wakeup->stat.app_write_rpc++; -+ } - } - sock->remain_len = 0; - return send_len; -@@ -536,9 +540,11 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) - /* send_ring have idle */ - send_len += (write_num <= write_avail) ? app_buff_write(sock, (char *)buf + send_len, len - send_len, write_num) : - app_direct_write(stack, sock, (char *)buf + send_len, len - send_len, write_num); -- wakeup->stat.app_write_cnt += write_num; -+ if (wakeup) { -+ wakeup->stat.app_write_cnt += write_num; -+ } - -- if (wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { -+ if (wakeup && wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { - del_data_out_event(sock); - } - --- -2.23.0 - diff --git a/0170-add-rcv-nxt-dfx-info.patch b/0170-add-rcv-nxt-dfx-info.patch deleted file mode 100644 index 5b0cbe3..0000000 --- a/0170-add-rcv-nxt-dfx-info.patch +++ /dev/null @@ -1,95 +0,0 @@ -From aab7dc09d29f1281d8843c67d56f9f69540f5801 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 22 Dec 2022 23:10:19 +0800 -Subject: [PATCH 1/4] add-rcv-nxt-dfx-info - ---- - src/common/gazelle_dfx_msg.h | 1 + - src/lstack/core/lstack_lwip.c | 3 ++- - src/lstack/include/lstack_dpdk.h | 2 -- - src/ltran/ltran_dfx.c | 9 +++++---- - 4 files changed, 8 insertions(+), 7 deletions(-) - -diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h -index 9225b53..674f2d7 100644 ---- a/src/common/gazelle_dfx_msg.h -+++ b/src/common/gazelle_dfx_msg.h -@@ -164,6 +164,7 @@ struct gazelle_stat_lstack_conn_info { - uint32_t snd_buf; - uint32_t lastack; - uint32_t snd_nxt; -+ uint32_t rcv_nxt; - int32_t fd; - uint32_t events; - uint32_t epoll_events; -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 018b6c6..bb6fe44 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -755,7 +755,7 @@ static void put_pbufs_into_recv_ring(struct lwip_sock *sock, struct pbuf *pbufs[ - last_pbuf->last = new_pbuf->last; - gazelle_ring_lastover(last_pbuf); - -- if (last_pbuf->tot_len > SOCK_READ_MAXLEN) { -+ if (last_pbuf->tot_len > TCP_WND) { - sock->read_wait = true; - } - } -@@ -1111,6 +1111,7 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s - conn->snd_buf = pcb->snd_buf; - conn->lastack = pcb->lastack; - conn->snd_nxt = pcb->snd_nxt; -+ conn->rcv_nxt = pcb->rcv_nxt; - - if (netconn != NULL && netconn->recvmbox != NULL) { - conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring); -diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h -index ac068b8..c3bc527 100644 ---- a/src/lstack/include/lstack_dpdk.h -+++ b/src/lstack/include/lstack_dpdk.h -@@ -24,8 +24,6 @@ - - #define MAX_PACKET_SZ 2048 - --#define SOCK_READ_MAXLEN 0x200000 -- - #define RING_SIZE(x) ((x) - 1) - - #define MBUF_SZ (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM) -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 7dda51c..53d1b47 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -880,7 +880,8 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - do { - printf("\n------ stack tid: %6u ------time=%lu\n", stat->tid, time.tv_sec * 1000000 + time.tv_usec); - printf("No. Proto lwip_recv recv_ring in_send send_ring cwn rcv_wnd snd_wnd snd_buf snd_nxt" -- " lastack events epoll_ev evlist fd Local Address Foreign Address State\n"); -+ " lastack rcv_nxt events epoll_ev evlist fd Local Address " -+ "Foreign Address State\n"); - uint32_t unread_pkts = 0; - uint32_t unsend_pkts = 0; - for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) { -@@ -889,16 +890,16 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_ - rip.s_addr = conn_info->rip; - lip.s_addr = conn_info->lip; - if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) { -- printf("%-6utcp %-10u%-10u%-8u%-10u%-9d%-9d%-10d%-10d%-15u%-15u%-10x%-10x%-7d%-7d" -+ printf("%-6utcp %-10u%-10u%-8u%-10u%-9d%-9d%-10d%-10d%-15u%-15u%-15u%-10x%-10x%-7d%-7d" - "%s:%hu %s:%hu %s\n", i, conn_info->recv_cnt, conn_info->recv_ring_cnt, conn_info->in_send, - conn_info->send_ring_cnt, conn_info->cwn, conn_info->rcv_wnd, conn_info->snd_wnd, -- conn_info->snd_buf, conn_info->snd_nxt, conn_info->lastack, conn_info->events, -+ conn_info->snd_buf, conn_info->snd_nxt, conn_info->lastack, conn_info->rcv_nxt, conn_info->events, - conn_info->epoll_events, conn_info->eventlist, conn_info->fd, - inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, - inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port, - tcp_state_to_str(conn_info->tcp_sub_state)); - } else if (conn_info->state == GAZELLE_LISTEN_LIST) { -- printf("%-6utcp %-57u%-7d%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, -+ printf("%-6utcp %-147u%-7d%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt, - conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port); - } else { - printf("Got unknow tcp conn::%s:%5hu, state:%u\n", --- -2.23.0 - diff --git a/0171-mbuf-private-data-size-align-cache-line.patch b/0171-mbuf-private-data-size-align-cache-line.patch deleted file mode 100644 index 7c6f11f..0000000 --- a/0171-mbuf-private-data-size-align-cache-line.patch +++ /dev/null @@ -1,44 +0,0 @@ -From d6428e24a2024f8583d0747abb832fe73393f82b Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 22 Dec 2022 23:15:38 +0800 -Subject: [PATCH 2/4] mbuf-private-data-size-align-cache-line - ---- - src/common/dpdk_common.h | 4 ++-- - src/lstack/core/lstack_dpdk.c | 5 +++-- - 2 files changed, 5 insertions(+), 4 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index e4a447a..08ce4a1 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -25,8 +25,8 @@ - #define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) - - /* Layout: -- * | rte_mbuf | gazelle_prive | custom_free_function | tcp_seg | payload | -- * | 128 | 16 | 56 | 32 | -+ * | rte_mbuf | gazelle_prive | pbuf_custom | tcp_seg | payload | -+ * | 128 | 16 | 64 | 32 | - * rte_prefetch0 in lwip project,tcp_out.c,tcp_output_segment use constants - **/ - struct pbuf; -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index 76ebe96..de87d48 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -144,8 +144,9 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - } - - /* time stamp before pbuf_custom as priv_data */ -- pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, -- sizeof(struct tcp_seg) + sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id()); -+ uint16_t private_size = sizeof(struct tcp_seg) + sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE; -+ private_size = RTE_ALIGN(private_size, RTE_CACHE_LINE_SIZE); -+ pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, private_size, MBUF_SZ, rte_socket_id()); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); - } --- -2.23.0 - diff --git a/0172-fix-send-pkts-bluk-err.patch b/0172-fix-send-pkts-bluk-err.patch deleted file mode 100644 index 79c3bec..0000000 --- a/0172-fix-send-pkts-bluk-err.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 24754f47cefc0284aeea0d122698789c51ff050d Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 22 Dec 2022 23:19:09 +0800 -Subject: [PATCH 3/4] fix-send-pkts-bluk-err - ---- - src/lstack/include/lstack_protocol_stack.h | 2 ++ - src/lstack/netif/lstack_ethdev.c | 16 ++++++---------- - 2 files changed, 8 insertions(+), 10 deletions(-) - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index c706afc..de3d312 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -29,8 +29,10 @@ - #define SOCK_SEND_RING_SIZE (32) - #define SOCK_SEND_REPLENISH_THRES (16) - #define WAKEUP_MAX_NUM (32) -+ - #define STACK_SEND_MAX 2048 - #define STACK_SEND_MASK (STACK_SEND_MAX - 1) -+#define STACK_SEND_INDEX(index) ((index) & STACK_SEND_MASK) - - struct rte_mempool; - struct rte_ring; -diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c -index 5729ebf..4426b1a 100644 ---- a/src/lstack/netif/lstack_ethdev.c -+++ b/src/lstack/netif/lstack_ethdev.c -@@ -149,20 +149,16 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, bool use_ltran_flag, - - static void add_send_pkt(struct protocol_stack *stack, struct rte_mbuf *mbuf) - { -- if (stack->send_end + 1 != stack->send_start) { -- stack->send_pkts[stack->send_end & STACK_SEND_MASK] = mbuf; -- stack->send_end++; -- return; -- } -- -- stack->stats.send_pkts_fail++; - do { -- stack_send_pkts(stack); -- if (stack->send_end + 1 != stack->send_start) { -- stack->send_pkts[stack->send_end & STACK_SEND_MASK] = mbuf; -+ if (STACK_SEND_INDEX(stack->send_end + 1) != STACK_SEND_INDEX(stack->send_start)) { -+ stack->send_pkts[STACK_SEND_INDEX(stack->send_end)] = mbuf; - stack->send_end++; - return; - } -+ -+ stack_send_pkts(stack); -+ -+ stack->stats.send_pkts_fail++; - } while (1); - } - --- -2.23.0 - diff --git a/0173-free-recv-pkts-bluks.patch b/0173-free-recv-pkts-bluks.patch deleted file mode 100644 index 80657ba..0000000 --- a/0173-free-recv-pkts-bluks.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 7edbb73f77c64706e9bf35ccfc8454f706c3b553 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 22 Dec 2022 23:26:54 +0800 -Subject: [PATCH 4/4] free-recv-pkts-bluks - ---- - src/lstack/core/lstack_lwip.c | 10 ++++++++-- - src/lstack/core/lstack_protocol_stack.c | 16 ++++++++++++++++ - src/lstack/include/lstack_protocol_stack.h | 7 +++++++ - 3 files changed, 31 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index bb6fe44..31f87cf 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -221,8 +221,14 @@ void gazelle_free_pbuf(struct pbuf *pbuf) - } - - struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf); -- pbuf->next = NULL; -- rte_pktmbuf_free_seg(mbuf); -+ struct protocol_stack *stack = get_protocol_stack(); -+ -+ if (STACK_FREE_INDEX(stack->free_end + 1) != STACK_FREE_INDEX(stack->free_start)) { -+ stack->free_pkts[STACK_FREE_INDEX(stack->free_end)] = mbuf; -+ stack->free_end++; -+ } else { -+ rte_pktmbuf_free_seg(mbuf); -+ } - } - - int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num) -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 16b124e..7b53b91 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -439,6 +439,20 @@ void stack_send_pkts(struct protocol_stack *stack) - stack->stats.tx += sent_pkts; - } - -+void stack_free_recv_pkts(struct protocol_stack *stack, uint32_t free_num) -+{ -+ if (stack->free_end == stack->free_start) { -+ return; -+ } -+ -+ uint32_t num = 0; -+ for (uint32_t i = stack->free_start; num < free_num && i < stack->free_end; i++) { -+ rte_pktmbuf_free_seg(stack->free_pkts[STACK_FREE_INDEX(i)]); -+ num++; -+ } -+ stack->free_start += num; -+} -+ - static void* gazelle_stack_thread(void *arg) - { - uint16_t queue_id = *(uint16_t *)arg; -@@ -469,6 +483,8 @@ static void* gazelle_stack_thread(void *arg) - for (;;) { - poll_rpc_msg(stack, rpc_number); - -+ stack_free_recv_pkts(stack, nic_read_number); -+ - gazelle_eth_dev_poll(stack, use_ltran_flag, nic_read_number); - - read_recv_list(stack, read_connect_number); -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index de3d312..4fe06cd 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -34,6 +34,10 @@ - #define STACK_SEND_MASK (STACK_SEND_MAX - 1) - #define STACK_SEND_INDEX(index) ((index) & STACK_SEND_MASK) - -+#define STACK_FREE_MAX 4096 -+#define STACK_FREE_MASK (STACK_FREE_MAX - 1) -+#define STACK_FREE_INDEX(index) ((index) & STACK_FREE_MASK) -+ - struct rte_mempool; - struct rte_ring; - struct rte_mbuf; -@@ -69,6 +73,9 @@ struct protocol_stack { - uint32_t rx_ring_used; - uint32_t tx_ring_used; - -+ uint32_t free_start; -+ uint32_t free_end; -+ struct rte_mbuf *free_pkts[STACK_FREE_MAX]; - uint32_t send_start; - uint32_t send_end; - struct rte_mbuf *send_pkts[STACK_SEND_MAX]; --- -2.23.0 - diff --git a/0174-fix-lstack-Makefile-warning.patch b/0174-fix-lstack-Makefile-warning.patch deleted file mode 100644 index 5490d24..0000000 --- a/0174-fix-lstack-Makefile-warning.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 3564b6cc6405b75864c133f419cf8c3771810f22 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Thu, 22 Dec 2022 10:31:32 +0800 -Subject: [PATCH] fix lstack Makefile warning - ---- - src/lstack/Makefile | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/lstack/Makefile b/src/lstack/Makefile -index b6cbd32..d56fd65 100644 ---- a/src/lstack/Makefile -+++ b/src/lstack/Makefile -@@ -21,11 +21,12 @@ OPTIMIZATION = -O2 -g - RM = rm -f - LDFLAGS = -shared -ldl -lm -lpthread -lrt -lnuma -lconfig -lboundscheck - --ifeq ($(CC),gcc) -+ifneq ($(CC),clang) - SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2 --else ifeq($(CC),clang) -+else - SEC_FLAGS = -fstack-protector-strong -Werror -Wall -fPIC - endif -+$(info $(CC):$(SEC_FLAGS)) - - INC = -I$(LSTACK_DIR)/include \ - -I$(LSTACK_DIR)/../common \ --- -2.33.0 - diff --git a/0175-fix-null-pointer-deref-in-stack_broadcast_close.patch b/0175-fix-null-pointer-deref-in-stack_broadcast_close.patch deleted file mode 100644 index fced0ca..0000000 --- a/0175-fix-null-pointer-deref-in-stack_broadcast_close.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 09c62a8577c340c0254c42bc57c0d193704aa169 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Fri, 23 Dec 2022 11:50:05 +0800 -Subject: [PATCH] fix null pointer deref in stack_broadcast_close - ---- - src/lstack/core/lstack_protocol_stack.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 7b53b91..9cc8946 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -783,7 +783,7 @@ int32_t stack_broadcast_close(int32_t fd) - ret = -1; - } - -- if (sock == NULL) { -+ if (sock == NULL || sock->conn == NULL) { - break; - } - fd = sock->conn->socket; --- -2.33.0 - diff --git a/0176-pbuf-align-cache-line.patch b/0176-pbuf-align-cache-line.patch deleted file mode 100644 index fc55d36..0000000 --- a/0176-pbuf-align-cache-line.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 2f907cc7c537ed857c23fb183bb5d5751c1e4d3a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 28 Dec 2022 16:50:48 +0800 -Subject: [PATCH 1/3] pbuf-align-cache-line - ---- - src/common/dpdk_common.h | 31 +++++++++++++++++------------ - src/common/gazelle_opt.h | 2 -- - src/lstack/core/lstack_dpdk.c | 3 +-- - src/lstack/core/lstack_stack_stat.c | 2 +- - src/ltran/ltran_ethdev.c | 6 ++++-- - 5 files changed, 24 insertions(+), 20 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 08ce4a1..49e03a7 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -21,22 +21,27 @@ - - #define GAZELLE_KNI_NAME "kni" // will be removed during dpdk update - --/* time_stamp time_stamp_vaid_check . align 8 */ --#define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf)) -- - /* Layout: -- * | rte_mbuf | gazelle_prive | pbuf_custom | tcp_seg | payload | -- * | 128 | 16 | 64 | 32 | -+ * | rte_mbuf | pbuf_custom| tcp_seg | gazelle_prive | payload | -+ * | 128 | 64 | 32 | 16 | - * rte_prefetch0 in lwip project,tcp_out.c,tcp_output_segment use constants -+ * cacheline is 64, make sure pbuf_custom in same cacheline - **/ - struct pbuf; --static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) -+#define LATENCY_TIMESTAMP_SIZE (sizeof(uint64_t) * 2) -+#define MBUF_PRIVATE_SIZE 128 -+#define LATENCY_OFFSET 96 -+static __rte_always_inline uint64_t *mbuf_to_private(struct rte_mbuf *mbuf) -+{ -+ return (uint64_t *)((uint8_t *)(mbuf) - sizeof(struct rte_mbuf) - LATENCY_OFFSET); -+} -+static __rte_always_inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p) - { -- return ((struct rte_mbuf *)(void *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE)); -+ return ((struct rte_mbuf *)(void *)((uint8_t *)(p) - sizeof(struct rte_mbuf))); - } --static inline struct pbuf_custom *mbuf_to_pbuf(struct rte_mbuf *m) -+static __rte_always_inline struct pbuf_custom *mbuf_to_pbuf(struct rte_mbuf *m) - { -- return ((struct pbuf_custom *)((uint8_t *)(m) + sizeof(struct rte_mbuf) + GAZELLE_MBUFF_PRIV_SIZE)); -+ return ((struct pbuf_custom *)((uint8_t *)(m) + sizeof(struct rte_mbuf))); - } - - /* NOTE!!! magic code, even the order. -@@ -62,15 +67,15 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf - rte_memcpy(dst_data, src_data, data_len); - - // copy private date. -- dst_data = (uint8_t *)PTR_TO_PRIVATE(dst); -- src_data = (uint8_t *)PTR_TO_PRIVATE(src); -- rte_memcpy(dst_data, src_data, GAZELLE_MBUFF_PRIV_SIZE); -+ dst_data = (uint8_t *)mbuf_to_private(dst); -+ src_data = (uint8_t *)mbuf_to_private(src); -+ rte_memcpy(dst_data, src_data, LATENCY_TIMESTAMP_SIZE); - } - - static __rte_always_inline void time_stamp_into_mbuf(uint32_t rx_count, struct rte_mbuf *buf[], uint64_t time_stamp) - { - for (uint32_t i = 0; i < rx_count; i++) { -- uint64_t *priv = (uint64_t *)PTR_TO_PRIVATE(buf[i]); -+ uint64_t *priv = mbuf_to_private(buf[i]); - *priv = time_stamp; // time stamp - *(priv + 1) = ~(*priv); // just for later vaid check - } -diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h -index 94f274d..012997c 100644 ---- a/src/common/gazelle_opt.h -+++ b/src/common/gazelle_opt.h -@@ -28,8 +28,6 @@ - - #define ETHER_ADDR_LEN 6 - --#define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2) -- - #define DEFAULT_RING_SIZE (512) - #define DEFAULT_RING_MASK (511) - #define DEFAULT_BACKUP_RING_SIZE_FACTOR (16) -diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c -index de87d48..560162f 100644 ---- a/src/lstack/core/lstack_dpdk.c -+++ b/src/lstack/core/lstack_dpdk.c -@@ -144,8 +144,7 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_ - } - - /* time stamp before pbuf_custom as priv_data */ -- uint16_t private_size = sizeof(struct tcp_seg) + sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE; -- private_size = RTE_ALIGN(private_size, RTE_CACHE_LINE_SIZE); -+ uint16_t private_size = RTE_ALIGN(MBUF_PRIVATE_SIZE, RTE_CACHE_LINE_SIZE); - pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size, private_size, MBUF_SZ, rte_socket_id()); - if (pool == NULL) { - LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno); -diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c -index 59c8e66..7243e82 100644 ---- a/src/lstack/core/lstack_stack_stat.c -+++ b/src/lstack/core/lstack_stack_stat.c -@@ -50,7 +50,7 @@ uint64_t get_current_time(void) - void calculate_lstack_latency(struct gazelle_stack_latency *stack_latency, const struct pbuf *pbuf, - enum GAZELLE_LATENCY_TYPE type) - { -- const uint64_t *priv = (uint64_t *)((uint8_t *)(pbuf) - GAZELLE_MBUFF_PRIV_SIZE); -+ const uint64_t *priv = (uint64_t *)((uint8_t *)(pbuf) - LATENCY_OFFSET); - if (*priv != ~(*(priv + 1)) || *priv < stack_latency->start_time) { - return; - } -diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c -index 62a662d..e0c824a 100644 ---- a/src/ltran/ltran_ethdev.c -+++ b/src/ltran/ltran_ethdev.c -@@ -147,7 +147,8 @@ static struct rte_mempool *ltran_create_rx_mbuf_pool(uint32_t bond_port_index) - return NULL; - } - -- return rte_pktmbuf_pool_create(mbuf_pool_name, num_mbufs, GAZELLE_MBUFS_CACHE_SIZE, GAZELLE_MBUFF_PRIV_SIZE, -+ uint16_t private_size = RTE_ALIGN(MBUF_PRIVATE_SIZE, RTE_CACHE_LINE_SIZE); -+ return rte_pktmbuf_pool_create(mbuf_pool_name, num_mbufs, GAZELLE_MBUFS_CACHE_SIZE, private_size, - RTE_MBUF_DEFAULT_BUF_SIZE, (int32_t)rte_socket_id()); - } - -@@ -165,7 +166,8 @@ static struct rte_mempool *ltran_create_tx_mbuf_pool(uint32_t bond_port_index) - return NULL; - } - -- return rte_pktmbuf_pool_create(mbuf_pool_name, num_mbufs, GAZELLE_MBUFS_CACHE_SIZE, GAZELLE_MBUFF_PRIV_SIZE, -+ uint16_t private_size = RTE_ALIGN(MBUF_PRIVATE_SIZE, RTE_CACHE_LINE_SIZE); -+ return rte_pktmbuf_pool_create(mbuf_pool_name, num_mbufs, GAZELLE_MBUFS_CACHE_SIZE, private_size, - RTE_MBUF_DEFAULT_BUF_SIZE, (int32_t)rte_socket_id()); - } - --- -2.23.0 - diff --git a/0177-support-set-main-thread-affinity.patch b/0177-support-set-main-thread-affinity.patch deleted file mode 100644 index ec2c786..0000000 --- a/0177-support-set-main-thread-affinity.patch +++ /dev/null @@ -1,155 +0,0 @@ -From c6d8e28b70d6ac86c1f8df6b94c179be4f8109f0 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 28 Dec 2022 17:05:57 +0800 -Subject: [PATCH 2/3] support-set-main-thread-affinity - ---- - src/lstack/core/lstack_cfg.c | 18 ++++++++++++++++++ - src/lstack/core/lstack_init.c | 18 +++++++++++------- - src/lstack/core/lstack_protocol_stack.c | 4 +--- - src/lstack/include/lstack_cfg.h | 1 + - src/lstack/lstack.conf | 5 +++++ - 5 files changed, 36 insertions(+), 10 deletions(-) - -diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c -index 55d16f9..4912fdd 100644 ---- a/src/lstack/core/lstack_cfg.c -+++ b/src/lstack/core/lstack_cfg.c -@@ -56,6 +56,7 @@ static int32_t parse_gateway_addr(void); - static int32_t parse_kni_switch(void); - static int32_t parse_listen_shadow(void); - static int32_t parse_app_bind_numa(void); -+static int32_t parse_main_thread_affinity(void); - static int32_t parse_unix_prefix(void); - static int32_t parse_rxtx_pool_size(void); - static int32_t parse_send_connect_number(void); -@@ -81,6 +82,7 @@ static struct config_vector_t g_config_tbl[] = { - { "kni_switch", parse_kni_switch }, - { "listen_shadow", parse_listen_shadow }, - { "app_bind_numa", parse_app_bind_numa }, -+ { "main_thread_affinity", parse_main_thread_affinity }, - { "unix_prefix", parse_unix_prefix }, - { "mbuf_pool_size", parse_rxtx_pool_size }, - { "send_connect_number", parse_send_connect_number }, -@@ -847,6 +849,22 @@ static int32_t parse_app_bind_numa(void) - return 0; - } - -+static int32_t parse_main_thread_affinity(void) -+{ -+ const config_setting_t *arg = NULL; -+ -+ arg = config_lookup(&g_config, "main_thread_affinity"); -+ if (arg == NULL) { -+ g_config_params.main_thread_affinity = false; -+ return 0; -+ } -+ -+ int32_t val = config_setting_get_int(arg); -+ g_config_params.main_thread_affinity = (val == 0) ? false : true; -+ -+ return 0; -+} -+ - static int32_t parse_kni_switch(void) - { - const config_setting_t *arg = NULL; -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index f647b8e..6347ab1 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -223,18 +223,18 @@ static void create_control_thread(void) - - pthread_t tid; - if (use_ltran()) { -+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); - dpdk_skip_nic_init(); - if (control_init_client(false) != 0) { - LSTACK_EXIT(1, "control_init_client failed\n"); - } -- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); - } else { -+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); - ret = dpdk_eal_init(); - if (ret < 0) { - LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno); - } - -- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); - } - if (ret != 0) { - LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno); -@@ -295,9 +295,11 @@ __attribute__((constructor)) void gazelle_network_init(void) - - /* - * save initial affinity */ -- if (thread_affinity_default() < 0) { -- LSTACK_PRE_LOG(LSTACK_ERR, "pthread_getaffinity_np failed\n"); -- LSTACK_EXIT(1, "pthread_getaffinity_np failed\n"); -+ if (!get_global_cfg_params()->main_thread_affinity) { -+ if (thread_affinity_default() < 0) { -+ LSTACK_PRE_LOG(LSTACK_ERR, "pthread_getaffinity_np failed\n"); -+ LSTACK_EXIT(1, "pthread_getaffinity_np failed\n"); -+ } - } - - gazelle_signal_init(); -@@ -309,8 +311,10 @@ __attribute__((constructor)) void gazelle_network_init(void) - - /* - * cancel the core binding from DPDK initialization */ -- if (thread_affinity_default() < 0) { -- LSTACK_EXIT(1, "pthread_setaffinity_np failed\n"); -+ if (!get_global_cfg_params()->main_thread_affinity) { -+ if (thread_affinity_default() < 0) { -+ LSTACK_EXIT(1, "pthread_setaffinity_np failed\n"); -+ } - } - - lstack_log_level_init(); -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index 9cc8946..ad9d026 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -255,9 +255,7 @@ static void* gazelle_kernelevent_thread(void *arg) - uint16_t queue_id = *(uint16_t *)arg; - struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id]; - -- if (get_global_cfg_params()->app_bind_numa) { -- bind_to_stack_numa(stack); -- } -+ bind_to_stack_numa(stack); - - LSTACK_LOG(INFO, LSTACK, "kernelevent_%02hu start\n", queue_id); - -diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h -index e33a484..bdaa083 100644 ---- a/src/lstack/include/lstack_cfg.h -+++ b/src/lstack/include/lstack_cfg.h -@@ -83,6 +83,7 @@ struct cfg_params { - bool kni_switch; - bool listen_shadow; // true:listen in all stack thread. false:listen in one stack thread. - bool app_bind_numa; -+ bool main_thread_affinity; - int dpdk_argc; - char **dpdk_argv; - struct secondary_attach_arg sec_attach_arg; -diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf -index 47140ad..c27db22 100644 ---- a/src/lstack/lstack.conf -+++ b/src/lstack/lstack.conf -@@ -34,6 +34,11 @@ num_cpus="2" - #each cpu core start a wakeup thread. - #num_wakeup="3" - -+#app worker thread bind to numa in epoll/poll. -+app_bind_numa=1 -+#app main thread affinity set by dpdk. -+main_thread_affinity=0 -+ - host_addr="192.168.1.10" - mask_addr="255.255.255.0" - gateway_addr="192.168.1.1" --- -2.23.0 - diff --git a/0178-reduce-epoll-wakeup.patch b/0178-reduce-epoll-wakeup.patch deleted file mode 100644 index 397e341..0000000 --- a/0178-reduce-epoll-wakeup.patch +++ /dev/null @@ -1,147 +0,0 @@ -From 99f46a3e20d44ec8736becee896ed519971aab52 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Wed, 28 Dec 2022 18:26:14 +0800 -Subject: [PATCH 3/3] reduce epoll wakeup - ---- - src/lstack/api/lstack_epoll.c | 28 +++++++++++-------------- - src/lstack/core/lstack_lwip.c | 1 + - src/lstack/core/lstack_protocol_stack.c | 8 +++---- - 3 files changed, 17 insertions(+), 20 deletions(-) - -diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c -index 605984f..7860163 100644 ---- a/src/lstack/api/lstack_epoll.c -+++ b/src/lstack/api/lstack_epoll.c -@@ -186,7 +186,7 @@ int32_t lstack_do_epoll_create(int32_t fd) - GAZELLE_RETURN(EINVAL); - } - pthread_mutex_trylock(&wakeup->wait); -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); - - struct protocol_stack_group *stack_group = get_protocol_stack_group(); - init_list_node_null(&wakeup->poll_list); -@@ -473,6 +473,7 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - } - - do { -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); - lwip_num = epoll_lwip_event(wakeup, events, maxevents); - wakeup->stat.app_events += lwip_num; - -@@ -484,11 +485,11 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - } - - if (lwip_num + kernel_num > 0) { -- return lwip_num + kernel_num; -+ break; - } - - if (timeout == 0) { -- return 0; -+ break; - } - - if (timeout < 0) { -@@ -498,13 +499,10 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe - ms_to_timespec(&epoll_time, timeout); - ret = pthread_mutex_timedlock(&wakeup->wait, &epoll_time); - } -- -- if (ret == 0) { -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -- } - } while (ret == 0); - -- return 0; -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ return lwip_num + kernel_num; - } - - static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) -@@ -513,7 +511,7 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup) - GAZELLE_RETURN(EINVAL); - } - pthread_mutex_trylock(&wakeup->wait); -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); - - for (uint32_t i = 0; i < PROTOCOL_STACK_MAX; i++) { - init_list_node_null(&wakeup->wakeup_list[i]); -@@ -680,6 +678,7 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - int32_t ret; - - do { -+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); - lwip_num = poll_lwip_event(fds, nfds); - - if (__atomic_load_n(&wakeup->have_kernel_event, __ATOMIC_ACQUIRE)) { -@@ -694,11 +693,11 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - } - - if (lwip_num + kernel_num > 0) { -- return lwip_num + kernel_num; -+ break; - } - - if (timeout == 0) { -- return 0; -+ break; - } - - if (timeout < 0) { -@@ -708,11 +707,8 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout) - ms_to_timespec(&epoll_time, timeout); - ret = pthread_mutex_timedlock(&wakeup->wait, &epoll_time); - } -- -- if (ret == 0) { -- __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE); -- } - } while (ret == 0); - -- return 0; -+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE); -+ return lwip_num + kernel_num; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 31f87cf..01c7280 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -598,6 +598,7 @@ void stack_send(struct rpc_msg *msg) - } - - __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE); -+ rte_mb(); - - /* have remain data or replenish again add sendlist */ - if (sock->errevent == 0 && NETCONN_IS_DATAOUT(sock)) { -diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c -index ad9d026..93204d1 100644 ---- a/src/lstack/core/lstack_protocol_stack.c -+++ b/src/lstack/core/lstack_protocol_stack.c -@@ -481,16 +481,16 @@ static void* gazelle_stack_thread(void *arg) - for (;;) { - poll_rpc_msg(stack, rpc_number); - -+ send_stack_list(stack, send_connect_number); -+ -+ stack_send_pkts(stack); -+ - stack_free_recv_pkts(stack, nic_read_number); - - gazelle_eth_dev_poll(stack, use_ltran_flag, nic_read_number); - - read_recv_list(stack, read_connect_number); - -- send_stack_list(stack, send_connect_number); -- -- stack_send_pkts(stack); -- - if ((wakeup_tick & 0xf) == 0) { - wakeup_kernel_event(stack); - wakeup_stack_epoll(stack, wakeup_thread_enable); --- -2.23.0 - diff --git a/0179-revert-expand-recv-data-buff.patch b/0179-revert-expand-recv-data-buff.patch deleted file mode 100644 index 4b1749f..0000000 --- a/0179-revert-expand-recv-data-buff.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 9389400a55d1e82abf736eb3112998c1c2fc0ef8 Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Fri, 30 Dec 2022 15:42:55 +0800 -Subject: [PATCH] revert-expand-recv-data-buff - ---- - src/common/dpdk_common.h | 2 +- - src/lstack/core/lstack_lwip.c | 153 +++++++--------------------------- - 2 files changed, 31 insertions(+), 124 deletions(-) - -diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h -index 49e03a7..4053a2c 100644 ---- a/src/common/dpdk_common.h -+++ b/src/common/dpdk_common.h -@@ -198,7 +198,7 @@ static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void * - - __rte_ring_dequeue_elems(r, prod, obj_table, sizeof(void *), n); - -- __atomic_store_n(&r->prod.head, prod + n, __ATOMIC_RELEASE); -+ r->prod.head = prod + n; - - return n; - } -diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c -index 01c7280..f23419d 100644 ---- a/src/lstack/core/lstack_lwip.c -+++ b/src/lstack/core/lstack_lwip.c -@@ -83,11 +83,6 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->send_lastdata = NULL; - } - -- if (sock->lwip_lastdata) { -- free_list_pbuf(sock->lwip_lastdata); -- sock->lwip_lastdata = NULL; -- } -- - if (sock->send_pre_del) { - pbuf_free(sock->send_pre_del); - sock->send_pre_del = NULL; -@@ -100,7 +95,6 @@ static void reset_sock_data(struct lwip_sock *sock) - sock->events = 0; - sock->in_send = 0; - sock->remain_len = 0; -- sock->read_wait = false; - - if (sock->recv_lastdata) { - pbuf_free(sock->recv_lastdata); -@@ -684,135 +678,60 @@ static inline struct pbuf *pbuf_last(struct pbuf *pbuf) - return pbuf; - } - --static struct pbuf *merge_pbufs(struct pbuf *pbufs[], uint32_t data_count, uint32_t data_len) -+ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) - { -- struct pbuf *pre_last = (pbufs[0]->last) ? pbufs[0]->last : pbuf_last(pbufs[0]); -- -- if (data_count <= 1) { -- pbufs[0]->last = pre_last; -- return pbufs[0]; -- } -- -- for (uint32_t i = 1; i < data_count; i++) { -- pre_last->next = pbufs[i]; -- pre_last = pbuf_last(pbufs[i]); -+ if (sock->conn->recvmbox == NULL) { -+ return 0; - } - -- pbufs[0]->tot_len = data_len; -- pbufs[0]->last = pre_last; -+ free_recv_ring_readover(sock->recv_ring); - -- return pbufs[0]; --} -+ uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); -+ if (free_count == 0) { -+ GAZELLE_RETURN(EAGAIN); -+ } - --static int32_t get_lwip_pbufs(struct lwip_sock *sock, struct pbuf *pbufs[], uint32_t *data_count, u8_t apiflags) --{ -- uint32_t data_len = 0; -+ uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -+ uint32_t read_num = LWIP_MIN(free_count, data_count); -+ struct pbuf *pbufs[SOCK_RECV_RING_SIZE]; -+ uint32_t read_count = 0; -+ ssize_t recv_len = 0; - -- for (uint32_t i = 0; i < *data_count; i++) { -+ for (uint32_t i = 0; i < read_num; i++) { - err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbufs[i], apiflags); - if (err != ERR_OK) { -- *data_count = i; -- if (data_len > 0) { -+ if (recv_len > 0) { - /* already received data, return that (this trusts in getting the same error from - netconn layer again next time netconn_recv is called) */ - break; - } -- return (err == ERR_CLSD) ? -1 : 0; -+ return (err == ERR_CLSD) ? 0 : -1; - } - -- pbufs[i]->last = NULL; -- pbufs[i]->in_write = 0; -- data_len += pbufs[i]->tot_len; -+ recv_len += pbufs[i]->tot_len; -+ read_count++; - - /* once we have some data to return, only add more if we don't need to wait */ - apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN; - } - -- return (int32_t)data_len; --} -- --static void put_pbufs_into_recv_ring(struct lwip_sock *sock, struct pbuf *pbufs[], -- uint32_t data_count, uint32_t data_len) --{ -- uint32_t free_count = gazelle_ring_free_count(sock->recv_ring); -- -- if (data_count <= free_count) { -- (void)gazelle_ring_sp_enqueue(sock->recv_ring, (void **)pbufs, data_count); -- return; -- } -- -- struct pbuf *new_pbuf = merge_pbufs(pbufs, data_count, data_len); -- -- if (free_count) { -- (void)gazelle_ring_sp_enqueue(sock->recv_ring, (void **)&new_pbuf, 1); -- return; -- } -- -- struct pbuf *last_pbuf = gazelle_ring_enqueuelast(sock->recv_ring); -- if (last_pbuf == NULL) { -- sock->lwip_lastdata = new_pbuf; -- return; -- } -- -- if (last_pbuf->last == NULL) { -- last_pbuf->last = pbuf_last(last_pbuf); -- } -- last_pbuf->last->next = new_pbuf; -- last_pbuf->tot_len += new_pbuf->tot_len; -- last_pbuf->last = new_pbuf->last; -- gazelle_ring_lastover(last_pbuf); -- -- if (last_pbuf->tot_len > TCP_WND) { -- sock->read_wait = true; -- } --} -- --ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags) --{ -- if (sock->conn->recvmbox == NULL) { -- return 0; -- } -- -- free_recv_ring_readover(sock->recv_ring); -- -- if (sock->read_wait) { -- GAZELLE_RETURN(EAGAIN); -- } -- -- struct pbuf *pbufs[SOCK_RECV_RING_SIZE]; -- uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring); -- int32_t data_len = get_lwip_pbufs(sock, pbufs, &data_count, apiflags); -- if (unlikely(data_len < 0)) { -- /* ERR_CLSD */ -- return 0; -- } else if (unlikely(data_len == 0) && !sock->lwip_lastdata) { -- GAZELLE_RETURN(EAGAIN); -+ uint32_t enqueue_num = gazelle_ring_sp_enqueue(sock->recv_ring, (void **)pbufs, read_count); -+ for (uint32_t i = enqueue_num; i < read_count; i++) { -+ /* update receive window */ -+ tcp_recved(sock->conn->pcb.tcp, pbufs[i]->tot_len); -+ pbuf_free(pbufs[i]); -+ sock->stack->stats.read_lwip_drop++; - } - -- if (get_protocol_stack_group()->latency_start) { -- for (uint32_t i = 0; i < data_count; i++) { -- calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); -- } -+ for (uint32_t i = 0; get_protocol_stack_group()->latency_start && i < read_count; i++) { -+ calculate_lstack_latency(&sock->stack->latency, pbufs[i], GAZELLE_LATENCY_LWIP); - } - -- if (data_count) { -- uint32_t last_len = 0; -- if (sock->lwip_lastdata) { -- last_len = sock->lwip_lastdata->tot_len; -- sock->lwip_lastdata->last->next = pbufs[0]; -- sock->lwip_lastdata->tot_len += pbufs[0]->tot_len; -- sock->lwip_lastdata->last = pbuf_last(pbufs[0]); -- pbufs[0] = sock->lwip_lastdata; -- sock->lwip_lastdata = NULL; -- } -- put_pbufs_into_recv_ring(sock, pbufs, data_count, data_len + last_len); -- } else { -- put_pbufs_into_recv_ring(sock, &sock->lwip_lastdata, 1, sock->lwip_lastdata->tot_len); -- sock->lwip_lastdata = NULL; -+ sock->stack->stats.read_lwip_cnt += read_count; -+ if (recv_len == 0) { -+ GAZELLE_RETURN(EAGAIN); - } -- sock->stack->stats.read_lwip_cnt += data_count; -- -- return data_len; -+ return recv_len; - } - - static int32_t check_msg_vaild(const struct msghdr *message) -@@ -978,10 +897,6 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - return 0; - } - -- if (recv_left > UINT16_MAX) { -- recv_left = UINT16_MAX; -- } -- - while (recv_left > 0) { - if (sock->recv_lastdata) { - pbuf = sock->recv_lastdata; -@@ -991,10 +906,6 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - break; - } - } -- if (__atomic_load_n(&pbuf->in_write, __ATOMIC_ACQUIRE)) { -- sock->recv_lastdata = pbuf; -- break; -- } - - copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : recv_left; - if (copy_len > UINT16_MAX) { -@@ -1019,10 +930,6 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags) - } - } - -- if (sock->read_wait) { -- sock->read_wait = false; -- } -- - /* rte_ring_count reduce lock */ - if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN)) { - del_data_in_event(sock); --- -2.23.0 - diff --git a/0180-add-the-suggestion-of-using-the-u-parameter-when-the.patch b/0180-add-the-suggestion-of-using-the-u-parameter-when-the.patch deleted file mode 100644 index b0f7c1e..0000000 --- a/0180-add-the-suggestion-of-using-the-u-parameter-when-the.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 224d243532c2ebcfd6a03df6d4e90208c9d1b3de Mon Sep 17 00:00:00 2001 -From: kircher -Date: Thu, 5 Jan 2023 19:39:39 +0800 -Subject: [PATCH] add the suggestion of using the -u parameter when the - connection to unix socket fails - ---- - src/ltran/ltran_dfx.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c -index 53d1b47..1c9d4fa 100644 ---- a/src/ltran/ltran_dfx.c -+++ b/src/ltran/ltran_dfx.c -@@ -198,6 +198,7 @@ static int32_t dfx_connect_ltran(bool use_ltran, bool probe) - if (ret == -1) { - if (!probe) { - printf("connect ltran failed. errno: %d ret=%d\n", errno, ret); -+ printf("You may need to use the -u parameter to specify the UNIX_PREFIX that matches the configuration.\n"); - } - close(fd); - return GAZELLE_ERR; -@@ -1220,6 +1221,7 @@ static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32 - } - /* keep output consistency */ - printf("connect ltran failed. errno: 111 ret=-1\n"); -+ printf("You may need to use the -u parameter to specify the UNIX_PREFIX that matches the configuration.\n"); - return -1; - } - } --- -2.33.0 - diff --git a/0181-move-control_client_thread-creation-after-control_in.patch b/0181-move-control_client_thread-creation-after-control_in.patch deleted file mode 100644 index a22fe9c..0000000 --- a/0181-move-control_client_thread-creation-after-control_in.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 400c9f494c2217cba4ca48af83c53f36663dc066 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Tue, 10 Jan 2023 20:11:05 +0800 -Subject: [PATCH] move control_client_thread creation after control_in and - dpdk_skip_nic_init - ---- - src/lstack/core/lstack_init.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 6347ab1..477c5e2 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -223,11 +223,14 @@ static void create_control_thread(void) - - pthread_t tid; - if (use_ltran()) { -- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); -+ /* -+ * The function call here should be in strict order. -+ */ - dpdk_skip_nic_init(); - if (control_init_client(false) != 0) { - LSTACK_EXIT(1, "control_init_client failed\n"); - } -+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); - } else { - ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); - ret = dpdk_eal_init(); --- -2.33.0 - diff --git a/0182-add-ret-check-in-pthread_create-and-fix-example-bug.patch b/0182-add-ret-check-in-pthread_create-and-fix-example-bug.patch deleted file mode 100644 index 04f741e..0000000 --- a/0182-add-ret-check-in-pthread_create-and-fix-example-bug.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 627773adfafefdf295e680691c3d5b99c6b52c8c Mon Sep 17 00:00:00 2001 -From: kircher -Date: Tue, 10 Jan 2023 20:35:11 +0800 -Subject: [PATCH] add ret check in pthread_create and fix example bug - ---- - examples/src/utilities.c | 16 +++++++++++++++- - src/lstack/core/lstack_init.c | 10 ++++++---- - 2 files changed, 21 insertions(+), 5 deletions(-) - -diff --git a/examples/src/utilities.c b/examples/src/utilities.c -index b6ed269..38a0d3e 100644 ---- a/examples/src/utilities.c -+++ b/examples/src/utilities.c -@@ -124,5 +124,19 @@ int32_t create_socket_and_connect(int32_t *socket_fd, in_addr_t ip, uint16_t por - // set the socket to unblock - int32_t set_socket_unblock(int32_t socket_fd) - { -- return fcntl(socket_fd, F_SETFL, fcntl(socket_fd, F_GETFD, 0) | O_NONBLOCK); -+ int flags = -1; -+ -+ flags = fcntl(socket_fd, F_GETFL, 0); -+ if (flags == -1) { -+ printf("get socket flag error, fd:[%d], errno: %d\n", socket_fd, errno); -+ return -1; -+ } -+ -+ flags |= O_NONBLOCK; -+ if (fcntl(socket_fd, F_SETFL, flags) == -1) { -+ printf("set socket flag error, fd:[%d], errno: %d\n", socket_fd, errno); -+ return -1; -+ } -+ -+ return 0; - } -diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c -index 477c5e2..6309d1d 100644 ---- a/src/lstack/core/lstack_init.c -+++ b/src/lstack/core/lstack_init.c -@@ -231,16 +231,18 @@ static void create_control_thread(void) - LSTACK_EXIT(1, "control_init_client failed\n"); - } - ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL); -+ if (ret != 0) { -+ LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno); -+ } - } else { - ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL); -+ if (ret != 0) { -+ LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno); -+ } - ret = dpdk_eal_init(); - if (ret < 0) { - LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno); - } -- -- } -- if (ret != 0) { -- LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno); - } - - if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) { --- -2.33.0 - diff --git a/0183-add-log-message-when-wait-for-connecting-to-ltran.patch b/0183-add-log-message-when-wait-for-connecting-to-ltran.patch deleted file mode 100644 index 731acc7..0000000 --- a/0183-add-log-message-when-wait-for-connecting-to-ltran.patch +++ /dev/null @@ -1,24 +0,0 @@ -From eb3f797f679605c26355aea152b249dfd3852786 Mon Sep 17 00:00:00 2001 -From: kircher -Date: Sun, 29 Jan 2023 21:02:33 +0800 -Subject: [PATCH] add log message when wait for connecting to ltran - ---- - src/lstack/core/lstack_control_plane.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c -index bf55df5..bc2c55d 100644 ---- a/src/lstack/core/lstack_control_plane.c -+++ b/src/lstack/core/lstack_control_plane.c -@@ -97,6 +97,7 @@ static int32_t connect_to_ltran(int32_t times, int32_t interval) - return sockfd; - } - -+ LSTACK_LOG(INFO, LSTACK, "wait for connecting to ltran\n"); - int32_t ret = posix_api->connect_fn(sockfd, (struct sockaddr*)&address, sizeof(address)); - if (ret == 0) { - return sockfd; --- -2.33.0 - diff --git a/0184-add-gazelle-fuzz.patch b/0184-add-gazelle-fuzz.patch deleted file mode 100644 index 4779d9c..0000000 --- a/0184-add-gazelle-fuzz.patch +++ /dev/null @@ -1,544 +0,0 @@ -From b8a055fd42c14f3934c80d8eff98c6c5ac5246f2 Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Tue, 31 Jan 2023 14:23:55 +0800 -Subject: [PATCH] add gazelle fuzz - ---- - test/fuzz/CMakeLists.txt | 22 ++++ - test/fuzz/fuzz.dict | 1 + - test/fuzz/fuzz.sh | 117 ++++++++++++++++++ - test/fuzz/lstack_config/CMakeLists.txt | 25 ++++ - test/fuzz/lstack_config/lstack.conf | 17 +++ - test/fuzz/lstack_config/lstack_config_fuzz.c | 106 ++++++++++++++++ - test/fuzz/ltran_config/CMakeLists.txt | 23 ++++ - test/fuzz/ltran_config/corpus/sample_data | 1 + - .../ltran_config/dict/ltran_config_fuzz.dict | 1 + - test/fuzz/ltran_config/ltran.conf | 26 ++++ - test/fuzz/ltran_config/ltran_config_fuzz.c | 106 ++++++++++++++++ - 11 files changed, 445 insertions(+) - create mode 100644 test/fuzz/CMakeLists.txt - create mode 100644 test/fuzz/fuzz.dict - create mode 100644 test/fuzz/fuzz.sh - create mode 100644 test/fuzz/lstack_config/CMakeLists.txt - create mode 100644 test/fuzz/lstack_config/lstack.conf - create mode 100644 test/fuzz/lstack_config/lstack_config_fuzz.c - create mode 100644 test/fuzz/ltran_config/CMakeLists.txt - create mode 100644 test/fuzz/ltran_config/corpus/sample_data - create mode 100644 test/fuzz/ltran_config/dict/ltran_config_fuzz.dict - create mode 100644 test/fuzz/ltran_config/ltran.conf - create mode 100644 test/fuzz/ltran_config/ltran_config_fuzz.c - -diff --git a/test/fuzz/CMakeLists.txt b/test/fuzz/CMakeLists.txt -new file mode 100644 -index 0000000..6d0f41e ---- /dev/null -+++ b/test/fuzz/CMakeLists.txt -@@ -0,0 +1,22 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+SET(CMAKE_C_COMPILER "clang") -+project(gazelle_test) -+set(COMMON_PATH ${PROJECT_SOURCE_DIR}/../../src/common) -+add_library(common_obj OBJECT ${COMMON_PATH}/gazelle_parse_config.c) -+ -+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -fsanitize=fuzzer,address -g") -+SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -fprofile-arcs -ftest-coverage -fsanitize=fuzzer") -+# testcase -+add_subdirectory(ltran_config) -+add_subdirectory(lstack_config) -+ -diff --git a/test/fuzz/fuzz.dict b/test/fuzz/fuzz.dict -new file mode 100644 -index 0000000..8b8441b ---- /dev/null -+++ b/test/fuzz/fuzz.dict -@@ -0,0 +1 @@ -+"test" -diff --git a/test/fuzz/fuzz.sh b/test/fuzz/fuzz.sh -new file mode 100644 -index 0000000..c941776 ---- /dev/null -+++ b/test/fuzz/fuzz.sh -@@ -0,0 +1,117 @@ -+#!/bin/bash -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+ -+function generate_coverage() -+{ -+ local target_dir=$(dirname `pwd`) -+ echo ------------------ generate coverage begin -------------- -+ if [ -d ${target_dir}/build/coverage/html ]; then -+ rm -rf ${target_dir}/build/coverage/html -+ fi -+ mkdir -p ${target_dir}/build/coverage/html -+ if [ x"${COVER_FILE}" = x"" ]; then -+ LCOV_CMD="-d ${target_dir}" -+ else -+ GCDAS=`find ${target_dir} -name "${COVER_FILE}.gcda"` -+ if [ $? != 0 ]; then -+ echo -e "\033[;31mnot find\033[0m ${COVER_FILE}.gcda" -+ exit 1 -+ fi -+ -+ for GCDA in ${GCDAS}; do -+ TMP_STR=" -d ${GCDA}"; -+ LCOV_CMD="${LCOV_CMD} ${TMP_STR}"; -+ done -+ fi -+ -+ # lcov -c ${LCOV_CMD} -o ${target_dir}/build/coverage/html/coverage.info --exclude '*_test.c' --include '*.c' --include '*.cpp' --include '*.cc' --rc lcov_branch_coverage=1 --ignore-errors gcov --ignore-errors source --ignore-errors graph -+ lcov -c ${LCOV_CMD} -b $(dirname $(pwd)) --exclude '*test*' --exclude '*.h' -o ${target_dir}/build/coverage/html/coverage.info --rc lcov_branch_coverage=1 --ignore-errors gcov --ignore-errors source --ignore-errors graph -+ if [ $? != 0 ]; then -+ echo -e "lcov generate coverage.info \033[;31mfail\033[0m." -+ exit 1 -+ fi -+ -+ genhtml ${target_dir}/build/coverage/html/coverage.info -o ${target_dir}/build/coverage/html --branch-coverage --rc lcov_branch_coverage=1 -s --legend --ignore-errors source -+ if [ $? != 0 ]; then -+ echo -e "genhtml \033[;31mfail\033[0m." -+ exit 1 -+ fi -+ chmod 755 -R ${target_dir}/build/coverage/html -+ echo ------------------ generate coverage end ---------------- -+} -+ -+LIB_FUZZING_ENGINE="/lib64/libFuzzer.a" -+FUZZ_OPTION="../corpus -dict=../fuzz.dict -runs=30000000 -max_total_time=10800 -artifact_prefix=fuzz-" -+ -+if [ ! -f $LIB_FUZZING_ENGINE ]; then -+ echo "$LIB_FUZZING_ENGINE not exist, pls check" -+ exit 1 -+fi -+ -+rm -rf build -+mkdir build -+cd build -+ -+sed 's/ read(/ s_read(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ write/ s_write/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ fcntl(/ s_fcntl(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ socket(/ s_socket(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ close(/ s_close(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ write(/ s_write(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ send(/ s_send(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ sendmsg(/ s_sendmsg(/' -i ../../../src/lstack/api/lstack_wrap.c -+ -+cmake .. -+make -j -+ -+export ASAN_OPTIONS=halt_on_error=0 -+ -+usage() -+{ -+ echo "Usage: fuzz.sh [ltran_config | lstack_config | lstack_api]" -+} -+ -+case "$1" in -+ ltran_config) -+ ./ltran_config_fuzz $FUZZ_OPTION;; -+ lstack_config) -+ ./lstack_config_fuzz $FUZZ_OPTION;; -+ lstack_api) -+ ./lstack_api_fuzz $FUZZ_OPTION;; -+ *) -+ echo "param is wrong" -+ usage; exit 0;; -+esac -+ -+# 运行fuzz测试程序 -+ -+# 查找crash文件 -+echo "############# Fuzz Result #############" -+crash=`find -name "*-crash-*"` -+if [ x"$crash" != x"" ]; then -+ echo "find bugs while fuzzing, pls check <*-crash-*> file" -+ find -name "*-crash-*" -+ echo "fuzz failed" -+else -+ echo "all fuzz success." -+fi -+ -+generate_coverage -+ -+sed 's/ s_read/ read/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_write/ write/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_fcntl(/ fcntl(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_socket(/ socket(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_close(/ close(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_write(/ write(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_send(/ send(/' -i ../../../src/lstack/api/lstack_wrap.c -+sed 's/ s_sendmsg(/ sendmsg(/' -i ../../../src/lstack/api/lstack_wrap.c -diff --git a/test/fuzz/lstack_config/CMakeLists.txt b/test/fuzz/lstack_config/CMakeLists.txt -new file mode 100644 -index 0000000..6f306a2 ---- /dev/null -+++ b/test/fuzz/lstack_config/CMakeLists.txt -@@ -0,0 +1,25 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+project(gazelle_test) -+ -+set(SDK_PATH /usr/include/dpdk) -+set(LWIP_PATH /usr/include/lwip) -+set(LIB_PATH ${PROJECT_SOURCE_DIR}/../../../src/lstack/include) -+set(SRC_PATH ${PROJECT_SOURCE_DIR}/../../../src/lstack/core) -+add_executable(lstack_config_fuzz lstack_config_fuzz.c ${SRC_PATH}/lstack_cfg.c) -+ -+target_compile_options(lstack_config_fuzz PRIVATE -DUSE_LIBOS_MEM) -+ -+SET(EXECUTABLE_OUTPUT_PATH ../) -+ -+target_include_directories(lstack_config_fuzz PRIVATE ${LIB_PATH} ${SDK_PATH} ${LWIP_PATH} ${COMMON_PATH}) -+target_link_libraries(lstack_config_fuzz PRIVATE pthread config securec liblwip.a common_obj) -diff --git a/test/fuzz/lstack_config/lstack.conf b/test/fuzz/lstack_config/lstack.conf -new file mode 100644 -index 0000000..3851c3d ---- /dev/null -+++ b/test/fuzz/lstack_config/lstack.conf -@@ -0,0 +1,17 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+dpdk_args=["-l", "2", "--socket-mem", "2048,0,0,0", "--huge-dir", "/mnt/hugepages-2M", "--proc-type", "primary"] -+num_cpus=1 -+ -+host_addr="192.168.1.10" -+mask_addr="255.255.255.0" -+gateway_addr="192.168.1.1" -+devices="aa:bb:cc:dd:ee:ff" -diff --git a/test/fuzz/lstack_config/lstack_config_fuzz.c b/test/fuzz/lstack_config/lstack_config_fuzz.c -new file mode 100644 -index 0000000..cd69f5c ---- /dev/null -+++ b/test/fuzz/lstack_config/lstack_config_fuzz.c -@@ -0,0 +1,106 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "lstack_cfg.h" -+#include "lstack_protocol_stack.h" -+ -+#define MAX_CMD_LEN 1024 -+#define MAX_STR_LEN 20 -+ -+#define FUZZ_LSTACK_CONF_PATH_TMP "./lstack.conf" -+#define FUZZ_LSTACK_CONF_PATH "/etc/gazelle/lstack.conf" -+#define FUZZ_LSTACK_CONF_PATH_BAK "/etc/gazelle/lstack.conf.bak" -+ -+void lwip_set_host_ipv4(unsigned int ipv4) -+{ -+ return; -+} -+ -+int rte_log(uint32_t level, uint32_t logtype, const char *format, ...) -+{ -+ return 0; -+} -+ -+static struct protocol_stack_group g_stack_group = {0}; -+struct protocol_stack_group *get_protocol_stack_group(void) -+{ -+ return &g_stack_group; -+} -+ -+int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) -+{ -+ char str[MAX_STR_LEN + 1] = {0}; -+ char cmd[MAX_CMD_LEN + 1] = {0}; -+ char *sed_str[] = {"dpdk_args", "host_addr", "mask_addr", "gateway_addr", "devices"}; -+ static int index = 0; -+ struct cfg_params *cfg_params = get_global_cfg_params(); -+ -+ if (data == NULL) { -+ return 0; -+ } -+ -+ system("mkdir -p /etc/gazelle"); -+ -+ if (sprintf_s(cmd, MAX_CMD_LEN, "cp -f %s %s; cp -f %s %s", FUZZ_LSTACK_CONF_PATH, FUZZ_LSTACK_CONF_PATH_BAK, -+ FUZZ_LSTACK_CONF_PATH_TMP, FUZZ_LSTACK_CONF_PATH) < 0) { -+ return -1; -+ } -+ system(cmd); -+ -+ for (int i = 0; i < MAX_STR_LEN && i < size; i++) { -+ if (((data[i] >= 'a') && (data[i] <= 'z')) || -+ ((data[i] >= 'A') && (data[i] <= 'Z')) || -+ ((data[i] >= '0') && (data[i] <= '9'))) { -+ str[i] = data[i]; -+ } else { -+ str[i] = ' '; -+ } -+ } -+ index = (index + 1) % 5; /* 5:匹配字符串总数 */ -+ if (sprintf_s(cmd, MAX_CMD_LEN, "sed -i '/%s/s/\".*\"/\"%s\"/' %s", -+ sed_str[index], str, FUZZ_LSTACK_CONF_PATH) < 0) { -+ return -1; -+ } -+ system(cmd); -+ -+ memset_s(cfg_params, sizeof(struct cfg_params), 0, sizeof(*cfg_params)); -+ -+ // test parse config -+ (void)cfg_init(); -+ -+ // free memory if used -+ if (cfg_params->dpdk_argv) { -+ if (cfg_params->dpdk_argv[0] != NULL) { -+ free(cfg_params->dpdk_argv[0]); -+ } -+ for (int i = 0; i < cfg_params->dpdk_argc; i++) { -+ if (cfg_params->dpdk_argv[i + 1] != NULL) { -+ free(cfg_params->dpdk_argv[i + 1]); -+ } -+ } -+ free(cfg_params->dpdk_argv); -+ } -+ -+ if (sprintf_s(cmd, MAX_CMD_LEN, "cp -f %s %s;rm -f %s", FUZZ_LSTACK_CONF_PATH_BAK, FUZZ_LSTACK_CONF_PATH, -+ FUZZ_LSTACK_CONF_PATH_BAK) < 0) { -+ return -1; -+ } -+ system(cmd); -+ return 0; -+} -+ -diff --git a/test/fuzz/ltran_config/CMakeLists.txt b/test/fuzz/ltran_config/CMakeLists.txt -new file mode 100644 -index 0000000..0c4614c ---- /dev/null -+++ b/test/fuzz/ltran_config/CMakeLists.txt -@@ -0,0 +1,23 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+project(gazelle_test) -+ -+set(SDK_PATH /usr/include/dpdk) -+set(LIB_PATH ${PROJECT_SOURCE_DIR}/../../../src/ltran) -+set(SRC_PATH ${PROJECT_SOURCE_DIR}/../../../src/ltran) -+ -+SET(EXECUTABLE_OUTPUT_PATH ../) -+ -+add_executable(ltran_config_fuzz ltran_config_fuzz.c ${SRC_PATH}/ltran_param.c ${SRC_PATH}/ltran_errno.c) -+ -+target_include_directories(ltran_config_fuzz PRIVATE ${LIB_PATH} ${SDK_PATH} ${COMMON_PATH}) -+target_link_libraries(ltran_config_fuzz PRIVATE securec pthread config common_obj) -diff --git a/test/fuzz/ltran_config/corpus/sample_data b/test/fuzz/ltran_config/corpus/sample_data -new file mode 100644 -index 0000000..72943a1 ---- /dev/null -+++ b/test/fuzz/ltran_config/corpus/sample_data -@@ -0,0 +1 @@ -+aaa -diff --git a/test/fuzz/ltran_config/dict/ltran_config_fuzz.dict b/test/fuzz/ltran_config/dict/ltran_config_fuzz.dict -new file mode 100644 -index 0000000..8b8441b ---- /dev/null -+++ b/test/fuzz/ltran_config/dict/ltran_config_fuzz.dict -@@ -0,0 +1 @@ -+"test" -diff --git a/test/fuzz/ltran_config/ltran.conf b/test/fuzz/ltran_config/ltran.conf -new file mode 100644 -index 0000000..019b107 ---- /dev/null -+++ b/test/fuzz/ltran_config/ltran.conf -@@ -0,0 +1,26 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+forward_kit="dpdk" -+forward_kit_args="-l 0,1 --socket-mem 1024,0,0,0 --huge-dir /mnt/hugepages-ltran --proc-type primary --legacy-mem --map-perfect --syslog daemon" -+ -+kni_switch=0 -+ -+dispatch_max_clients=30 -+dispatch_subnet="192.168.1.0" -+dispatch_subnet_length=8 -+ -+bond_mode=1 -+bond_mtu=1500 -+bond_miimon=100 -+bond_macs="aa:bb:cc:dd:ee:ff" -+bond_ports="0x1" -+ -+tcp_conn_scan_interval=10 -diff --git a/test/fuzz/ltran_config/ltran_config_fuzz.c b/test/fuzz/ltran_config/ltran_config_fuzz.c -new file mode 100644 -index 0000000..7d27125 ---- /dev/null -+++ b/test/fuzz/ltran_config/ltran_config_fuzz.c -@@ -0,0 +1,106 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "ltran_base.h" -+#include "ltran_param.h" -+ -+#define MAX_CMD_LEN 1024 -+#define MAX_STR_LEN 20 -+ -+#define FUZZ_LTRAN_CONF_PATH "./ltran.conf" -+#define FUZZ_LTRAN_CONF_PATH_TMP "./ltran_tmp.conf" -+ -+int rte_log(uint32_t level, uint32_t logtype, const char *format, ...) -+{ -+ return 0; -+} -+ -+void restore_conf_file(const unsigned char *data, size_t size) -+{ -+ int ret; -+ char cmd[MAX_CMD_LEN]; -+ char str[MAX_STR_LEN + 1] = {0}; -+ char *sed_str[] = {"forward_kit_args", "kni_switch", "dispatch_subnet", "dispatch_subnet_length", -+ "dispatch_max_clients", "bond_mode", "bond_miimon", "bond_mtu", "bond_ports", "bond_macs", -+ "tcp_conn_scan_interval"}; -+ static int index = 0; -+ -+ // reset conf file -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "rm -f %s", FUZZ_LTRAN_CONF_PATH_TMP); -+ if (ret < 0) { -+ return; -+ } -+ system(cmd); -+ -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "cp -f %s %s", FUZZ_LTRAN_CONF_PATH, FUZZ_LTRAN_CONF_PATH_TMP); -+ if (ret < 0) { -+ return; -+ } -+ system(cmd); -+ -+ for (int i = 0; i < MAX_STR_LEN && i < size; i++) { -+ if (((data[i] >= 'a') && (data[i] <= 'z')) || -+ ((data[i] >= 'A') && (data[i] <= 'Z')) || -+ ((data[i] >= '0') && (data[i] <= '9'))) { -+ str[i] = data[i]; -+ } else { -+ str[i] = ' '; -+ } -+ } -+ index = (index + 1) % 11; /* 11:匹配字符串总数 */ -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '/%s/s/= .*/= \"%s\"/' %s", -+ sed_str[index], str, FUZZ_LTRAN_CONF_PATH_TMP); -+ if (ret < 0) { -+ return; -+ } -+ system(cmd); -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '/%s/s/= [0-9].*/= %s/' %s", -+ sed_str[index], str, FUZZ_LTRAN_CONF_PATH_TMP); -+ if (ret < 0) { -+ return; -+ } -+ system(cmd); -+} -+ -+int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) -+{ -+ struct ltran_config ltran_config; -+ -+ if (data == NULL) { -+ return 0; -+ } -+ -+ restore_conf_file(data, size); -+ (void)memset_s(<ran_config, sizeof(struct ltran_config), 0, sizeof(struct ltran_config)); -+ -+ // test parse DEFAULT_LTRAN_CONF_PATH_TMP -+ (void)parse_config_file_args(FUZZ_LTRAN_CONF_PATH_TMP, <ran_config); -+ // free memory if used -+ for (int i = 0; i < ltran_config.dpdk.dpdk_argc; i++) { -+ if ((ltran_config.dpdk.dpdk_argv != NULL) && -+ (ltran_config.dpdk.dpdk_argv[i] != NULL)) { -+ free(ltran_config.dpdk.dpdk_argv[i]); -+ ltran_config.dpdk.dpdk_argv[i] != NULL; -+ } -+ } -+ if (ltran_config.dpdk.dpdk_argv != NULL) { -+ free(ltran_config.dpdk.dpdk_argv); -+ ltran_config.dpdk.dpdk_argv = NULL; -+ } -+ return 0; -+} -+ --- -2.33.0 - diff --git a/0185-add-unitest.patch b/0185-add-unitest.patch deleted file mode 100644 index f679dff..0000000 --- a/0185-add-unitest.patch +++ /dev/null @@ -1,1962 +0,0 @@ -From 4154201d36719047c7a74d5b6d495228234ff54a Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Wed, 1 Feb 2023 15:58:00 +0800 -Subject: [PATCH] add unitest - ---- - src/lstack/include/lstack_protocol_stack.h | 1 + - test/unitest/CMakeLists.txt | 17 ++ - test/unitest/lstack/CMakeLists.txt | 29 ++ - test/unitest/lstack/config/lstack.conf | 21 ++ - test/unitest/lstack/lstack_param_test.c | 206 +++++++++++++ - test/unitest/lstack/lstack_test_case.h | 24 ++ - test/unitest/lstack/lstack_unit_test.c | 206 +++++++++++++ - test/unitest/lstack/main.c | 75 +++++ - test/unitest/lstack/stub.c | 110 +++++++ - test/unitest/ltran/CMakeLists.txt | 58 ++++ - test/unitest/ltran/config/ltran.conf | 23 ++ - test/unitest/ltran/libnet_tcp_test.c | 133 +++++++++ - test/unitest/ltran/ltran_instance_test.c | 75 +++++ - test/unitest/ltran/ltran_param_test.c | 320 +++++++++++++++++++++ - test/unitest/ltran/ltran_stack_test.c | 75 +++++ - test/unitest/ltran/ltran_test_case.h | 29 ++ - test/unitest/ltran/main.c | 80 ++++++ - test/unitest/stub.c | 34 +++ - test/unitest/test.sh | 279 ++++++++++++++++++ - 19 files changed, 1795 insertions(+) - create mode 100644 test/unitest/CMakeLists.txt - create mode 100644 test/unitest/lstack/CMakeLists.txt - create mode 100644 test/unitest/lstack/config/lstack.conf - create mode 100644 test/unitest/lstack/lstack_param_test.c - create mode 100644 test/unitest/lstack/lstack_test_case.h - create mode 100644 test/unitest/lstack/lstack_unit_test.c - create mode 100644 test/unitest/lstack/main.c - create mode 100644 test/unitest/lstack/stub.c - create mode 100644 test/unitest/ltran/CMakeLists.txt - create mode 100644 test/unitest/ltran/config/ltran.conf - create mode 100644 test/unitest/ltran/libnet_tcp_test.c - create mode 100644 test/unitest/ltran/ltran_instance_test.c - create mode 100644 test/unitest/ltran/ltran_param_test.c - create mode 100644 test/unitest/ltran/ltran_stack_test.c - create mode 100644 test/unitest/ltran/ltran_test_case.h - create mode 100644 test/unitest/ltran/main.c - create mode 100644 test/unitest/stub.c - create mode 100644 test/unitest/test.sh - -diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h -index 4fe06cd..b093362 100644 ---- a/src/lstack/include/lstack_protocol_stack.h -+++ b/src/lstack/include/lstack_protocol_stack.h -@@ -15,6 +15,7 @@ - - #include - #include -+#include - - #include - #include -diff --git a/test/unitest/CMakeLists.txt b/test/unitest/CMakeLists.txt -new file mode 100644 -index 0000000..e4946e8 ---- /dev/null -+++ b/test/unitest/CMakeLists.txt -@@ -0,0 +1,17 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+project(gazelle_unittest) -+ -+set(CMAKE_C_FLAGS "-g -D_FORTIFY_SOURCE=2 -O3 -fPIE -fstack-protector-strong -msse4.1") -+ -+add_subdirectory(lstack) -+add_subdirectory(ltran) -diff --git a/test/unitest/lstack/CMakeLists.txt b/test/unitest/lstack/CMakeLists.txt -new file mode 100644 -index 0000000..66dac0f ---- /dev/null -+++ b/test/unitest/lstack/CMakeLists.txt -@@ -0,0 +1,29 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+project(gazelle_unittest) -+ -+set(SRC_PATH ../../../src/lstack/core) -+set(COMMON_PATH ../../../src/common) -+set(LIB_PATH ../../../src/lstack /usr/include/dpdk /usr/include/lwip ${COMMON_PATH} ../../../src/lstack/include /usr/lib64) -+set(EXECUTABLE_OUTPUT_PATH ../) -+ -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") -+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -fprofile-arcs -ftest-coverage -lgcov") -+ -+set(LIBRTE_LIB rte_pci rte_bus_pci rte_cmdline rte_hash rte_mempool rte_mempool_ring rte_timer rte_eal rte_ring rte_mbuf rte_kni rte_net_ixgbe rte_ethdev rte_net rte_kvargs) -+ -+add_executable(lstack_test lstack_param_test.c stub.c main.c ${SRC_PATH}/lstack_cfg.c ${COMMON_PATH}/gazelle_parse_config.c) -+target_include_directories(lstack_test PRIVATE ${LIB_PATH}) -+target_link_libraries(lstack_test PRIVATE config boundscheck cunit lwip pthread ${LIBRTE_LIB}) -+#target_link_libraries(lstack_param_test PRIVATE config cunit) -+ -+target_compile_options(lstack_test PRIVATE -DUSE_LIBOS_MEM) -diff --git a/test/unitest/lstack/config/lstack.conf b/test/unitest/lstack/config/lstack.conf -new file mode 100644 -index 0000000..4be9173 ---- /dev/null -+++ b/test/unitest/lstack/config/lstack.conf -@@ -0,0 +1,21 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+dpdk_args=["--socket-mem", "2048,0,0,0", "--huge-dir", "/mnt/hugepages-2M", "--proc-type", "primary"] -+use_ltran=0 -+low_power_mode=0 -+num_cpus="0,2,4" -+num_weakup="1,3,5" -+ -+numa_bind=1 -+host_addr="192.168.1.10" -+mask_addr="255.255.255.0" -+gateway_addr="192.168.1.1" -+devices="aa:bb:cc:dd:ee:ff" -diff --git a/test/unitest/lstack/lstack_param_test.c b/test/unitest/lstack/lstack_param_test.c -new file mode 100644 -index 0000000..efd07a2 ---- /dev/null -+++ b/test/unitest/lstack/lstack_param_test.c -@@ -0,0 +1,206 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "lstack_cfg.h" -+ -+#define MAX_CMD_LEN 1024 -+ -+int parse_conf_file(const char *path); -+ -+static int execute_cmd(const char *cmd) -+{ -+ int result; -+ result = system(cmd); -+ if (result < 0) { -+ printf("Executing cmd: %s error!!!\n", cmd); -+ } -+ return result; -+} -+ -+static int lstack_bad_param(const char *conf_file_filed) -+{ -+ int ret; -+ const char *conf_file_path = "../lstack/config/lstack_tmp.conf"; -+ char cmd[MAX_CMD_LEN]; -+ -+ execute_cmd("rm -rf ../lstack/config/lstack_tmp.conf"); -+ execute_cmd("cp -f ../lstack/config/lstack.conf ../lstack/config/lstack_tmp.conf"); -+ -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '%s' %s", conf_file_filed, conf_file_path); -+ if (ret < 0) { -+ printf("sprintf_s cmd error %s %s!!!\n", conf_file_filed, conf_file_path); -+ return ret; -+ } -+ -+ execute_cmd(cmd); -+ -+ ret = parse_conf_file(conf_file_path); -+ -+ return ret; -+} -+ -+void test_lstack_bad_params_lowpower(void) -+{ -+ /* lstack start lowpower empty */ -+ CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=/") != 0); -+ -+ /* lstack start lowpower none */ -+ CU_ASSERT(lstack_bad_param("/low_power_mode/d") == 0); -+ -+ /* lstack start lowpower exceed str */ -+ CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=aaa/") != 0); -+} -+ -+void test_lstack_bad_params_num_cpus(void) -+{ -+ /* lstack start num_cpus empty */ -+ CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=/") != 0); -+ -+ /* lstack start num_cpus none */ -+ CU_ASSERT(lstack_bad_param("/num_cpus/d") != 0); -+ -+ /* lstack start num_cpus exceed str */ -+ CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=aaa/") != 0); -+} -+ -+void test_lstack_bad_params_host_addr(void) -+{ -+ /* lstack start host_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=/") != 0); -+ -+ /* lstack start host_addr none */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/d") != 0); -+ -+ /* lstack start host_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"aaa\"/") != 0); -+ -+ /* lstack start host_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"192.168.1.256\"/") != 0); -+} -+ -+void test_lstack_bad_params_mask_addr(void) -+{ -+ /* lstack start mask_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=/") != 0); -+ -+ /* lstack start mask_addr none */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/d") != 0); -+ -+ /* lstack start mask_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"aaa\"/") != 0); -+ -+ /* lstack start mask_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"256.255.255.0\"/") != 0); -+ -+ /* lstack start mask_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"255.254.255.0\"/") != 0); -+} -+ -+void test_lstack_bad_params_gateway_addr(void) -+{ -+ /* lstack start gateway_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=/") != 0); -+ -+ /* lstack start gateway_addr none */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/d") != 0); -+ -+ /* lstack start gateway_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"aaa\"/") != 0); -+ -+ /* lstack start gateway_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"192.168.1.256\"/") != 0); -+} -+ -+void test_lstack_bad_params_devices(void) -+{ -+ /* lstack start devices empty */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=/") != 0); -+ -+ /* lstack start devices none */ -+ CU_ASSERT(lstack_bad_param("/^devices/d") != 0); -+ -+ /* lstack start devices invaild str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"aaa\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:ff:ff\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff-ff\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:fg\"/") != 0); -+} -+ -+void test_lstack_normal_param(void) -+{ -+ int ret; -+ char ip_str[16] = {0}; /* 16:IP max len */ -+ char str[18] = {0}; -+ const char *config_file_path = "../lstack/config/lstack.conf"; -+ -+ ret = parse_conf_file(config_file_path); -+ CU_ASSERT(ret == 0); -+ struct cfg_params *global_params = get_global_cfg_params(); -+ for (int i =0; i< global_params->dpdk_argc; i++) -+ printf("arcv is %s\n", global_params->dpdk_argv[i]); -+ -+ CU_ASSERT(global_params->dpdk_argc == 9); /* 9:参数个数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[0], "lstack") == 0); -+ CU_ASSERT(strcmp(global_params->dpdk_argv[1], "--socket-mem") == 0); /* 1:lstack 参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[2], "2048,0,0,0") == 0); /* 2:lstack 参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[3], "--huge-dir") == 0); /* 3:lstack socket内存参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[4], "/mnt/hugepages-2M") == 0); /* 4:lstack socket内存值 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[5], "--proc-type") == 0); /* 5:lstack huge路径参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[6], "primary") == 0); /* 6:lstack huge路径值 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[7], "-l") == 0); /* 7:lstack进程类型参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[8], "0,2,4") == 0); /* 8:lstack参数 */ -+ -+ struct in_addr tmp_subnet; -+ tmp_subnet.s_addr = global_params->host_addr.addr; -+ char *subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "192.168.1.10") == 0); -+ free(subnet_str); -+ -+ tmp_subnet.s_addr = global_params->netmask.addr; -+ subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "255.255.255.0") == 0); -+ free(subnet_str); -+ -+ tmp_subnet.s_addr = global_params->gateway_addr.addr; -+ subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "192.168.1.1") == 0); -+ free(subnet_str); -+ -+ /* MAC地址转换为字符串 */ -+ ret = sprintf_s(str, sizeof(str), "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", global_params->mac_addr[0], -+ global_params->mac_addr[1], -+ global_params->mac_addr[2], // 2mac地址 -+ global_params->mac_addr[3], // 3mac地址 -+ global_params->mac_addr[4], // 4mac地址 -+ global_params->mac_addr[5]); // 5mac地址 -+ CU_ASSERT(ret > 0); -+ CU_ASSERT(strcmp(str, "aa:bb:cc:dd:ee:ff") == 0); /* 匹配的MAC地址 */ -+} -diff --git a/test/unitest/lstack/lstack_test_case.h b/test/unitest/lstack/lstack_test_case.h -new file mode 100644 -index 0000000..cdb2550 ---- /dev/null -+++ b/test/unitest/lstack/lstack_test_case.h -@@ -0,0 +1,24 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __LSTACK_TEST_CASE_H__ -+#define __LSTACK_TEST_CASE_H__ -+ -+void test_lstack_normal_param(void); -+void test_lstack_bad_params_devices(void); -+void test_lstack_bad_params_gateway_addr(void); -+void test_lstack_bad_params_mask_addr(void); -+void test_lstack_bad_params_host_addr(void); -+void test_lstack_bad_params_num_cpus(void); -+void test_lstack_bad_params_lowpower(void); -+ -+#endif -diff --git a/test/unitest/lstack/lstack_unit_test.c b/test/unitest/lstack/lstack_unit_test.c -new file mode 100644 -index 0000000..041a7cc ---- /dev/null -+++ b/test/unitest/lstack/lstack_unit_test.c -@@ -0,0 +1,206 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "lstack_cfg.h" -+ -+#define MAX_CMD_LEN 1024 -+ -+int parse_conf_file(const char *path); -+ -+static int execute_cmd(const char *cmd) -+{ -+ int result; -+ result = system(cmd); -+ if (result < 0) { -+ printf("Executing cmd: %s error!!!\n", cmd); -+ } -+ return result; -+} -+ -+static int lstack_bad_param(const char *conf_file_filed) -+{ -+ int ret; -+ const char *conf_file_path = "../lstack/config/lstack_tmp.conf"; -+ char cmd[MAX_CMD_LEN]; -+ -+ execute_cmd("rm -rf ../lstack/config/lstack_tmp.conf"); -+ execute_cmd("cp -f ../lstack/config/lstack.conf ../lstack/config/lstack_tmp.conf"); -+ -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '%s' %s", conf_file_filed, conf_file_path); -+ if (ret < 0) { -+ printf("sprintf_s cmd error %s %s!!!\n", conf_file_filed, conf_file_path); -+ return ret; -+ } -+ -+ execute_cmd(cmd); -+ -+ ret = parse_conf_file(conf_file_path); -+ -+ return ret; -+} -+ -+void test_lstack_bad_params_lowpower(void) -+{ -+ /* lstack start lowpower empty */ -+ CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=/") != 0); -+ -+ /* lstack start lowpower none */ -+ CU_ASSERT(lstack_bad_param("/low_power_mode/d") == 0); -+ -+ /* lstack start lowpower exceed str */ -+ CU_ASSERT(lstack_bad_param("/^low_power_mode/clow_power_mode=aaa/") != 0); -+} -+ -+void test_lstack_bad_params_num_cpus(void) -+{ -+ /* lstack start num_cpus empty */ -+ CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=/") != 0); -+ -+ /* lstack start num_cpus none */ -+ CU_ASSERT(lstack_bad_param("/num_cpus/d") != 0); -+ -+ /* lstack start num_cpus exceed str */ -+ CU_ASSERT(lstack_bad_param("/^num_cpus/cnum_cpus=aaa/") != 0); -+} -+ -+void test_lstack_bad_params_host_addr(void) -+{ -+ /* lstack start host_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=/") != 0); -+ -+ /* lstack start host_addr none */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/d") != 0); -+ -+ /* lstack start host_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"aaa\"/") != 0); -+ -+ /* lstack start host_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^host_addr/chost_addr=\"192.168.1.256\"/") != 0); -+} -+ -+void test_lstack_bad_params_mask_addr(void) -+{ -+ /* lstack start mask_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=/") != 0); -+ -+ /* lstack start mask_addr none */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/d") != 0); -+ -+ /* lstack start mask_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"aaa\"/") != 0); -+ -+ /* lstack start mask_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"256.255.255.0\"/") != 0); -+ -+ /* lstack start mask_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^mask_addr/cmask_addr=\"255.254.255.0\"/") != 0); -+} -+ -+void test_lstack_bad_params_gateway_addr(void) -+{ -+ /* lstack start gateway_addr empty */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=/") != 0); -+ -+ /* lstack start gateway_addr none */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/d") != 0); -+ -+ /* lstack start gateway_addr invaild str */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"aaa\"/") != 0); -+ -+ /* lstack start gateway_addr exceed str */ -+ CU_ASSERT(lstack_bad_param("/^gateway_addr/cgateway_addr=\"192.168.1.256\"/") != 0); -+} -+ -+void test_lstack_bad_params_devices(void) -+{ -+ /* lstack start devices empty */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=/") != 0); -+ -+ /* lstack start devices none */ -+ CU_ASSERT(lstack_bad_param("/^devices/d") != 0); -+ -+ /* lstack start devices invaild str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"aaa\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:ff:ff\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff-ff\"/") != 0); -+ -+ /* lstack start devices exceed str */ -+ CU_ASSERT(lstack_bad_param("/^devices/cdevices=\"ff:ff:ff:ff:ff:fg\"/") != 0); -+} -+ -+void test_lstack_normal_param(void) -+{ -+ int ret; -+ char ip_str[16] = {0}; /* 16:IP max len */ -+ char str[18] = {0}; -+ const char *config_file_path = "../lstack/config/lstack.conf"; -+ -+ ret = parse_conf_file(config_file_path); -+ CU_ASSERT(ret == 0); -+ struct cfg_params *global_params = get_global_cfg_params(); -+ for (int i =0; i< global_params->dpdk_argc; i++) -+ printf("arcv is %s\n", global_params->dpdk_argv[i]); -+ -+ CU_ASSERT(global_params->dpdk_argc == 9); /* 9:参数个数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[0], "lstack") == 0); -+ CU_ASSERT(strcmp(global_params->dpdk_argv[1], "--socket-mem") == 0); /* 1:lstack 参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[2], "2048,0,0,0") == 0); /* 2:lstack 参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[3], "--huge-dir") == 0); /* 3:lstack socket内存参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[4], "/mnt/hugepages-2M") == 0); /* 4:lstack socket内存值 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[5], "--proc-type") == 0); /* 5:lstack huge路径参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[6], "primary") == 0); /* 6:lstack huge路径值 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[7], "-l") == 0); /* 7:lstack进程类型参数 */ -+ CU_ASSERT(strcmp(global_params->dpdk_argv[8], "0,2,4") == 0); /* 8:lstack参数 */ -+ -+ struct in_addr tmp_subnet; -+ tmp_subnet.s_addr = global_params->host_addr.addr; -+ char *subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "192.168.1.10") == 0); -+ free(subnet_str); -+ -+ tmp_subnet.s_addr = global_params->netmask.addr; -+ subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "255.255.255.0") == 0); -+ free(subnet_str); -+ -+ tmp_subnet.s_addr = global_params->gateway_addr.addr; -+ subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(strcmp(subnet_str, "192.168.1.1") == 0); -+ free(subnet_str); -+ -+ /* MAC地址转换为字符串 */ -+ ret = sprintf_s(str, sizeof(str), "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", global_params->ethdev.addr_bytes[0], -+ global_params->ethdev.addr_bytes[1], -+ global_params->ethdev.addr_bytes[2], // 2mac地址 -+ global_params->ethdev.addr_bytes[3], // 3mac地址 -+ global_params->ethdev.addr_bytes[4], // 4mac地址 -+ global_params->ethdev.addr_bytes[5]); // 5mac地址 -+ CU_ASSERT(ret > 0); -+ CU_ASSERT(strcmp(str, "aa:bb:cc:dd:ee:ff") == 0); /* 匹配的MAC地址 */ -+} -diff --git a/test/unitest/lstack/main.c b/test/unitest/lstack/main.c -new file mode 100644 -index 0000000..84285dd ---- /dev/null -+++ b/test/unitest/lstack/main.c -@@ -0,0 +1,75 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "lstack_test_case.h" -+ -+typedef enum { -+ LSTACK_SCREEN = 0, -+ LSTACK_XMLFILE, -+ LSTACK_CONSOLE -+} CU_RunMode; -+ -+int main(int argc, char **argv) -+{ -+ CU_pSuite suite; -+ int num_failures; -+ CU_RunMode g_cunit_mode = LSTACK_SCREEN; -+ -+ if (argc > 1) { -+ g_cunit_mode = atoi(argv[1]); -+ } -+ -+ if (CU_initialize_registry() != CUE_SUCCESS) { -+ return CU_get_error(); -+ } -+ -+ suite = CU_add_suite("lstack", NULL, NULL); -+ if (suite == NULL) { -+ CU_cleanup_registry(); -+ return CU_get_error(); -+ } -+ -+ (void)CU_ADD_TEST(suite, test_lstack_normal_param); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_devices); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_gateway_addr); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_mask_addr); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_host_addr); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_num_cpus); -+ (void)CU_ADD_TEST(suite, test_lstack_bad_params_lowpower); -+ -+ switch (g_cunit_mode) { -+ case LSTACK_SCREEN: -+ CU_basic_set_mode(CU_BRM_VERBOSE); -+ CU_basic_run_tests(); -+ break; -+ case LSTACK_XMLFILE: -+ CU_set_output_filename("param"); -+ CU_list_tests_to_file(); -+ CU_automated_run_tests(); -+ break; -+ case LSTACK_CONSOLE: -+ CU_console_run_tests(); -+ break; -+ default: -+ (void)printf("not suport cunit mode, only suport: 0 or 1\n"); -+ CU_cleanup_registry(); -+ return CU_get_error(); -+ } -+ -+ num_failures = (int)CU_get_number_of_failures(); -+ CU_cleanup_registry(); -+ return num_failures; -+} -diff --git a/test/unitest/lstack/stub.c b/test/unitest/lstack/stub.c -new file mode 100644 -index 0000000..f1a3a84 ---- /dev/null -+++ b/test/unitest/lstack/stub.c -@@ -0,0 +1,110 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+int lwip_epoll_create(int size) -+{ -+ return 0; -+} -+int lwip_epoll_ctl(int epfd, int op, int fd, const void *event) -+{ -+ return 0; -+} -+int lwip_epoll_wait(int epfd, const void* events, int maxevents, int timeout) -+{ -+ return 0; -+} -+void libnet_per_thread_init(void) -+{ -+ return; -+} -+int lwip_sigaction(int signum, const void *act, const void *oldact) -+{ -+ return 0; -+} -+int lwip_fork(void) -+{ -+ return 0; -+} -+int del_epoll_event(const void *conn, int event) -+{ -+ return 0; -+} -+int add_epoll_event(const void *conn, int event) -+{ -+ return 0; -+} -+int rearm_accept_fd(int fd) -+{ -+ return 0; -+} -+void clean_host_fd(int fd) -+{ -+ return; -+} -+int rearm_host_fd(int fd) -+{ -+ return 0; -+} -+int lwip_is_epfd(int epfd) -+{ -+ return 0; -+} -+int lwip_epoll_close(int epfd) -+{ -+ return 0; -+} -+int eth_dev_poll(void) -+{ -+ return 0; -+} -+int vdev_reg_xmit(int type, const void *qtuple) -+{ -+ return 0; -+} -+ -+void *__wrap_memp_malloc(int type) -+{ -+ void *memp; -+ -+ memp = malloc(5 * 1024 * 1024); /* 5 * 1024 * 1024 = 5M */ -+ -+ return memp; -+} -+ -+int __wrap_sys_mbox_new(const struct sys_mbox **mb, int size) -+{ -+ return 0; -+} -+ -+int __wrap_netconn_prepare_delete(const struct netconn *conn) -+{ -+ return 0; -+} -+ -+int __wrap_netconn_delete(struct netconn *conn) -+{ -+ if (conn != NULL) { -+ free(conn->pcb.tcp); -+ free(conn->op_completed); -+ free(conn); -+ conn = NULL; -+ } -+ return 0; -+} -diff --git a/test/unitest/ltran/CMakeLists.txt b/test/unitest/ltran/CMakeLists.txt -new file mode 100644 -index 0000000..9496053 ---- /dev/null -+++ b/test/unitest/ltran/CMakeLists.txt -@@ -0,0 +1,58 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+cmake_minimum_required(VERSION 3.12.1) -+project(gazelle_unittest) -+ -+set(LIB_PATH ../../../src/ltran /usr/include/dpdk ../../../src/common ../../../src/lstack/include) -+set(SRC_PATH_LTRAN ../../../src/ltran) -+set(EXECUTABLE_OUTPUT_PATH ../) -+ -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") -+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -fprofile-arcs -ftest-coverage -lgcov") -+ -+add_executable(ltran_test -+ ltran_instance_test.c -+ ltran_param_test.c -+ ltran_stack_test.c -+ libnet_tcp_test.c -+ main.c -+ ../stub.c -+ ${SRC_PATH_LTRAN}/ltran_param.c -+ ${SRC_PATH_LTRAN}/ltran_errno.c -+ ${SRC_PATH_LTRAN}/ltran_instance.c -+ ${SRC_PATH_LTRAN}/ltran_stack.c -+ ${SRC_PATH_LTRAN}/ltran_tcp_sock.c -+ ${SRC_PATH_LTRAN}/ltran_tcp_conn.c -+ ${SRC_PATH_LTRAN}/../common/gazelle_dfx_msg.c -+ ${SRC_PATH_LTRAN}/../common/gazelle_parse_config.c -+) -+ -+set_target_properties(ltran_test PROPERTIES LINK_FLAGS "-L$ENV{DPDK_LIB_PATH} -Wl,--whole-archive -Wl,-lrte_pipeline -Wl,--wrap=rte_free -Wl,--wrap=rte_malloc \ -+ -Wl,--no-whole-archive -Wl,--whole-archive -Wl,-lrte_table -Wl,--no-whole-archive -Wl,--whole-archive -Wl,-lrte_port -Wl,--no-whole-archive \ -+ -Wl,-lrte_distributor -Wl,-lrte_ip_frag -Wl,-lrte_meter -Wl,-lrte_lpm -Wl,--whole-archive -Wl,-lrte_acl -Wl,--no-whole-archive \ -+ -Wl,-lrte_jobstats -Wl,-lrte_bitratestats -Wl,-lrte_metrics -Wl,-lrte_latencystats -Wl,-lrte_power -Wl,-lrte_efd -Wl,-lrte_bpf \ -+ -Wl,--whole-archive -Wl,-lrte_gro -Wl,-lrte_cfgfile -Wl,-lrte_gso -Wl,-lrte_hash -Wl,-lrte_member -Wl,-lrte_vhost -Wl,-lrte_kvargs \ -+ -Wl,-lrte_mbuf -Wl,-lrte_ethdev -Wl,-lrte_net -Wl,-lrte_bbdev -Wl,-lrte_cryptodev -Wl,-lrte_security -Wl,-lrte_compressdev -Wl,-lrte_eventdev \ -+ -Wl,-lrte_rawdev -Wl,-lrte_timer -Wl,-lrte_mempool -Wl,-lrte_mempool_ring -Wl,-lrte_ring -Wl,-lrte_pci \ -+ -Wl,-Bstatic -lrte_eal -Wl,-Bdynamic -Wl,-lrte_cmdline \ -+ -Wl,-lrte_sched -Wl,-lrte_reorder -Wl,-lrte_kni -Wl,-lrte_common_cpt -Wl,-lrte_common_octeontx -Wl,-lrte_common_dpaax -Wl,-lrte_bus_pci \ -+ -Wl,-lrte_bus_dpaa -Wl,-lrte_bus_vdev -Wl,-lrte_bus_fslmc -Wl,-lrte_mempool_bucket -Wl,-lrte_mempool_stack -Wl,-lrte_mempool_dpaa \ -+ -Wl,-lrte_mempool_dpaa2 -Wl,-lrte_net_af_packet -Wl,-lrte_net_ark -Wl,-lrte_net_atlantic -Wl,-lrte_net_axgbe \ -+ -Wl,-lrte_net_bnxt -Wl,-lrte_net_bond -Wl,-lrte_net_cxgbe -Wl,-lrte_net_dpaa -Wl,-lrte_net_dpaa2 -Wl,-lrte_net_e1000 -Wl,-lrte_net_ena \ -+ -Wl,-lrte_net_enetc -Wl,-lrte_net_enic -Wl,-lrte_net_failsafe -Wl,-lrte_net_i40e -Wl,-lrte_net_hinic -Wl,-lrte_net_ixgbe -Wl,-lrte_net_kni \ -+ -Wl,-lrte_net_nfp -Wl,-lrte_net_null -Wl,-lpcap -Wl,-lrte_net_qede -Wl,-lrte_net_ring -Wl,-lrte_net_softnic \ -+ -Wl,-lrte_net_tap -Wl,-lrte_net_vdev_netvsc -Wl,-lrte_net_virtio -Wl,-lrte_net_vhost \ -+ -Wl,-lrte_bus_vmbus -Wl,-lrte_net_netvsc -Wl,-lrte_mempool_octeontx -Wl,-lrte_net_octeontx \ -+ -Wl,-lrte_bus_ifpga -Wl,-lrte_stack -Wl,-lrte_telemetry\ -+ -Wl,--no-whole-archive -Wl,-lm -Wl,-lrt -Wl,-lnuma -Wl,-ldl -Wl,-export-dynamic -Wl,-export-dynamic \ -+ -Wl,--as-needed -Wl,-export-dynamic -Wl,-Map=ltran.map -Wl,--cref") -+target_include_directories(ltran_test PRIVATE ${LIB_PATH}) -+target_link_libraries(ltran_test PRIVATE config boundscheck cunit pthread) -diff --git a/test/unitest/ltran/config/ltran.conf b/test/unitest/ltran/config/ltran.conf -new file mode 100644 -index 0000000..bbab844 ---- /dev/null -+++ b/test/unitest/ltran/config/ltran.conf -@@ -0,0 +1,23 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+forward_kit = "dpdk" -+forward_kit_args = "-l 0,1 --socket-mem 1024,0,0,0 --huge-dir /mnt/hugepages --proc-type auto -n 4" -+kni_switch = 0 -+ -+dispatch_subnet = "192.168.1.0" -+dispatch_subnet_length = 8 -+dispatch_max_clients = 32 -+ -+bond_mode = 1 -+bond_miimon = 100 -+bond_mtu = 1500 -+bond_ports = "0x3, 0xC" -+bond_macs = "52:54:00:25:ef:e0, aa:bb:cc:dd:ee:ff" -diff --git a/test/unitest/ltran/libnet_tcp_test.c b/test/unitest/ltran/libnet_tcp_test.c -new file mode 100644 -index 0000000..6a6eadc ---- /dev/null -+++ b/test/unitest/ltran/libnet_tcp_test.c -@@ -0,0 +1,133 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ltran_tcp_sock.h" -+#include "ltran_tcp_conn.h" -+ -+#define MAX_CONN 10 -+#define MAX_SOCK 10 -+void test_tcp_conn(void) -+{ -+ struct gazelle_tcp_conn_htable *tcp_conn_htable = NULL; -+ struct gazelle_tcp_conn *tcp_conn = NULL; -+ struct gazelle_tcp_conn *exist_tcp_conn = NULL; -+ struct gazelle_quintuple quintuple; -+ /* 1: set instance on */ -+ int32_t instance_cur_tick = 1; -+ -+ tcp_conn_htable = gazelle_tcp_conn_htable_create(MAX_CONN); -+ CU_ASSERT(tcp_conn_htable != NULL); -+ gazelle_set_tcp_conn_htable(tcp_conn_htable); -+ -+ quintuple.src_ip = inet_addr("192.168.1.1"); -+ quintuple.dst_ip = inet_addr("192.168.1.2"); -+ quintuple.src_port = 22; /* 22:src port id */ -+ quintuple.dst_port = 23; /* 23:dst port id */ -+ quintuple.protocol = 0; -+ tcp_conn = gazelle_conn_add_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ CU_ASSERT(tcp_conn != NULL); -+ tcp_conn->instance_cur_tick = &instance_cur_tick; -+ /* 1: set instacn_cur_tick = instance_reg_tick indicate instance is on */ -+ tcp_conn->instance_reg_tick = 1; -+ -+ exist_tcp_conn = gazelle_conn_get_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ CU_ASSERT(exist_tcp_conn != NULL); -+ -+ gazelle_conn_del_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ exist_tcp_conn = gazelle_conn_get_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ CU_ASSERT(exist_tcp_conn == NULL); -+ -+ gazelle_conn_del_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ -+ for (int i = 0; i <= MAX_CONN; i++) { -+ quintuple.src_port++; -+ tcp_conn = gazelle_conn_add_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ if (i < MAX_CONN) { -+ CU_ASSERT(tcp_conn != NULL); -+ tcp_conn->instance_cur_tick = &instance_cur_tick; -+ /* 1: set instacn_cur_tick = instance_reg_tick indicate instance is on */ -+ tcp_conn->instance_reg_tick = 1; -+ } else { -+ CU_ASSERT(tcp_conn == NULL); -+ } -+ -+ tcp_conn = gazelle_conn_get_by_quintuple(gazelle_get_tcp_conn_htable(), &quintuple); -+ if (i < MAX_CONN) { -+ CU_ASSERT(tcp_conn != NULL); -+ } else { -+ CU_ASSERT(tcp_conn == NULL); -+ } -+ } -+ -+ gazelle_tcp_conn_htable_destroy(); -+} -+ -+void test_tcp_sock(void) -+{ -+ char ip_str[16] = {0}; -+ struct in_addr tmp_subnet; -+ struct gazelle_tcp_sock *tcp_sock = NULL; -+ struct gazelle_tcp_sock *exist_tcp_sock = NULL; -+ /* 1: set instance on */ -+ int32_t instance_cur_tick = 1; -+ -+ gazelle_set_tcp_sock_htable(gazelle_tcp_sock_htable_create(MAX_SOCK)); -+ gazelle_set_tcp_conn_htable(gazelle_tcp_conn_htable_create(GAZELLE_MAX_CONN_NUM)); -+ -+ /* 22:dst port id 1111:dst tid number */ -+ tcp_sock = gazelle_sock_add_by_ipporttid(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22, 1111); -+ CU_ASSERT(tcp_sock != NULL); -+ CU_ASSERT(tcp_sock->tid == 1111); /* 1111:tid number */ -+ CU_ASSERT(tcp_sock->port == 22); /* 22:port id */ -+ -+ tmp_subnet.s_addr = tcp_sock->ip; -+ CU_ASSERT(strcmp(inet_ntoa(tmp_subnet), "192.168.1.1") == 0); -+ tcp_sock->instance_cur_tick = &instance_cur_tick; -+ /* 1: set instacn_cur_tick = instance_reg_tick indicate instance is on */ -+ tcp_sock->instance_reg_tick = 1; -+ -+ /* 22:port id */ -+ exist_tcp_sock = gazelle_sock_get_by_min_conn(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22); -+ CU_ASSERT(exist_tcp_sock != NULL); -+ CU_ASSERT(exist_tcp_sock->tid == 1111); /* 1111:tid number */ -+ -+ /* 22:dst port id 1111:dst tid number */ -+ gazelle_sock_del_by_ipporttid(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22, 1111); -+ /* 22:dst port id */ -+ exist_tcp_sock = gazelle_sock_get_by_min_conn(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22); -+ CU_ASSERT(exist_tcp_sock == NULL); -+ -+ /* 22:port id 1111:dst tid number */ -+ gazelle_sock_del_by_ipporttid(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22, 1111); -+ -+ for (int i = 0; i <= MAX_CONN; i++) { -+ /* 22:dst port id 1111:dst tid number */ -+ tcp_sock = gazelle_sock_add_by_ipporttid(gazelle_get_tcp_sock_htable(), inet_addr("192.168.1.1"), 22, i); -+ if (i < MAX_CONN) { -+ CU_ASSERT(tcp_sock != NULL); -+ } else { -+ CU_ASSERT(tcp_sock == NULL); -+ } -+ } -+ -+ gazelle_tcp_sock_htable_destroy(); -+} -diff --git a/test/unitest/ltran/ltran_instance_test.c b/test/unitest/ltran/ltran_instance_test.c -new file mode 100644 -index 0000000..53acea1 ---- /dev/null -+++ b/test/unitest/ltran/ltran_instance_test.c -@@ -0,0 +1,75 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ltran_instance.h" -+#include "ltran_param.h" -+#include "ltran_stack.h" -+ -+void test_ltran_instance(void) -+{ -+ struct gazelle_instance *instance = NULL; -+ uint32_t ret; -+ -+ get_ltran_config()->dispatcher.num_clients = 30; /* 30:clients num */ -+ get_ltran_config()->dispatcher.ipv4_subnet_size = 256; /* 256:ipv4 subnet size */ -+ get_ltran_config()->dispatcher.ipv4_net_mask = get_ltran_config()->dispatcher.ipv4_subnet_size - 1; -+ set_instance_mgr(gazelle_instance_mgr_create()); -+ CU_ASSERT(get_instance_mgr() != NULL); -+ -+ instance = gazelle_instance_add_by_pid(get_instance_mgr(), 1111); /* 1111:test pid */ -+ CU_ASSERT(instance != NULL); -+ CU_ASSERT(instance->pid == 1111); /* 1111:test pid */ -+ -+ instance = gazelle_instance_get_by_pid(get_instance_mgr(), 1111); /* 1111:test pid */ -+ CU_ASSERT(instance != NULL); -+ CU_ASSERT(instance->pid == 1111); /* 1111:test pid */ -+ -+ instance->ip_addr.s_addr = inet_addr("192.168.1.1"); -+ -+ instance = gazelle_instance_get_by_ip(get_instance_mgr(), inet_addr("192.168.1.1")); -+ CU_ASSERT(instance != NULL); -+ CU_ASSERT(instance->pid == 1111); /* 1111:test pid */ -+ CU_ASSERT(instance->ip_addr.s_addr == inet_addr("192.168.1.1")); -+ -+ instance = gazelle_instance_get_by_ip(get_instance_mgr(), inet_addr("192.168.1.2")); -+ CU_ASSERT(instance == NULL); -+ -+ instance = gazelle_instance_get_by_pid(get_instance_mgr(), 1112); /* 1112:test pid */ -+ CU_ASSERT(instance == NULL); -+ -+ for (int i = 1; i <= get_instance_mgr()->max_instance_num; i++) { -+ instance = gazelle_instance_add_by_pid(get_instance_mgr(), i); -+ if (i < get_instance_mgr()->max_instance_num) { -+ CU_ASSERT(instance != NULL); -+ } else { -+ CU_ASSERT(instance == NULL); -+ } -+ instance = gazelle_instance_get_by_pid(get_instance_mgr(), i); -+ if (i < get_instance_mgr()->max_instance_num) { -+ CU_ASSERT(instance != NULL); -+ } else { -+ CU_ASSERT(instance == NULL); -+ } -+ } -+ -+ gazelle_instance_mgr_destroy(); -+} -diff --git a/test/unitest/ltran/ltran_param_test.c b/test/unitest/ltran/ltran_param_test.c -new file mode 100644 -index 0000000..3b2a24d ---- /dev/null -+++ b/test/unitest/ltran/ltran_param_test.c -@@ -0,0 +1,320 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ltran_param.h" -+ -+#define MAX_CMD_LEN 1024 -+ -+static int execute_cmd(const char *cmd) -+{ -+ int ret; -+ ret = system(cmd); -+ if (ret < 0) { -+ printf("Executing cmd: %s error!!!\n", cmd); -+ abort(); -+ } -+ return ret; -+} -+ -+static void restore_tmp_config(void) -+{ -+ execute_cmd("rm -rf ../ltran/config/ltran_tmp.conf"); -+ execute_cmd("cp -f ../ltran/config/ltran.conf ../ltran/config/ltran_tmp.conf"); -+} -+ -+static int ltran_bad_param(const char *conf_file_filed) -+{ -+ int ret; -+ struct ltran_config ltran_conf; -+ const char *conf_file_path = "../ltran/config/ltran_tmp.conf"; -+ char cmd[MAX_CMD_LEN]; -+ -+ restore_tmp_config(); -+ gazelle_set_errno(GAZELLE_SUCCESS); -+ -+ ret = sprintf_s(cmd, MAX_CMD_LEN, "sed -i '%s' %s", conf_file_filed, conf_file_path); -+ if (ret < 0) { -+ printf("sprintf_s return error!!!\n"); -+ return ret; -+ } -+ -+ execute_cmd(cmd); -+ -+ ret = parse_config_file_args(conf_file_path, <ran_conf); -+ -+ return ret; -+} -+ -+void test_ltran_bad_params_clients(void) -+{ -+ /* ltran start negative client */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32/dispatch_max_clients = -1/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start 0 client */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32/dispatch_max_clients = 0/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start 999 clinet */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32/dispatch_max_clients = 999/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start str client */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32/dispatch_max_clients = \"aaa\"/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start none client */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start empty client */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_max_clients = 32/dispatch_max_clients = /") == -GAZELLE_EPATH); -+} -+ -+void test_ltran_bad_params_port(void) -+{ -+ /* ltran start zero port */ -+ CU_ASSERT(ltran_bad_param("s/0x3/0x0/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start max port */ -+ CU_ASSERT(ltran_bad_param("s/0x3/0xff/") == 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_SUCCESS); -+ -+ /* ltran start str port */ -+ CU_ASSERT(ltran_bad_param("s/0x3/aaa/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start none port */ -+ CU_ASSERT(ltran_bad_param("s/bond_ports = \"0x3, 0xC\"//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start empty port */ -+ CU_ASSERT(ltran_bad_param("s/bond_ports = \"0x3, 0xC\"/bond_ports = /") == -GAZELLE_EPATH); -+ -+ /* ltran start exceed max port */ -+ CU_ASSERT(ltran_bad_param("s/bond_ports = \"0x3, 0xC\"/bond_ports = \"0xffffffff\"/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+} -+ -+void test_ltran_bad_params_subnet(void) -+{ -+ /* ltran start bad subnet */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet =/cdispatch_subnet = \"aaa\"/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start empty subnet */ -+ CU_ASSERT(ltran_bad_param("/^dispatch_subnet /cdispatch_subnet=") == -GAZELLE_EPATH); -+ -+ /* ltran start none subnet */ -+ CU_ASSERT(ltran_bad_param("/dispatch_subnet =/d") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start not match subnet */ -+ CU_ASSERT(ltran_bad_param("s/.0\"/.1\"/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EHOSTADDR); -+ -+ /* ltran start error subnet */ -+ CU_ASSERT(ltran_bad_param("s/1.0\"/288.0\"/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EINETATON); -+ -+ /* ltran start exceed subnet length */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet_length = 8/dispatch_subnet_length = 17/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start exceed subnet length */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet_length = 8/dispatch_subnet_length = 0/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start str subnet length */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet_length = 8/dispatch_subnet_length = aaa/") == -GAZELLE_EPATH); -+ -+ /* ltran start empty subnet length */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet_length = 8/dispatch_subnet_length = /") == -GAZELLE_EPATH); -+ -+ /* ltran start none subnet length */ -+ CU_ASSERT(ltran_bad_param("s/dispatch_subnet_length = 8//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+} -+ -+void test_ltran_bad_params_bond_mode(void) -+{ -+ /* ltran start negative bond mode */ -+ CU_ASSERT(ltran_bad_param("s/bond_mode = 1/bond_mode = -1/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start unsupport bond mode0 */ -+ CU_ASSERT(ltran_bad_param("s/bond_mode = 1/bond_mode = 0/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start unsupport bond mode2 */ -+ CU_ASSERT(ltran_bad_param("s/bond_mode = 1/bond_mode = 2/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start empty bond mode */ -+ CU_ASSERT(ltran_bad_param("/^bond_mode /cbond_mode =") == -GAZELLE_EPATH); -+ -+ /* ltran start unsupport none mode2 */ -+ CU_ASSERT(ltran_bad_param("s/bond_mode = 1//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+} -+ -+void test_ltran_bad_params_bond_miimon(void) -+{ -+ /* ltran start negative bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100/bond_miimon = -1/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start zero bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100/bond_miimon = 0/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start max bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100/bond_miimon = 2147483647/") == 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_SUCCESS); -+ -+ /* ltran start exceed str bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100/bond_miimon = aaa/") == -GAZELLE_EPATH); -+ -+ /* ltran start empty bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100/bond_miimon = /") == -GAZELLE_EPATH); -+ -+ /* ltran start none bond miimon */ -+ CU_ASSERT(ltran_bad_param("s/bond_miimon = 100//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+} -+ -+void test_ltran_bad_params_bond_mtu(void) -+{ -+ /* ltran start negative bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500/bond_mtu = -1/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start exceed min bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500/bond_mtu = 67/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start exceed max bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500/bond_mtu = 1501/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ERANGE); -+ -+ /* ltran start str bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500/bond_mtu = aaa/") == -GAZELLE_EPATH); -+ -+ /* ltran start empty bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500/bond_mtu = /") == -GAZELLE_EPATH); -+ -+ /* ltran start none bond mtu */ -+ CU_ASSERT(ltran_bad_param("s/bond_mtu = 1500//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+} -+ -+void test_ltran_bad_params_macs(void) -+{ -+ /* ltran start max macs */ -+ CU_ASSERT(ltran_bad_param("s/52:54:00:25:ef:e0/ff:ff:ff:ff:ff:ff/") == 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_SUCCESS); -+ -+ /* ltran start error macs */ -+ CU_ASSERT(ltran_bad_param("s/52:54:00:25:ef:e0/ff:ff:ff:ff:ff:fg/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ECONSIST); -+ -+ /* ltran start error macs */ -+ CU_ASSERT(ltran_bad_param("s/52:54:00:25:ef:e0/ff:ff:ff:ff:ff:ff:ff/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ECONSIST); -+ -+ /* ltran start error macs */ -+ CU_ASSERT(ltran_bad_param("s/52:54:00:25:ef:e0/ff:ff:ff:ff:ff-ff/") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ECONSIST); -+ -+ /* ltran start empty macs */ -+ CU_ASSERT(ltran_bad_param("s/52:54:00:25:ef:e0, aa:bb:cc:dd:ee:ff//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_ECONSIST); -+ -+ /* ltran start none macs */ -+ CU_ASSERT(ltran_bad_param("s/bond_macs = \"52:54:00:25:ef:e0, aa:bb:cc:dd:ee:ff\"//") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EPARAM); -+ -+ /* ltran start duplicated macs */ -+ CU_ASSERT(ltran_bad_param("/bond_macs/cbond_macs = \"52:54:00:25:ef:e0, 52:54:00:25:ef:e0\"") != 0); -+ CU_ASSERT(gazelle_get_errno() == GAZELLE_EMAC); -+} -+ -+void check_bond_param(const struct ltran_config *ltran_conf) -+{ -+ CU_ASSERT(ltran_conf->bond.mode == 1); -+ CU_ASSERT(ltran_conf->bond.miimon == 100); /* 100:bond链路监控时间 */ -+ CU_ASSERT(ltran_conf->bond.mtu == 1500); /* 1500:bond mtu值 */ -+ CU_ASSERT(ltran_conf->bond.port_num == 2); /* 2:bond port数目 */ -+ CU_ASSERT(ltran_conf->bond.portmask[0] == 3); /* 3:bond mac端口掩码 */ -+ CU_ASSERT(ltran_conf->bond.portmask[1] == 12); /* 12:bond mac端口掩码 */ -+ CU_ASSERT(ltran_conf->bond.mac_num == 2); /* 2:bond mac地址数目 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[0] == 82); /* 82:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[1] == 84); /* 84:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[2] == 0); /* 2:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[3] == 37); /* 3:37:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[4] == 239); /* 4:239:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[0].addr_bytes[5] == 224); /* 5:224:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[0] == 170); /* 170:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[1] == 187); /* 187:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[2] == 204); /* 2:204:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[3] == 221); /* 3:221:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[4] == 238); /* 4:238:bond mac地址 */ -+ CU_ASSERT(ltran_conf->bond.mac[1].addr_bytes[5] == 255); /* 5:255:bond mac地址 */ -+} -+ -+void test_ltran_normal_param(void) -+{ -+ int ret; -+ struct ltran_config ltran_conf; -+ char ip_str[16] = {0}; /* 16:IP max len */ -+ const char *config_file_path = "../ltran/config/ltran.conf"; -+ -+ (void)memset_s(<ran_conf, sizeof(struct ltran_config), 0, sizeof(struct ltran_config)); -+ ret = parse_config_file_args(config_file_path, <ran_conf); -+ CU_ASSERT(ret == GAZELLE_OK); -+ -+ struct in_addr tmp_subnet; -+ tmp_subnet.s_addr = ntohl(ltran_conf.dispatcher.ipv4_subnet_addr.s_addr); -+ char *subnet_str = strdup(inet_ntop(AF_INET, &tmp_subnet, ip_str, sizeof(ip_str))); -+ CU_ASSERT(subnet_str != NULL); -+ CU_ASSERT(ltran_conf.dpdk.dpdk_argc == 11); /* 11:参数个数 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[0], "ltran") == 0); -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[1], "-l") == 0); -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[2], "0,1") == 0); /* 2:ltran绑在0,1核 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[3], "--socket-mem") == 0); /* 3:ltran socket内存参数 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[4], "1024,0,0,0") == 0); /* 4:ltran socket内存值 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[5], "--huge-dir") == 0); /* 5:ltran huge路径参数 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[6], "/mnt/hugepages") == 0); /* 6:ltran huge路径值 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[7], "--proc-type") == 0); /* 7:ltran进程类型参数 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[8], "auto") == 0); /* 8:ltran进程类型值 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[9], "-n") == 0); /* 9:ltran处理器socket内存通道数目 */ -+ CU_ASSERT(strcmp(ltran_conf.dpdk.dpdk_argv[10], "4") == 0); /* 10:ltran处理器socket内存通道数值 */ -+ CU_ASSERT(ltran_conf.dpdk.kni_switch == 0); -+ CU_ASSERT(strcmp(subnet_str, "192.168.1.0") == 0); -+ CU_ASSERT(ltran_conf.dispatcher.ipv4_subnet_length == 8); /* 8:ipv4子网长度, 表示ltran能识别的子网长度 */ -+ CU_ASSERT(ltran_conf.dispatcher.ipv4_subnet_size == 256); /* 256:ipv4子网大小 */ -+ CU_ASSERT(ltran_conf.dispatcher.ipv4_net_mask == 255); /* 255:ipv4掩码 */ -+ CU_ASSERT(ltran_conf.dispatcher.num_clients == 32); /* 32:client 数目 */ -+ check_bond_param(<ran_conf); -+ free(subnet_str); -+} -diff --git a/test/unitest/ltran/ltran_stack_test.c b/test/unitest/ltran/ltran_stack_test.c -new file mode 100644 -index 0000000..72af3ef ---- /dev/null -+++ b/test/unitest/ltran/ltran_stack_test.c -@@ -0,0 +1,75 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ltran_stack.h" -+ -+void test_ltran_stack(void) -+{ -+ struct gazelle_stack *stack = NULL; -+ const struct gazelle_stack *exist_stack = NULL; -+ struct gazelle_stack_htable *stack_htable; -+ /* 1: tick init val */ -+ int32_t instance_cur_tick = 1; -+ -+ stack_htable = gazelle_stack_htable_create(GAZELLE_MAX_STACK_NUM); -+ CU_ASSERT(stack_htable != NULL); -+ gazelle_set_stack_htable(stack_htable); -+ -+ stack = gazelle_stack_add_by_tid(gazelle_get_stack_htable(), 1111); /* 1111:tid number */ -+ CU_ASSERT(stack != NULL); -+ CU_ASSERT(stack->tid == 1111); /* 1111: tid number */ -+ stack->instance_cur_tick = &instance_cur_tick; -+ /* 1: set instacn_cur_tick = instance_reg_tick indicate instance is on */ -+ stack->instance_reg_tick = 1; -+ -+ exist_stack = gazelle_stack_get_by_tid(gazelle_get_stack_htable(), 1111); /* 1111: tid number */ -+ -+ CU_ASSERT(exist_stack != NULL); -+ CU_ASSERT(exist_stack->tid == 1111); /* 1111:tid number */ -+ -+ gazelle_stack_del_by_tid(gazelle_get_stack_htable(), 1111); /* 1111:tid number */ -+ exist_stack = gazelle_stack_get_by_tid(gazelle_get_stack_htable(), 1111); /* 1111:tid number */ -+ -+ CU_ASSERT(exist_stack == NULL); -+ -+ gazelle_stack_del_by_tid(gazelle_get_stack_htable(), 1111); -+ -+ for (int i = 0; i <= stack_htable->max_stack_num; i++) { -+ stack = gazelle_stack_add_by_tid(gazelle_get_stack_htable(), i); -+ if (i < stack_htable->max_stack_num) { -+ CU_ASSERT(stack != NULL); -+ stack->instance_cur_tick = &instance_cur_tick; -+ /* 1: set instacn_cur_tick = instance_reg_tick indicate instance is on */ -+ stack->instance_reg_tick = 1; -+ } else { -+ CU_ASSERT(stack == NULL); -+ } -+ exist_stack = gazelle_stack_get_by_tid(gazelle_get_stack_htable(), i); -+ if (i < stack_htable->max_stack_num) { -+ CU_ASSERT(exist_stack != NULL); -+ } else { -+ CU_ASSERT(exist_stack == NULL); -+ } -+ } -+ -+ gazelle_stack_htable_destroy(); -+} -diff --git a/test/unitest/ltran/ltran_test_case.h b/test/unitest/ltran/ltran_test_case.h -new file mode 100644 -index 0000000..fd81a1b ---- /dev/null -+++ b/test/unitest/ltran/ltran_test_case.h -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __LTRAN_TEST_CASE_H__ -+#define __LTRAN_TEST_CASE_H__ -+ -+void test_ltran_stack(void); -+void test_ltran_instance(void); -+void test_ltran_normal_param(void); -+void test_ltran_bad_params_clients(void); -+void test_ltran_bad_params_port(void); -+void test_ltran_bad_params_subnet(void); -+void test_ltran_bad_params_bond_mode(void); -+void test_ltran_bad_params_bond_miimon(void); -+void test_ltran_bad_params_bond_mtu(void); -+void test_ltran_bad_params_macs(void); -+void test_tcp_conn(void); -+void test_tcp_sock(void); -+ -+#endif -diff --git a/test/unitest/ltran/main.c b/test/unitest/ltran/main.c -new file mode 100644 -index 0000000..c9d04f5 ---- /dev/null -+++ b/test/unitest/ltran/main.c -@@ -0,0 +1,80 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "ltran_test_case.h" -+ -+typedef enum { -+ CUNIT_SCREEN = 0, -+ CUNIT_XMLFILE, -+ CUNIT_CONSOLE -+} CU_RunMode; -+ -+int main(int argc, char **argv) -+{ -+ CU_pSuite suite; -+ int num_failures; -+ CU_RunMode g_cunit_mode = CUNIT_SCREEN; -+ -+ if (argc > 1) { -+ g_cunit_mode = atoi(argv[1]); -+ } -+ -+ if (CU_initialize_registry() != CUE_SUCCESS) { -+ return CU_get_error(); -+ } -+ -+ suite = CU_add_suite("ltran", NULL, NULL); -+ if (suite == NULL) { -+ CU_cleanup_registry(); -+ return CU_get_error(); -+ } -+ -+ (void)CU_ADD_TEST(suite, test_ltran_instance); -+ (void)CU_ADD_TEST(suite, test_ltran_stack); -+ (void)CU_ADD_TEST(suite, test_ltran_normal_param); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_clients); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_port); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_subnet); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_bond_mode); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_bond_miimon); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_bond_mtu); -+ (void)CU_ADD_TEST(suite, test_ltran_bad_params_macs); -+ (void)CU_ADD_TEST(suite, test_tcp_conn); -+ (void)CU_ADD_TEST(suite, test_tcp_sock); -+ -+ switch (g_cunit_mode) { -+ case CUNIT_SCREEN: -+ CU_basic_set_mode(CU_BRM_VERBOSE); -+ CU_basic_run_tests(); -+ break; -+ case CUNIT_XMLFILE: -+ CU_set_output_filename("instance"); -+ CU_list_tests_to_file(); -+ CU_automated_run_tests(); -+ break; -+ case CUNIT_CONSOLE: -+ CU_console_run_tests(); -+ break; -+ default: -+ (void)printf("not suport mode=%d\n", g_cunit_mode); -+ CU_cleanup_registry(); -+ return CU_get_error(); -+ } -+ -+ num_failures = (int)CU_get_number_of_failures(); -+ CU_cleanup_registry(); -+ return num_failures; -+} -diff --git a/test/unitest/stub.c b/test/unitest/stub.c -new file mode 100644 -index 0000000..8f37c90 ---- /dev/null -+++ b/test/unitest/stub.c -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+ * gazelle is licensed under the Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+ * PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+ -+uint64_t get_current_time(void) -+{ -+ return 0; -+} -+ -+int rte_pdump_init(void) -+{ -+ return 0; -+} -+ -+void *__wrap_rte_malloc(const char *type, size_t size, unsigned align) -+{ -+ return malloc(size); -+} -+ -+void __wrap_rte_free(void *ptr) -+{ -+ free(ptr); -+} -diff --git a/test/unitest/test.sh b/test/unitest/test.sh -new file mode 100644 -index 0000000..90fbbe6 ---- /dev/null -+++ b/test/unitest/test.sh -@@ -0,0 +1,279 @@ -+# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -+# gazelle is licensed under the Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -+# PURPOSE. -+# See the Mulan PSL v2 for more details. -+ -+usage() -+{ -+ echo "Usage: sh llt.sh [OPTIONS]" -+ echo "Use llt.sh to control llt operation" -+ echo -+ echo "Misc:" -+ echo " -h, --help Print this help, then exit" -+ echo -+ echo "Compile Options:" -+ echo " -m, --cmake