|
|
@@ -36,8 +36,6 @@
|
|
|
#define DATAGRAMPEERIO_COMPONENT_SINK 1
|
|
|
#define DATAGRAMPEERIO_COMPONENT_SOURCE 2
|
|
|
|
|
|
-static int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif, int otp_warning_count, DatagramPeerIO_handler_otp_warning handler_otp_warning, void *user);
|
|
|
-static void free_persistent_io (DatagramPeerIO *o);
|
|
|
static void init_sending (DatagramPeerIO *o, BAddr addr, BIPAddr local_addr);
|
|
|
static void free_sending (DatagramPeerIO *o);
|
|
|
static void init_receiving (DatagramPeerIO *o);
|
|
|
@@ -46,91 +44,6 @@ static void error_handler (DatagramPeerIO *o, int component, const void *data);
|
|
|
static void reset_mode (DatagramPeerIO *o);
|
|
|
static void recv_decoder_notifier_handler (DatagramPeerIO *o, uint8_t *data, int data_len);
|
|
|
|
|
|
-int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif, int otp_warning_count, DatagramPeerIO_handler_otp_warning handler_otp_warning, void *user)
|
|
|
-{
|
|
|
- // init error domain
|
|
|
- FlowErrorDomain_Init(&o->domain, (FlowErrorDomain_handler)error_handler, o);
|
|
|
-
|
|
|
- // init receiving
|
|
|
-
|
|
|
- // init assembler
|
|
|
- if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, num_frames, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
|
|
|
- BLog(BLOG_ERROR, "FragmentProtoAssembler_Init failed");
|
|
|
- goto fail0;
|
|
|
- }
|
|
|
-
|
|
|
- // init notifier
|
|
|
- PacketPassNotifier_Init(&o->recv_notifier, FragmentProtoAssembler_GetInput(&o->recv_assembler), BReactor_PendingGroup(o->reactor));
|
|
|
-
|
|
|
- // init decoder
|
|
|
- if (!SPProtoDecoder_Init(&o->recv_decoder, PacketPassNotifier_GetInput(&o->recv_notifier), o->sp_params, 2, BReactor_PendingGroup(o->reactor))) {
|
|
|
- BLog(BLOG_ERROR, "SPProtoDecoder_Init failed");
|
|
|
- goto fail1;
|
|
|
- }
|
|
|
-
|
|
|
- // init connector
|
|
|
- PacketRecvConnector_Init(&o->recv_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
|
|
|
-
|
|
|
- // init buffer
|
|
|
- if (!SinglePacketBuffer_Init(&o->recv_buffer, PacketRecvConnector_GetOutput(&o->recv_connector), SPProtoDecoder_GetInput(&o->recv_decoder), BReactor_PendingGroup(o->reactor))) {
|
|
|
- BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
|
|
|
- goto fail2;
|
|
|
- }
|
|
|
-
|
|
|
- // init sending base
|
|
|
-
|
|
|
- // init disassembler
|
|
|
- FragmentProtoDisassembler_Init(&o->send_disassembler, o->reactor, o->payload_mtu, o->spproto_payload_mtu, -1, latency);
|
|
|
-
|
|
|
- // init encoder
|
|
|
- if (!SPProtoEncoder_Init(&o->send_encoder, FragmentProtoDisassembler_GetOutput(&o->send_disassembler), o->sp_params, otp_warning_count, handler_otp_warning, user, BReactor_PendingGroup(o->reactor))) {
|
|
|
- BLog(BLOG_ERROR, "SPProtoEncoder_Init failed");
|
|
|
- goto fail3;
|
|
|
- }
|
|
|
-
|
|
|
- // init connector
|
|
|
- PacketPassConnector_Init(&o->send_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
|
|
|
-
|
|
|
- // init buffer
|
|
|
- if (!SinglePacketBuffer_Init(&o->send_buffer, SPProtoEncoder_GetOutput(&o->send_encoder), PacketPassConnector_GetInput(&o->send_connector), BReactor_PendingGroup(o->reactor))) {
|
|
|
- BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
|
|
|
- goto fail4;
|
|
|
- }
|
|
|
-
|
|
|
- return 1;
|
|
|
-
|
|
|
-fail4:
|
|
|
- PacketPassConnector_Free(&o->send_connector);
|
|
|
- SPProtoEncoder_Free(&o->send_encoder);
|
|
|
-fail3:
|
|
|
- FragmentProtoDisassembler_Free(&o->send_disassembler);
|
|
|
- SinglePacketBuffer_Free(&o->recv_buffer);
|
|
|
-fail2:
|
|
|
- PacketRecvConnector_Free(&o->recv_connector);
|
|
|
- SPProtoDecoder_Free(&o->recv_decoder);
|
|
|
-fail1:
|
|
|
- PacketPassNotifier_Free(&o->recv_notifier);
|
|
|
- FragmentProtoAssembler_Free(&o->recv_assembler);
|
|
|
-fail0:
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-void free_persistent_io (DatagramPeerIO *o)
|
|
|
-{
|
|
|
- // free sending base
|
|
|
- SinglePacketBuffer_Free(&o->send_buffer);
|
|
|
- PacketPassConnector_Free(&o->send_connector);
|
|
|
- SPProtoEncoder_Free(&o->send_encoder);
|
|
|
- FragmentProtoDisassembler_Free(&o->send_disassembler);
|
|
|
-
|
|
|
- // free receiving
|
|
|
- SinglePacketBuffer_Free(&o->recv_buffer);
|
|
|
- PacketRecvConnector_Free(&o->recv_connector);
|
|
|
- SPProtoDecoder_Free(&o->recv_decoder);
|
|
|
- PacketPassNotifier_Free(&o->recv_notifier);
|
|
|
- FragmentProtoAssembler_Free(&o->recv_assembler);
|
|
|
-}
|
|
|
-
|
|
|
void init_sending (DatagramPeerIO *o, BAddr addr, BIPAddr local_addr)
|
|
|
{
|
|
|
// init sink
|
|
|
@@ -282,34 +195,90 @@ int DatagramPeerIO_Init (
|
|
|
// check payload MTU (for FragmentProto)
|
|
|
if (o->payload_mtu > UINT16_MAX) {
|
|
|
BLog(BLOG_ERROR, "payload MTU is too big");
|
|
|
- goto fail1;
|
|
|
+ goto fail0;
|
|
|
}
|
|
|
|
|
|
// calculate SPProto payload MTU
|
|
|
if ((o->spproto_payload_mtu = spproto_payload_mtu_for_carrier_mtu(o->sp_params, socket_mtu)) <= (int)sizeof(struct fragmentproto_chunk_header)) {
|
|
|
BLog(BLOG_ERROR, "socket MTU is too small");
|
|
|
- goto fail1;
|
|
|
+ goto fail0;
|
|
|
}
|
|
|
|
|
|
// calculate effective socket MTU
|
|
|
if ((o->effective_socket_mtu = spproto_carrier_mtu_for_payload_mtu(o->sp_params, o->spproto_payload_mtu)) < 0) {
|
|
|
BLog(BLOG_ERROR, "spproto_carrier_mtu_for_payload_mtu failed !?");
|
|
|
- goto fail1;
|
|
|
+ goto fail0;
|
|
|
}
|
|
|
|
|
|
- // set mode none
|
|
|
- o->mode = DATAGRAMPEERIO_MODE_NONE;
|
|
|
+ // init error domain
|
|
|
+ FlowErrorDomain_Init(&o->domain, (FlowErrorDomain_handler)error_handler, o);
|
|
|
|
|
|
- // init persistent I/O objects
|
|
|
- if (!init_persistent_io(o, latency, num_frames, recv_userif, otp_warning_count, handler_otp_warning, user)) {
|
|
|
+ // init receiving
|
|
|
+
|
|
|
+ // init assembler
|
|
|
+ if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, num_frames, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
|
|
|
+ BLog(BLOG_ERROR, "FragmentProtoAssembler_Init failed");
|
|
|
+ goto fail0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // init notifier
|
|
|
+ PacketPassNotifier_Init(&o->recv_notifier, FragmentProtoAssembler_GetInput(&o->recv_assembler), BReactor_PendingGroup(o->reactor));
|
|
|
+
|
|
|
+ // init decoder
|
|
|
+ if (!SPProtoDecoder_Init(&o->recv_decoder, PacketPassNotifier_GetInput(&o->recv_notifier), o->sp_params, 2, BReactor_PendingGroup(o->reactor))) {
|
|
|
+ BLog(BLOG_ERROR, "SPProtoDecoder_Init failed");
|
|
|
goto fail1;
|
|
|
}
|
|
|
|
|
|
+ // init connector
|
|
|
+ PacketRecvConnector_Init(&o->recv_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
|
|
|
+
|
|
|
+ // init buffer
|
|
|
+ if (!SinglePacketBuffer_Init(&o->recv_buffer, PacketRecvConnector_GetOutput(&o->recv_connector), SPProtoDecoder_GetInput(&o->recv_decoder), BReactor_PendingGroup(o->reactor))) {
|
|
|
+ BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
|
|
|
+ goto fail2;
|
|
|
+ }
|
|
|
+
|
|
|
+ // init sending base
|
|
|
+
|
|
|
+ // init disassembler
|
|
|
+ FragmentProtoDisassembler_Init(&o->send_disassembler, o->reactor, o->payload_mtu, o->spproto_payload_mtu, -1, latency);
|
|
|
+
|
|
|
+ // init encoder
|
|
|
+ if (!SPProtoEncoder_Init(&o->send_encoder, FragmentProtoDisassembler_GetOutput(&o->send_disassembler), o->sp_params, otp_warning_count, handler_otp_warning, user, BReactor_PendingGroup(o->reactor))) {
|
|
|
+ BLog(BLOG_ERROR, "SPProtoEncoder_Init failed");
|
|
|
+ goto fail3;
|
|
|
+ }
|
|
|
+
|
|
|
+ // init connector
|
|
|
+ PacketPassConnector_Init(&o->send_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
|
|
|
+
|
|
|
+ // init buffer
|
|
|
+ if (!SinglePacketBuffer_Init(&o->send_buffer, SPProtoEncoder_GetOutput(&o->send_encoder), PacketPassConnector_GetInput(&o->send_connector), BReactor_PendingGroup(o->reactor))) {
|
|
|
+ BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
|
|
|
+ goto fail4;
|
|
|
+ }
|
|
|
+
|
|
|
+ // set mode
|
|
|
+ o->mode = DATAGRAMPEERIO_MODE_NONE;
|
|
|
+
|
|
|
DebugObject_Init(&o->d_obj);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
+fail4:
|
|
|
+ PacketPassConnector_Free(&o->send_connector);
|
|
|
+ SPProtoEncoder_Free(&o->send_encoder);
|
|
|
+fail3:
|
|
|
+ FragmentProtoDisassembler_Free(&o->send_disassembler);
|
|
|
+ SinglePacketBuffer_Free(&o->recv_buffer);
|
|
|
+fail2:
|
|
|
+ PacketRecvConnector_Free(&o->recv_connector);
|
|
|
+ SPProtoDecoder_Free(&o->recv_decoder);
|
|
|
fail1:
|
|
|
+ PacketPassNotifier_Free(&o->recv_notifier);
|
|
|
+ FragmentProtoAssembler_Free(&o->recv_assembler);
|
|
|
+fail0:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -320,8 +289,18 @@ void DatagramPeerIO_Free (DatagramPeerIO *o)
|
|
|
// reset mode
|
|
|
reset_mode(o);
|
|
|
|
|
|
- // free persistent I/O objects
|
|
|
- free_persistent_io(o);
|
|
|
+ // free sending base
|
|
|
+ SinglePacketBuffer_Free(&o->send_buffer);
|
|
|
+ PacketPassConnector_Free(&o->send_connector);
|
|
|
+ SPProtoEncoder_Free(&o->send_encoder);
|
|
|
+ FragmentProtoDisassembler_Free(&o->send_disassembler);
|
|
|
+
|
|
|
+ // free receiving
|
|
|
+ SinglePacketBuffer_Free(&o->recv_buffer);
|
|
|
+ PacketRecvConnector_Free(&o->recv_connector);
|
|
|
+ SPProtoDecoder_Free(&o->recv_decoder);
|
|
|
+ PacketPassNotifier_Free(&o->recv_notifier);
|
|
|
+ FragmentProtoAssembler_Free(&o->recv_assembler);
|
|
|
}
|
|
|
|
|
|
PacketPassInterface * DatagramPeerIO_GetSendInput (DatagramPeerIO *o)
|