aboutsummaryrefslogtreecommitdiffstats
path: root/extras/libmemif
AgeCommit message (Expand)AuthorFilesLines
2020-09-09docs: Fix create memif cliNathan Skrzypczak3-4/+4
2020-05-18libmemif: cleanup typosPaul Vinciguerra7-42/+42
2020-05-08build: various improvementsDamjan Marion4-26/+91
2020-05-06docs: clean up make docs jobPaul Vinciguerra2-2/+2
2020-03-21libmemif: don't consume rx queue interrupt, if memif_rx_burst failsJan Cavojsky3-5/+16
2020-01-27libmemif: memif_control_fd_update always pass context from libmemif_mainJakub Grajciar3-17/+23
2019-11-05libmemif: reset number of queues on disconnectJakub Grajciar1-9/+6
2019-09-09libmemif: prevent crash in case of invalid connection handleJakub Grajciar1-9/+31
2019-08-21libmemif: introduce 'memif_per_thread_' namespaceJakub Grajciar9-113/+1314
2019-07-26libmemif: fix autoconnectJakub Grajciar1-4/+4
2019-07-25libmemif: fix chained buffer flagJakub Grajciar1-0/+1
2019-07-02libmemif: version 3.0Jakub Grajciar12-339/+423
2019-07-01libmemif: icmp-responder example buffer management fixJakub Grajciar1-5/+8
2019-06-07build: add -Wall and -fno-common, fix reported issuesBenoƮt Ganne8-45/+14
2019-04-08fixing typosJim Thompson1-1/+1
2019-03-04libmemif: Connection request APIsJakub Grajciar4-84/+147
2019-01-04libmemif: fix incorrect write leading to memory corruptionKoichiro Den1-3/+3
2018-12-18Remove autotools files from extras/libmemifMauro Sardara3-117/+0
2018-12-17libmemif: fix possible segfault on memif_get_detailsKoichiro Den1-31/+28
2018-12-17Added CMake building system for libmemifmsardara12-69/+367
2018-09-27libmemif: external region bugfixJakub Grajciar2-2/+5
2018-09-07libmemif: slave connecting bugfixJakub Grajciar3-48/+70
2018-08-30libmemif: external region supportJakub Grajciar9-123/+1460
2018-07-11memif: fix max number of ringsDamjan Marion1-1/+1
2018-06-28libmemif: fixing head/tail arithmetics & queue reallocationMilan Lenco2-11/+6
2018-04-26libmemif: fix build on ununtu 18.04 (VPP-1244)Damjan Marion1-0/+1
2018-04-24libmemif: fix implicit declaration of memfd_createJakub Grajciar1-0/+1
2018-04-12libmemif: fix clang compilation errors/warningsJakub Grajciar3-16/+15
2018-03-30libmemif: zero-copy-slave mode + header spaceJakub Grajciar10-72/+1696
2018-03-28Build libmemif as part of verify jobDamjan Marion4-7/+11
2018-03-28libmemif: add private header size fieldJakub Grajciar4-2/+10
2018-03-26libmemif: version 2Jakub Grajciar16-918/+620
2018-03-13libmemif: ubuntu 18.04 build fixJakub Grajciar4-15/+23
2018-02-07libmemif: cleanup queue info while memif connectingChun Li2-1/+5
2018-01-24docs: Clean up TOCDave Wallace1-2/+8
2017-11-21libmemif: unit test update, continue configure if check module missingJakub Grajciar3-8/+10
2017-11-16libmemif: unmask head/tail pointers fix, additional ring info in memif_queue_...Jakub Grajciar3-75/+109
2017-11-08memif: do not mask head and tail pointersDamjan Marion3-59/+61
2017-11-07libmmeif: Makefile fixJakub Grajciar1-1/+1
2017-11-07libmemif: add dep to MakefileJakub Grajciar1-2/+2
2017-11-05libmemif: example app can generate ICMP, dev perf tests (using icmpr-epoll)Jakub Grajciar6-46/+774
2017-10-30libmemif: perf optimizationJakub Grajciar1-65/+34
2017-10-12libmemif: Add memif_cancel_poll_event() + bug fixing.Milan Lenco3-30/+78
2017-10-04libmemif: memif_rx_burst fixJakub Grajciar1-2/+2
2017-09-28General documentation updatesChris Luke6-31/+41
2017-09-23libmemif: Jumbo frames data/buffer length fixJakub Grajciar2-83/+195
2017-09-15libmemif: Jumbo frames supportJakub Grajciar9-103/+285
2017-09-13Shared memory packet interface (memif) libraryJakub Grajciar28-0/+11034
conn_index, transport_endpoint_t *tep, u8 is_lcl); int (*attribute) (u32 conn_index, u32 thread_index, u8 is_get, transport_endpt_attr_t *attr); /* * Properties */ transport_options_t transport_options; } transport_proto_vft_t; /* *INDENT-ON* */ extern transport_proto_vft_t *tp_vfts; #define transport_proto_foreach(VAR, VAR_ALLOW_BM) \ for (VAR = 0; VAR < vec_len (tp_vfts); VAR++) \ if (tp_vfts[VAR].push_header != 0) \ if (VAR_ALLOW_BM & (1 << VAR)) int transport_connect (transport_proto_t tp, transport_endpoint_cfg_t * tep); void transport_half_close (transport_proto_t tp, u32 conn_index, u8 thread_index); void transport_close (transport_proto_t tp, u32 conn_index, u8 thread_index); void transport_reset (transport_proto_t tp, u32 conn_index, u8 thread_index); u32 transport_start_listen (transport_proto_t tp, u32 session_index, transport_endpoint_cfg_t *tep); u32 transport_stop_listen (transport_proto_t tp, u32 conn_index); void transport_cleanup (transport_proto_t tp, u32 conn_index, u8 thread_index); void transport_cleanup_half_open (transport_proto_t tp, u32 conn_index); void transport_get_endpoint (transport_proto_t tp, u32 conn_index, u32 thread_index, transport_endpoint_t * tep, u8 is_lcl); void transport_get_listener_endpoint (transport_proto_t tp, u32 conn_index, transport_endpoint_t * tep, u8 is_lcl); int transport_connection_attribute (transport_proto_t tp, u32 conn_index, u8 thread_index, u8 is_get, transport_endpt_attr_t *attr); static inline transport_connection_t * transport_get_connection (transport_proto_t tp, u32 conn_index, u8 thread_index) { return tp_vfts[tp].get_connection (conn_index, thread_index); } static inline transport_connection_t * transport_get_listener (transport_proto_t tp, u32 conn_index) { return tp_vfts[tp].get_listener (conn_index); } static inline transport_connection_t * transport_get_half_open (transport_proto_t tp, u32 conn_index) { return tp_vfts[tp].get_half_open (conn_index); } static inline int transport_custom_tx (transport_proto_t tp, void *s, transport_send_params_t * sp) { return tp_vfts[tp].custom_tx (s, sp); } static inline int transport_app_rx_evt (transport_proto_t tp, u32 conn_index, u32 thread_index) { transport_connection_t *tc; if (!tp_vfts[tp].app_rx_evt) return 0; tc = transport_get_connection (tp, conn_index, thread_index); return tp_vfts[tp].app_rx_evt (tc); } /** * Get send parameters for transport connection * * These include maximum tx burst, mss, tx offset and other flags * transport might want to provide to sessin layer * * @param tc transport connection * @param sp send paramaters * */ static inline u32 transport_connection_snd_params (transport_connection_t * tc, transport_send_params_t * sp) { return tp_vfts[tc->proto].send_params (tc, sp); } static inline u8 transport_connection_is_descheduled (transport_connection_t * tc) { return ((tc->flags & TRANSPORT_CONNECTION_F_DESCHED) ? 1 : 0); } static inline void transport_connection_deschedule (transport_connection_t * tc) { tc->flags |= TRANSPORT_CONNECTION_F_DESCHED; } static inline u8 transport_connection_is_cless (transport_connection_t * tc) { return ((tc->flags & TRANSPORT_CONNECTION_F_CLESS) ? 1 : 0); } void transport_connection_reschedule (transport_connection_t * tc); void transport_fifos_init_ooo (transport_connection_t * tc); /** * Register transport virtual function table. * * @param transport_proto - transport protocol type (i.e., TCP, UDP ..) * @param vft - virtual function table for transport proto * @param fib_proto - network layer protocol * @param output_node - output node index that session layer will hand off * buffers to, for requested fib proto */ void transport_register_protocol (transport_proto_t transport_proto, const transport_proto_vft_t * vft, fib_protocol_t fib_proto, u32 output_node); transport_proto_t transport_register_new_protocol (const transport_proto_vft_t * vft, fib_protocol_t fib_proto, u32 output_node); transport_proto_vft_t *transport_protocol_get_vft (transport_proto_t tp); void transport_update_time (clib_time_type_t time_now, u8 thread_index); int transport_alloc_local_port (u8 proto, ip46_address_t * ip); int transport_alloc_local_endpoint (u8 proto, transport_endpoint_cfg_t * rmt, ip46_address_t * lcl_addr, u16 * lcl_port); void transport_share_local_endpoint (u8 proto, ip46_address_t * lcl_ip, u16 port); void transport_endpoint_cleanup (u8 proto, ip46_address_t * lcl_ip, u16 port); void transport_enable_disable (vlib_main_t * vm, u8 is_en); void transport_init (void); always_inline u32 transport_elog_track_index (transport_connection_t * tc) { #if TRANSPORT_DEBUG return tc->elog_track.track_index_plus_one - 1; #else return ~0; #endif } void transport_connection_tx_pacer_reset (transport_connection_t * tc, u64 rate_bytes_per_sec, u32 initial_bucket, clib_us_time_t rtt); /** * Initialize tx pacer for connection * * @param tc transport connection * @param rate_bytes_per_second initial byte rate * @param burst_bytes initial burst size in bytes */ void transport_connection_tx_pacer_init (transport_connection_t * tc, u64 rate_bytes_per_sec, u32 initial_bucket); /** * Update tx pacer pacing rate * * @param tc transport connection * @param bytes_per_sec new pacing rate * @param rtt connection rtt that is used to compute * inactivity time after which pacer bucket is * reset to 1 mtu */ void transport_connection_tx_pacer_update (transport_connection_t * tc, u64 bytes_per_sec, clib_us_time_t rtt); /** * Get tx pacer max burst * * @param tc transport connection * @param time_now current cpu time * @return max burst for connection */ u32 transport_connection_tx_pacer_burst (transport_connection_t * tc); /** * Get tx pacer current rate * * @param tc transport connection * @return rate for connection in bytes/s */ u64 transport_connection_tx_pacer_rate (transport_connection_t * tc); /** * Reset tx pacer bucket * * @param tc transport connection * @param bucket value the bucket will be reset to */ void transport_connection_tx_pacer_reset_bucket (transport_connection_t * tc, u32 bucket); /** * Check if transport connection is paced */ always_inline u8 transport_connection_is_tx_paced (transport_connection_t * tc) { return (tc->flags & TRANSPORT_CONNECTION_F_IS_TX_PACED); } /** * Clear descheduled flag and update pacer if needed * * To add session to scheduler use @ref transport_connection_reschedule */ always_inline void transport_connection_clear_descheduled (transport_connection_t *tc) { tc->flags &= ~TRANSPORT_CONNECTION_F_DESCHED; if (transport_connection_is_tx_paced (tc)) transport_connection_tx_pacer_reset_bucket (tc, 0 /* bucket */); } u8 *format_transport_pacer (u8 * s, va_list * args); /** * Update tx bytes for paced transport connection * * If tx pacing is enabled, this update pacer bucket to account for the * amount of bytes that have been sent. * * @param tc transport connection * @param bytes bytes recently sent */ void transport_connection_update_tx_bytes (transport_connection_t * tc, u32 bytes); void transport_connection_tx_pacer_update_bytes (transport_connection_t * tc, u32 bytes); /** * Request pacer time update * * @param thread_index thread for which time is updated * @param now time now */ void transport_update_pacer_time (u32 thread_index, clib_time_type_t now); #endif /* SRC_VNET_SESSION_TRANSPORT_H_ */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */