void Http2Base::SettingsProc(const Http2_header* header) { const Setting_Frame *sf = (const Setting_Frame *)(header + 1); if((header->flags & ACK_F) == 0) { while((char *)sf-(char *)(header+1) < get24(header->length)){ uint32_t value = get32(sf->value); switch(get16(sf->identifier)){ case SETTINGS_HEADER_TABLE_SIZE: LOGD(DHTTP2, "set head table size:%d\n", value); request_table.set_dynamic_table_size_limit_max(value); break; case SETTINGS_INITIAL_WINDOW_SIZE: if(value >= (uint32_t)1<<31u){ LOGE("ERROR window overflow\n"); ErrProc(ERR_FLOW_CONTROL_ERROR); return; } AdjustInitalFrameWindowSize((ssize_t)value - (ssize_t)remoteframewindowsize); remoteframewindowsize = value; LOGD(DHTTP2, "set inital frame window size:%d\n", remoteframewindowsize); break; case SETTINGS_MAX_FRAME_SIZE: if(value > 0xffffff || value < FRAMEBODYLIMIT){ LOGE("ERROR frame size overflow\n"); ErrProc(ERR_FRAME_SIZE_ERROR); return; } remoteframebodylimit = value; LOGD(DHTTP2, "set frame body size limit: %d\n", remoteframebodylimit); break; default: LOG("Get a unkown setting(%d): %d\n", get16(sf->identifier), value); break; } sf++; } Http2_header *header_back = (Http2_header *)p_memdup(header, sizeof(Http2_header)); set24(header_back->length, 0); header_back->flags |= ACK_F; PushFrame(header_back); }else if(get24(header->length) != 0){ LOGE("ERROR setting ack with content\n"); ErrProc(ERR_FRAME_SIZE_ERROR); } }
@far @interrupt void I2CInterruptHandle (void) { #else void I2CInterruptHandle (void) interrupt 19 { #endif u8 sr1,sr2,cr2; switch_on(LED1); //test purpose /* Get Value of Status registers and Control register 2 */ sr1 = I2C->SR1; sr2 = I2C->SR2; cr2 = I2C->CR2; /* Check for error in communication */ if (sr2 != 0) { ErrProc(); } /* Start bit detected */ if ((sr1 & I2C_SR1_SB) == 1) { switch(STATE) { case SB_01: if (u8_AddType_cpy == TEN_BIT_ADDRESS) { I2C->DR = (u8)(((u16_SlaveAdd_cpy >> 7) & 6) | 0xF0); // send header of 10-bit device address (R/W = 0) STATE = ADD10_02; break; } else { I2C->DR = (u8)(u16_SlaveAdd_cpy << 1); // send 7-bit device address & Write (R/W = 0) STATE = ADDR_03; break; } case SB_11: if (u8_AddType_cpy == TEN_BIT_ADDRESS) { I2C->DR = (u8)(((u16_SlaveAdd_cpy >> 7) & 6) | 0xF1);// send header of 10-bit device address (R/W = 1) } else {
size_t Http2Base::DefaultProc(const uchar* http2_buff, size_t len) { const Http2_header *header = (const Http2_header *)http2_buff; if(len < sizeof(Http2_header)){ if(len) LOGD(DHTTP2, "get a incompleted head, size:%zu\n", len); return 0; }else{ uint32_t length = get24(header->length); if(length > FRAMEBODYLIMIT){ LOGE("ERROR frame size: %d\n", length); ErrProc(ERR_FRAME_SIZE_ERROR); return 0; } if(len < length + sizeof(Http2_header)){ LOGD(DHTTP2, "get a incompleted packet, size:%zu/%zu\n", len, length + sizeof(Http2_header)); return 0; }else{ uint32_t id = HTTP2_ID(header->id); if(http2_flag & HTTP2_FLAG_GOAWAYED){ LOG("get a frame [%d]:%d, size:%d after goaway, ignore it.\n", id, header->type, length); return length + sizeof(Http2_header); } LOGD(DHTTP2, "get a frame [%d]:%d, size:%d, flags:%d\n", id, header->type, length, header->flags); try { uint32_t value; switch(header->type) { case DATA_TYPE: if(id == 0 || (id > recvid && id >= sendid-1)){ LOGE("ERROR wrong data id: %d/%d/%d\n", id, recvid, sendid); ErrProc(ERR_PROTOCOL_ERROR); return 0; } DataProc(id, header+1, length); if(header->flags & END_STREAM_F){ EndProc(id); } break; case HEADERS_TYPE: HeadersProc(header); if(header->flags & END_STREAM_F){ EndProc(id); } break; case PRIORITY_TYPE: break; case SETTINGS_TYPE: if(id != 0 || length%6 != 0){ LOGE("ERROR wrong setting frame : %d/%d\n", id, length); ErrProc(ERR_PROTOCOL_ERROR); return 0; } SettingsProc(header); break; case PING_TYPE: if(id != 0 || length != 8){ LOGE("ERROR wrong ping frame: %d/%d\n", id, length); ErrProc(ERR_FRAME_SIZE_ERROR); return 0; } PingProc(header); break; case GOAWAY_TYPE: GoawayProc(header); break; case RST_STREAM_TYPE: value = get32(header+1); if(length != 4){ LOGE("ERROR rst frame: %d/%d\n", id, length); ErrProc(ERR_FRAME_SIZE_ERROR); return 0; } if(id == 0 || (id > recvid && id >= sendid-1)){ LOGE("ERROR rst frame: %d/%d/%d\n", id, sendid, recvid); ErrProc(ERR_PROTOCOL_ERROR); return 0; } RstProc(id, value); break; case WINDOW_UPDATE_TYPE: value = get32(header+1); if(length != 4){ LOGE("ERROR window update frame: %d/%d\n", id, length); ErrProc(ERR_FRAME_SIZE_ERROR); return 0; } if(value == 0 || (id > recvid && id >= sendid-1)){ LOGE("ERROR window update frame: value=%d id=%d/%d/%d\n", value, id, sendid, recvid); ErrProc(ERR_PROTOCOL_ERROR); return 0; } WindowUpdateProc(id, value); break; default: LOGE("unkown http2 frame:%d\n", header->type); } }catch(...){ Reset(id, ERR_INTERNAL_ERROR); return 0; } return length + sizeof(Http2_header); } } }