diff --git a/daemon/kernel.c b/daemon/kernel.c index 7ea82afe0..0359322f8 100644 --- a/daemon/kernel.c +++ b/daemon/kernel.c @@ -202,37 +202,31 @@ void kernel_shutdown_table(void) { } -void kernel_add_stream(struct rtpengine_target_info *mti) { +void kernel_add_stream(struct rtpengine_command_add_target *cmd) { ssize_t ret; if (!kernel.is_open) return; - struct rtpengine_command_add_target cmd = { - .cmd = REMG_ADD_TARGET, - .target = *mti, - }; + cmd->cmd = REMG_ADD_TARGET; - ret = write(kernel.fd, &cmd, sizeof(cmd)); - if (ret == sizeof(cmd)) + ret = write(kernel.fd, cmd, sizeof(*cmd)); + if (ret == sizeof(*cmd)) return; ilog(LOG_ERROR, "Failed to push relay stream to kernel: %s", strerror(errno)); } -void kernel_add_destination(struct rtpengine_destination_info *mdi) { +void kernel_add_destination(struct rtpengine_command_destination *cmd) { ssize_t ret; if (!kernel.is_open) return; - struct rtpengine_command_destination cmd = { - .cmd = REMG_ADD_DESTINATION, - .destination = *mdi, - }; + cmd->cmd = REMG_ADD_DESTINATION; - ret = write(kernel.fd, &cmd, sizeof(cmd)); - if (ret == sizeof(cmd)) + ret = write(kernel.fd, cmd, sizeof(*cmd)); + if (ret == sizeof(*cmd)) return; ilog(LOG_ERROR, "Failed to push relay stream destination to kernel: %s", strerror(errno)); diff --git a/daemon/media_socket.c b/daemon/media_socket.c index a5faf1904..ee4c94240 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1507,10 +1507,10 @@ static int __rtp_stats_pt_sort(const void *A, const void *B) { } -TYPED_GQUEUE(kernel_output, struct rtpengine_destination_info) +TYPED_GQUEUE(kernel_output, struct rtpengine_command_destination) struct kernelize_state { - struct rtpengine_target_info reti; + struct rtpengine_command_add_target reti; struct ssrc_entry_call *ssrc[RTPE_NUM_SSRC_TRACKING]; kernel_output_q outputs; sink_handler_q *rtp_sinks[RTPE_NUM_OUTPUT_MEDIA]; @@ -1526,7 +1526,7 @@ struct kernelize_state { static void kernelize_state_clear(kernelize_state *s) { t_queue_clear_full(&s->outputs, - (void (*)(struct rtpengine_destination_info *)) g_free); + (void (*)(struct rtpengine_command_destination *)) g_free); } G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(kernelize_state, kernelize_state_clear) @@ -1589,7 +1589,7 @@ static const char *kernelize_target(kernelize_state *s, struct packet_stream *st endpoint_print_buf(&sfd->socket.local)); // fill input - __auto_type reti = &s->reti; + __auto_type reti = &s->reti.target; if (PS_ISSET2(stream, STRICT_SOURCE, MEDIA_HANDOVER)) { __re_address_translate_ep(&reti->expected_src, MEDIA_ISSET(media, ASYMMETRIC) ? &stream->learned_endpoint : &stream->endpoint); @@ -1793,7 +1793,7 @@ static const char *kernelize_one(kernelize_state *s, if (!handler->out->kernel) return "protocol not supported by kernel module"; - __auto_type reti = &s->reti; + __auto_type reti = &s->reti.target; // any output at all? if (s->non_forwarding || !sink->selected_sfd) @@ -1802,7 +1802,9 @@ static const char *kernelize_one(kernelize_state *s, return NULL; // fill output struct - __auto_type redi = g_new0(struct rtpengine_destination_info, 1); + __auto_type credi = g_new0(struct rtpengine_command_destination, 1); + __auto_type redi = &credi->destination; + redi->local = reti->local; redi->output.tos = call->tos; redi->output.rtcp = rtcp; @@ -1841,7 +1843,7 @@ static const char *kernelize_one(kernelize_state *s, // XXX nested lock, avoid possible deadlock. should be reworked not to // require a nested lock if (sink != stream && mutex_trylock(&sink->lock)) { - g_free(redi); + g_free(credi); return ""; // indicate deadlock } @@ -1875,14 +1877,14 @@ static const char *kernelize_one(kernelize_state *s, mutex_unlock(&sink->lock); if (!redi->output.encrypt.cipher || !redi->output.encrypt.hmac) { - g_free(redi); + g_free(credi); return "encryption cipher or HMAC not supported by kernel module"; } // got a new output redi->num = reti->num_destinations; reti->num_destinations++; - t_queue_push_tail(&s->outputs, redi); + t_queue_push_tail(&s->outputs, credi); assert(s->outputs.length == reti->num_destinations); return NULL; @@ -1953,7 +1955,9 @@ static void kernelize(struct packet_stream *stream) { if (err) ilog(LOG_WARNING, "No support for kernel packet forwarding available (%s)", err); - if (!s.reti.local.family) + __auto_type reti = &s.reti.target; + + if (!reti->local.family) goto no_kernel; for (unsigned int mi = 0; mi < RTPE_NUM_OUTPUT_MEDIA; mi++) { @@ -1961,7 +1965,7 @@ static void kernelize(struct packet_stream *stream) { continue; // not filled // primary RTP sinks - s.reti.media_output_idxs[mi].rtp_start_idx = s.reti.num_destinations; + reti->media_output_idxs[mi].rtp_start_idx = reti->num_destinations; for (__auto_type l = s.rtp_sinks[mi]->head; l; l = l->next) { struct sink_handler *sh = l->data; if (sh->attrs.block_media) @@ -1979,9 +1983,9 @@ static void kernelize(struct packet_stream *stream) { } // RTP -> RTCP sinks // record number of RTP destinations up to now - s.reti.media_output_idxs[mi].rtp_end_idx = s.reti.num_destinations; + reti->media_output_idxs[mi].rtp_end_idx = reti->num_destinations; // also marks the start of RTCP outputs - s.reti.media_output_idxs[mi].rtcp_start_idx = s.reti.num_destinations; + reti->media_output_idxs[mi].rtcp_start_idx = reti->num_destinations; // ignore RTP payload types for (__auto_type l = s.rtcp_sinks[mi]->head; l; l = l->next) { struct sink_handler *sh = l->data; @@ -1990,17 +1994,17 @@ static void kernelize(struct packet_stream *stream) { goto retry; } // mark the end of RTCP outputs - s.reti.media_output_idxs[mi].rtcp_end_idx = s.reti.num_destinations; + reti->media_output_idxs[mi].rtcp_end_idx = reti->num_destinations; } - if (!s.outputs.length && !s.reti.non_forwarding) { - s.reti.non_forwarding = 1; + if (!s.outputs.length && !reti->non_forwarding) { + reti->non_forwarding = 1; ilog(LOG_NOTICE | LOG_FLAG_LIMIT, "Setting 'non-forwarding' flag for kernel stream due to " "lack of sinks"); } kernel_add_stream(&s.reti); - struct rtpengine_destination_info *redi; + struct rtpengine_command_destination *redi; while ((redi = t_queue_pop_head(&s.outputs))) { kernel_add_destination(redi); g_free(redi); @@ -2847,8 +2851,10 @@ static void rtp_ext_mid_kernel(kernelize_state *s, unsigned int component, struc if (bundle->extmap_id[RTP_EXT_MID]->id != media->extmap_id[RTP_EXT_MID]->id) return; - s->reti.extmap = 1; - s->reti.extmap_mid = bundle->extmap_id[RTP_EXT_MID]->id; + __auto_type reti = &s->reti.target; + + reti->extmap = 1; + reti->extmap_mid = bundle->extmap_id[RTP_EXT_MID]->id; struct call_monologue *ml = bundle->monologue; @@ -2866,8 +2872,8 @@ static void rtp_ext_mid_kernel(kernelize_state *s, unsigned int component, struc if (media->media_id.len > 255) continue; - s->reti.mid_output[idx].len = media->media_id.len; - memcpy(s->reti.mid_output[idx].mid, media->media_id.s, media->media_id.len); + reti->mid_output[idx].len = media->media_id.len; + memcpy(reti->mid_output[idx].mid, media->media_id.s, media->media_id.len); struct packet_stream *bundle_ps = get_media_component(media, component); if (!bundle_ps) diff --git a/include/kernel.h b/include/kernel.h index 763c0516f..b4565a565 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -32,8 +32,9 @@ bool kernel_setup_table(unsigned int); bool kernel_init_table(void); void kernel_shutdown_table(void); -void kernel_add_stream(struct rtpengine_target_info *); -void kernel_add_destination(struct rtpengine_destination_info *); +void kernel_add_stream(struct rtpengine_command_add_target *); +void kernel_add_destination(struct rtpengine_command_destination *); + bool kernel_del_stream(struct rtpengine_command_del_target *); unsigned int kernel_add_call(const char *id);