/* 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++; }
/* 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; } }
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; } }
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; }