58 bool begin(
const char* socketName, uint32_t
id, uint16_t dataroom = 0) {
62 opts.dataroom = dataroom;
58 bool begin(
const char* socketName, uint32_t
id, uint16_t dataroom = 0) {
…}
79 memif_socket_args_t sa{};
80 strncpy(sa.path, opts.
socketName,
sizeof(sa.path));
81 strncpy(sa.app_name,
"NDNph",
sizeof(sa.app_name));
82 int err = memif_create_socket(&m_sock, &sa,
this);
83 if (err != MEMIF_ERR_SUCCESS) {
88 memif_conn_args_t ca{};
91 ca.interface_id = opts.
id;
92 for (ca.buffer_size = 64; ca.buffer_size < opts.
dataroom;) {
97 m_dataroom = ca.buffer_size;
98 for (ca.log2_ring_size = 4;
99 ca.log2_ring_size < 14 && (1 << ca.log2_ring_size) < opts.
ringCapacity;) {
102 err = memif_create(&m_conn, &ca, MemifTransport::handleConnect,
103 MemifTransport::handleDisconnect, MemifTransport::handleInterrupt,
this);
104 if (err != MEMIF_ERR_SUCCESS) {
114 if (m_conn !=
nullptr) {
115 int err = memif_delete(&m_conn);
116 if (err != MEMIF_ERR_SUCCESS) {
122 if (m_sock !=
nullptr) {
123 int err = memif_delete_socket(&m_sock);
124 if (err != MEMIF_ERR_SUCCESS) {
145 if (m_sock ==
nullptr) {
149 int err = memif_poll_event(m_sock, 0);
150 if (err != MEMIF_ERR_SUCCESS) {
155 bool doSend(
const uint8_t* pkt,
size_t pktLen, uint64_t)
final {
157#ifdef NDNPH_MEMIF_DEBUG
158 fprintf(stderr,
"MemifTransport send drop=transport-disconnected\n");
163 if (pktLen > m_dataroom) {
164#ifdef NDNPH_MEMIF_DEBUG
165 fprintf(stderr,
"MemifTransport send drop=pkt-too-long len=%zu\n", pktLen);
172 int err = memif_buffer_alloc(m_conn, 0, &b, 1, &nAlloc, pktLen);
173 if (err != MEMIF_ERR_SUCCESS || nAlloc != 1) {
180 std::copy_n(pkt, pktLen,
static_cast<uint8_t*
>(b.data));
184 err = memif_tx_burst(m_conn, 0, &b, 1, &nTx);
185 if (err != MEMIF_ERR_SUCCESS || nTx != 1) {
155 bool doSend(
const uint8_t* pkt,
size_t pktLen, uint64_t)
final {
…}
192 static int handleConnect(memif_conn_handle_t conn,
void* self0) {
196#ifdef NDNPH_MEMIF_DEBUG
197 fprintf(stderr,
"MemifTransport connected\n");
200 int err = memif_refill_queue(conn, 0, -1, 0);
201 if (err != MEMIF_ERR_SUCCESS) {
207 static int handleDisconnect(memif_conn_handle_t conn,
void* self0) {
208 MemifTransport* self =
reinterpret_cast<MemifTransport*
>(self0);
210 self->m_isUp =
false;
211#ifdef NDNPH_MEMIF_DEBUG
212 fprintf(stderr,
"MemifTransport disconnected\n");
217 static int handleInterrupt(memif_conn_handle_t conn,
void* self0, uint16_t qid) {
221 std::array<memif_buffer_t, NDNPH_MEMIF_RXBURST> burst{};
223 int err = memif_rx_burst(conn, qid, burst.data(), burst.size(), &nRx);
224 if (err != MEMIF_ERR_SUCCESS) {
229 for (uint16_t i = 0; i < nRx; ++i) {
230 const memif_buffer_t& b = burst[i];
231 self->invokeRxCallback(
static_cast<const uint8_t*
>(b.data), b.len);
234 err = memif_refill_queue(conn, qid, nRx, 0);
235 if (err != MEMIF_ERR_SUCCESS) {
242 memif_socket_handle_t m_sock =
nullptr;
243 memif_conn_handle_t m_conn =
nullptr;
244 uint16_t m_dataroom = 0;