lfe_master = satip_frontend_find_by_number(lfe2->sf_device, lfe2->sf_master) ?: lfe2;
mm1 = lfe2->sf_req->sf_mmi->mmi_mux;
- position = satip_satconf_get_position(lfe2, mm2);
+ position = satip_satconf_get_position(lfe2, mm2, 0);
if (position <= 0 || lfe_master->sf_position != position)
return 0;
mc1 = &((dvb_mux_t *)mm1)->lm_tuning;
if (lfe->sf_device->sd_dbus_allow <= 0) return 0;
if (lfe->sf_type != DVB_TYPE_S) return 1;
/* check if the position is enabled */
- position = satip_satconf_get_position(lfe, mm);
+ position = satip_satconf_get_position(lfe, mm, 1);
if (position <= 0)
return 0;
/* check if any "blocking" tuner is running */
char buf1[256], buf2[256];
if (lfe->sf_positions > 0) {
- lfe->sf_position = satip_satconf_get_position(lfe, mmi->mmi_mux);
+ lfe->sf_position = satip_satconf_get_position(lfe, mmi->mmi_mux, 1);
if (lfe->sf_position <= 0)
return SM_CODE_TUNING_FAILED;
}
int sfc_priority;
int sfc_grace;
char *sfc_name;
+ int sfc_network_limit;
/*
* Assigned networks to this SAT configuration
( satip_frontend_t *lfe, mpegts_mux_t *mm );
int satip_satconf_get_position
- ( satip_frontend_t *lfe, mpegts_mux_t *mm );
+ ( satip_frontend_t *lfe, mpegts_mux_t *mm, int check );
/*
* RTSP part
return sfc ? sfc->sfc_grace : 0;
}
+static int
+satip_satconf_check_network_limit
+ ( satip_frontend_t *lfe, satip_satconf_t *sfc, idnode_t *mn )
+{
+ satip_frontend_t *lfe2;
+ satip_satconf_t *sfc2;
+ int count;
+
+ count = 0;
+ TAILQ_FOREACH(lfe2, &lfe->sf_device->sd_frontends, sf_link)
+ TAILQ_FOREACH(sfc2, &lfe2->sf_satconf, sfc_link)
+ if (idnode_set_exists(sfc->sfc_networks, mn))
+ count++;
+
+ return count <= sfc->sfc_network_limit;
+}
+
int
satip_satconf_get_position
- ( satip_frontend_t *lfe, mpegts_mux_t *mm )
+ ( satip_frontend_t *lfe, mpegts_mux_t *mm, int check )
{
satip_satconf_t *sfc;
sfc = satip_satconf_find_ele(lfe, mm);
- return sfc && sfc->sfc_enabled ? sfc->sfc_position : 0;
+ if (sfc && sfc->sfc_enabled) {
+ if (!check || sfc->sfc_network_limit <= 0)
+ return sfc->sfc_position;
+ if (satip_satconf_check_network_limit(lfe, sfc, &mm->mm_network->mn_id))
+ return sfc->sfc_position;
+ }
+ return 0;
}
/* **************************************************************************
.def.i = 1,
.opts = PO_RDONLY | PO_ADVANCED,
},
+ {
+ .type = PT_INT,
+ .id = "network_limit",
+ .name = N_("Network limit per position"),
+ .desc = N_("A comma separated list with tuner limits per network "
+ "position (src=) for satellite SAT>IP tuners. "
+ "The first limit number is for src=1 (AA), second "
+ "for src=2 (AB) etc."),
+ .opts = PO_EXPERT,
+ .off = offsetof(satip_satconf_t, sfc_network_limit),
+ },
{
.type = PT_STR,
.id = "networks",