Exemple #1
0
/* Allocates memory */
cell frame_scan(stack_frame *frame)
{
	switch(frame_type(frame))
	{
	case QUOTATION_TYPE:
		{
			cell quot = frame_executing(frame);
			if(quot == F)
				return F;
			else
			{
				char *return_addr = (char *)FRAME_RETURN_ADDRESS(frame);
				char *quot_xt = (char *)(frame_code(frame) + 1);

				return tag_fixnum(quot_code_offset_to_scan(
					quot,(cell)(return_addr - quot_xt)));
			}
		}
	case WORD_TYPE:
		return F;
	default:
		critical_error("Bad frame type",frame_type(frame));
		return F;
	}
}
void Streamer::h264_send_frame(uint8_t* frame, int frame_size) {
    _frame_type = Source::frame_type(frame[0]);
    SBL_MSG(MSG::STREAMER, "H264 Frame '%c', size %d, timestamp %d", _frame_type, frame_size, _timestamp);
    if (_frame_type == 's' || _frame_type == 'p' || _frame_type == 'I')
        _frame_index = 0;
    if (frame_size <= _packet_size) {
        // small frame, doesn't need to be fragmented
        write_rtp_header(frame - RTP_HEADER, !(frame_type() == 'p' || frame_type() == 's'));
        send_packet(frame - RTP_HEADER, frame_size + RTP_HEADER, true);
    } else {
        // large frame, will have to be segmented.
        create_fu_header(frame);
        // move frame pointer back to make place for RTP header and FU-A (Fragmentation Unit type A) byte
        // FU-A header is in fact NAL header and is already in the frame, but FU-A indicator is not
        frame -= RTP_HEADER + FU_INDICATOR;
        // Only first fragment has FU-A header in the frame, subsequent ones don't and it has to be added
        int first_fragment = FU_HEADER;
        do {
            bool last_packet = frame_size <= _packet_size;
            write_rtp_header(frame, last_packet && !(frame_type() == 'p' || frame_type() == 's'));
            // It is unclear if End bit of FU Header should be set for SPS/PPS frames. I *assume* it does.
            // It probably doesn't matter, because SPS/PPS frames are small and don't need to be fragmented,
            // therefore they don't use FU Header at all ('small frame' 'if' clause above).
            write_fu_header(frame, last_packet);
            send_packet(frame, (frame_size < _packet_size ? frame_size : _packet_size)
                            + RTP_HEADER + FU_INDICATOR + FU_HEADER, last_packet);
            frame += _packet_size;
            frame_size -= _packet_size + first_fragment;
            first_fragment = 0;
        } while (frame_size > 0);
    }
    _frame_index++;
}
Exemple #3
0
/* Allocates memory */
cell factor_vm::frame_scan(stack_frame *frame)
{
	switch(frame_type(frame))
	{
	case code_block_unoptimized:
		{
			tagged<object> obj(frame_executing(frame));
			if(obj.type_p(WORD_TYPE))
				obj = obj.as<word>()->def;

			if(obj.type_p(QUOTATION_TYPE))
			{
				char *return_addr = (char *)FRAME_RETURN_ADDRESS(frame,this);
				char *quot_entry_point = (char *)(frame_code(frame) + 1);

				return tag_fixnum(quot_code_offset_to_scan(
					obj.value(),(cell)(return_addr - quot_entry_point)));
			}    
			else
				return false_object;
		}
	case code_block_optimized:
		return false_object;
	default:
		critical_error("Bad frame type",frame_type(frame));
		return false_object;
	}
}
Exemple #4
0
void read_wifi(struct params *p)
{
	static char *buf = 0;
	static int buflen = 4096;
	struct ieee80211_frame *wh;
	int rc;

	if (!buf) {
		buf = (char*) malloc(buflen);
		if (!buf)
			err(1, "malloc()");
	}
	
	rc = sniff(p->rx, buf, buflen);
	if (rc == -1)
		err(1, "sniff()");

	wh = get_wifi(buf, &rc);
	if (!wh)
		return;

	/* relayed macast */
	if (frame_type(wh, IEEE80211_FC0_TYPE_DATA,
		       IEEE80211_FC0_SUBTYPE_DATA) &&
	    (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) &&
	    (memcmp(wh->i_addr2, p->ap, 6) == 0) &&
	    (memcmp(wh->i_addr1, p->mcast, 5) == 0) &&
	    (memcmp(p->mac, wh->i_addr3, 6) == 0)) {
		got_mcast(p, wh, rc);
		return;
	}

	/* data */
	if (frame_type(wh, IEEE80211_FC0_TYPE_DATA,
		       IEEE80211_FC0_SUBTYPE_DATA)) {
		if (!wanted(p, wh, rc))
			return;
		
		enque(p, &buf, wh, rc);
		if (p->state == S_START)
			send_queue(p);
		return;
	}
}
Exemple #5
0
int duplicate(struct params *p, struct ieee80211_frame *wh, int rc)
{
	struct client *c;
	int s;

	if (!frame_type(wh, IEEE80211_FC0_TYPE_DATA,
			IEEE80211_FC0_SUBTYPE_DATA))
		return 0;

	s = seqno(wh);

	c = client_find(p, wh->i_addr2);
	if (!c) {
		c = malloc(sizeof(*c));
		if (!c)
			err(1, "malloc()");

		memset(c, 0, sizeof(*c));
		memcpy(c->mac, wh->i_addr2, 6);

		c->seq = s-1;
		client_insert(p, c);
	}

	if (wh->i_fc[1] & IEEE80211_FC1_RETRY) {
		if ( (s <= c->seq) && ((c->seq - s ) < 5)) {
#if 0
			printf("Dup seq %d prev %d\n",
			       s, c->seq);
#endif
			return 1;
		}	
	}	

#if 0
	do {
		char mac[3*6];

		mac2str(mac, c->mac);
		printf("%s seq %d prev %d\n", mac, s, c->seq);
	} while (0);
#endif
	
	c->seq = s;
	return 0;
}