Beispiel #1
0
void connect_manager::init(const char* default_addr, const char* addr_list,
	size_t count, int conn_timeout /* = 30 */, int rw_timeout /* = 30 */)
{
	if (addr_list != NULL && *addr_list != 0)
		set_service_list(addr_list, (int) count,
			conn_timeout, rw_timeout);

	// 创建缺省服务连接池对象,该对象一同放入总的连接池集群中
	if (default_addr != NULL && *default_addr != 0)
	{
		logger("default_pool: %s", default_addr);
		int max = check_addr(default_addr, default_addr_, count);
		if (max < 0)
			logger("no default connection set");
		else
			default_pool_ = &set(default_addr_.c_str(), max,
				conn_timeout, rw_timeout);
	}
	else
		logger("no default connection set");

	// 必须保证至少有一个服务可用
	if (pools_.empty())
		logger_fatal("no connection available!");
}
Beispiel #2
0
int doNIT(struct secbuf *sec, void *data)
{
	int ver, len, i;
	int nw_desc_len, ts_desc_len;
	uint16_t nw_id;
	uint8_t *p, *q;
	struct nit *nit = data;

	/* TODO: check CRC?, using crc32 module like dvb_net.c? */
	if (sec->buf[0] != TID_NIT_SELF || sec->buf[1] & 0xf0 != 0xb0 ) {
		dprintf(" bad table header.\n");
		return 2;
	}

	len = (sec->buf[1] & 0x0f) << 8 | sec->buf[2];
	nw_id = sec->buf[3] << 8 | sec->buf[4];
	ver = (sec->buf[5] & 0x3e0) >> 1;
	nw_desc_len = (sec->buf[8]&0x0f)<< 8 | sec->buf[9];

	if (!(sec->buf[5]&0x01) || sec->buf[6] && nw_desc_len
	    || sec->buf[6] && nw_id != nit->nw_id) {
		dprintf(" bad section.\n");
		return 2;
	}

	if (ver != nit->ver) {
		nit->ver = ver;
		nit->next_sec = 0;
	}

	if (sec->buf[6] < nit->next_sec) {
		dprintf(" same section[%02hhx] received.\n", sec->buf[6]);
		return 1;
	} else if (sec->buf[6] > nit->next_sec) {
		dprintf(" section[%02hhx] received, expecting [%02x].\n",
			sec->buf[6], nit->next_sec);
		return 1;
	}
	nit->next_sec++;

	if (!sec->buf[6]) {
		nit->nw_id = nw_id;
		nit->num_ts = 1;
		nit->ts_info[0].num_service = 0;
	}

	p = &sec->buf[10];
	i = 0;
	q = p;
	while (i < nw_desc_len) {
		if (q[0] == DESC_CA_EMM_TS) {
			nit->emm_ts.cas_id = q[2] << 8 | q[3];
			nit->emm_ts.ts_id = q[4] << 8 | q[5];
			nit->emm_ts.orig_nw_id = q[6] << 8 | q[7];
			nit->emm_ts.power_supply_period = q[8];
			break;
		}
		i += q[1] + 2;
		q += q[1] + 2;
	}

	p += nw_desc_len;
	
	p += 2; /* skip ts_loop_len, as it should be fixed to 1 */

	nit->ts_info[0].ts_id = p[0]<<8 | p[1];
	nit->ts_info[0].orig_nw_id = p[2] << 8 | p[3];
	ts_desc_len = (p[4] & 0x0f) << 8 | p[5];
	p += 6;

	dprintf("new NIT nw:%04hx(ver.%02x) ts:%04x desc:%d sec:%hhu/%hhu\n",
		nw_id, ver, nit->ts_info[0].ts_id, ts_desc_len,
		sec->buf[6], sec->buf[7]);

	i = 0;
	while (i < ts_desc_len) {
		switch (p[0]) {
		case DESC_TS_INFO:
			set_ts_info(p, nit);
			break;
			break;
		case DESC_SERVICE_LIST:
			set_service_list(p, nit);
			break;
		case DESC_PARTIAL_RECV:
			set_partial_recv(p, nit);
			break;
		default:
			dprintf("  desc[%02hhx](%hhu)\n", p[0], p[1]);
		}
		i += p[1]+2;
		p += p[1]+2;
	}
	dprintf("\n");
	return 0;
}