htsbuf_append(&q, MSG, sizeof(MSG)-1);
htsbuf_qprintf(&q, "USER-AGENT: unix/1.0 UPnP/1.1 TVHeadend/%s\r\n", tvheadend_version);
htsbuf_append(&q, "\r\n", 2);
- upnp_send(&q, NULL, 0);
+ upnp_send(&q, NULL, 0, 0);
htsbuf_queue_flush(&q);
gtimer_arm_ms(&satip_discovery_msearch_timer, satip_discovery_send_msearch,
htsbuf_queue_init(&q, 0);
htsbuf_append(&q, buf, strlen(buf));
- upnp_send(&q, NULL, attempt * 11);
+ upnp_send(&q, NULL, attempt * 11, 1);
htsbuf_queue_flush(&q);
}
#undef MSG
htsbuf_queue_init(&q, 0);
htsbuf_append(&q, buf, strlen(buf));
- upnp_send(&q, NULL, attempt * 11);
+ upnp_send(&q, NULL, attempt * 11, 1);
htsbuf_queue_flush(&q);
}
#undef MSG
static void
satips_upnp_send_discover_reply
- (struct sockaddr_storage *dst, const char *deviceid)
+ (struct sockaddr_storage *dst, const char *deviceid, int from_multicast)
{
#define MSG "\
HTTP/1.1 200 OK\r\n\
htsbuf_qprintf(&q, "DEVICEID.SES.COM: %s", deviceid);
htsbuf_append(&q, "\r\n", 2);
storage = *dst;
- upnp_send(&q, &storage, 0);
+ upnp_send(&q, &storage, 0, from_multicast);
htsbuf_queue_flush(&q);
#undef MSG
}
tcp_get_str_from_ip((struct sockaddr *)storage, buf2, sizeof(buf2));
tvhwarn("satips", "received duplicate SAT>IP DeviceID %s from %s:%d, using %d",
deviceid, buf2, ntohs(IP_PORT(*storage)), satip_server_deviceid);
- satips_upnp_send_discover_reply(storage, deviceid);
+ satips_upnp_send_discover_reply(storage, deviceid, 0);
satips_upnp_send_byebye();
satips_upnp_send_announce();
} else {
- satips_upnp_send_discover_reply(storage, NULL);
+ satips_upnp_send_discover_reply(storage, NULL, 0);
}
} else {
- satips_upnp_send_discover_reply(storage, NULL);
+ satips_upnp_send_discover_reply(storage, NULL, 1);
}
}
struct sockaddr_storage storage;
htsbuf_queue_t queue;
int delay_ms;
+ int from_multicast;
} upnp_data_t;
TAILQ_HEAD(upnp_data_queue_write, upnp_data);
*
*/
void
-upnp_send( htsbuf_queue_t *q, struct sockaddr_storage *storage, int delay_ms )
+upnp_send( htsbuf_queue_t *q, struct sockaddr_storage *storage,
+ int delay_ms, int from_multicast )
{
upnp_data_t *data;
else
data->storage = *storage;
data->delay_ms = delay_ms;
+ data->from_multicast = from_multicast;
pthread_mutex_lock(&upnp_lock);
TAILQ_INSERT_TAIL(&upnp_data_write, data, data_link);
pthread_mutex_unlock(&upnp_lock);
if (data == NULL)
break;
upnp_dump_data(data);
- udp_write_queue(unicast, &data->queue, &data->storage);
+ udp_write_queue(data->from_multicast ? multicast : unicast,
+ &data->queue, &data->storage);
htsbuf_queue_flush(&data->queue);
free(data);
delay_ms = 0;
upnp_service_create0(calloc(1, sizeof(struct us)))
void upnp_service_destroy(upnp_service_t *service);
-void upnp_send(htsbuf_queue_t *q, struct sockaddr_storage *storage, int delay_ms);
+void upnp_send(htsbuf_queue_t *q, struct sockaddr_storage *storage,
+ int delay_ms, int from_multicast);
void upnp_server_init(const char *bindaddr);
void upnp_server_done(void);