Пример #1
0
/*************************************************************
 * MAAP Restart - our destination MAC has been changed.
 *
 * This is a clunky way to handle it - but it works, and this code
 * won't be called often.  (MAAP sends probes before settling on an
 * address, so only a buggy or malicious peer should send us down this
 * path.)
 *
 * A better way to handle this would require SRP and the
 * talkers/listeners to look at destination addresses (in addition
 * to StreamID and talker/listener declaration) and explicitly handle
 * destination address changes.
 */
static void maapRestartCallback(void* handle, struct ether_addr *addr)
{
	AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);

	static clientStream_t* ps;
	openavbRC rc;

	ps = findStreamMaap(handle);
	AVB_LOGF_STATUS("MAAP restart callback: handle=%p, stream=%p", handle, ps);

	if (ps) {
		memcpy(ps->destAddr, addr->ether_addr_octet, ETH_ALEN);

		// Pretend that our listeners went away
		strmAttachCb(ps, (openavbSrpLsnrDeclSubtype_t)0);

		if(!x_cfg.noSrp) {
			// Remove the old registration with SRP
			openavbSrpDeregisterStream(&ps->streamID);

			// Re-register with the new address
			rc = openavbSrpRegisterStream((void*)ps,
			                          &ps->streamID,
			                          ps->destAddr,
			                          &ps->tSpec,
			                          ps->srClass,
			                          ps->srRank,
			                          ps->latency);
		} else {
			rc = OPENAVB_SUCCESS;
		}

		if (!IS_OPENAVB_SUCCESS(rc)) {
			AVB_LOG_ERROR("MAAP restart: failed to re-register talker stream");
		}
	}
	AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
}
/* Talker client registers a stream
 */
bool openavbEptSrvrRegisterStream(int h,
                              AVBStreamID_t *streamID,
                              U8 destAddr[],
                              AVBTSpec_t *tSpec,
                              U8 srClass,
                              U8 srRank,
                              U32 latency)
{
	openavbRC rc = OPENAVB_SUCCESS;

	AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);

	clientStream_t *ps = findStream(streamID);
	
	if (ps && ps->clientHandle != h) {
		AVB_LOGF_ERROR("Error registering talker; multiple clients for stream %d", streamID->uniqueID);
		AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
		return FALSE;
	}

	ps = addStream(h, streamID);
	if (!ps) {
		AVB_LOGF_ERROR("Error registering talker; unable to add client stream %d", streamID->uniqueID);
		AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
		return FALSE;
	}
	ps->role = clientTalker;
	ps->tSpec = *tSpec;
	ps->srClass = (SRClassIdx_t)srClass;
	ps->srRank  = srRank;
	ps->latency = latency;
	ps->fwmark = INVALID_FWMARK;

	if (memcmp(ps->destAddr, destAddr, ETH_ALEN) == 0) {
		// no client-supplied address, use MAAP
		struct ether_addr addr;
		ps->hndMaap = openavbMaapAllocate(1, &addr);
		if (ps->hndMaap) {
			memcpy(ps->destAddr, addr.ether_addr_octet, ETH_ALEN);
			strmAttachCb((void*)ps, openavbSrp_LDSt_Stream_Info);		// Inform talker about MAAP
		}
		else {
			AVB_LOG_ERROR("Error registering talker: MAAP failed to allocate MAC address");
			AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
			delStream(ps);
			return FALSE;
		}
	}
	else {
		// client-supplied destination MAC address
		memcpy(ps->destAddr, destAddr, ETH_ALEN);
		ps->hndMaap = NULL;
	}

	// Do SRP talker register
	AVB_LOGF_DEBUG("REGISTER: ps=%p, streamID=%d, tspec=%d,%d, srClass=%d, srRank=%d, latency=%d, da="ETH_FORMAT"",
				   ps, streamID->uniqueID,
				   tSpec->maxFrameSize, tSpec->maxIntervalFrames,
				   ps->srClass, ps->srRank, ps->latency,
				   ETH_OCTETS(ps->destAddr));


	if(x_cfg.noSrp) {
		// we are operating in a mode supporting preconfigured streams; SRP is not in use,
		// so, as a proxy for SRP, which would normally make this call after establishing
		// the stream, call the callback from here
		strmAttachCb((void*)ps, openavbSrp_LDSt_Ready);
	} else {
		// normal SRP operation
		rc = openavbSrpRegisterStream((void*)ps, &ps->streamID,
		                          ps->destAddr, &ps->tSpec,
		                          ps->srClass, ps->srRank,
		                          ps->latency);
		if (!IS_OPENAVB_SUCCESS(rc)) {
			if (ps->hndMaap)
				openavbMaapRelease(ps->hndMaap);
			delStream(ps);
		}
	}

	openavbEndPtLogAllStaticStreams();
	
	AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);
	return IS_OPENAVB_SUCCESS(rc);
}