void do_pb_show_plain(int fd, int type, int single_entry, void (*payload_hadler)(int fd, void *obj), const char *pretty_fmt) { pb_pr_ctl_t ctl = {NULL, single_entry, pretty_fmt}; void (*handle_payload)(int fd, void *obj); if (!cr_pb_descs[type].pb_desc) { pr_err("Wrong object requested %d\n", type); return; } handle_payload = (payload_hadler) ? : pb_no_payload; while (1) { void *obj; if (pb_read_one_eof(fd, &obj, type) <= 0) break; ctl.arg = (void *)cr_pb_descs[type].pb_desc; pb_show_msg(obj, &ctl); handle_payload(fd, obj); cr_pb_descs[type].free(obj, NULL); if (single_entry) break; pr_msg("\n"); } }
void handle_tcp_no_flags_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *tcp_socket, uint8_t *payload) { uint8_t tcp_payload_len = ipv6_header->length - TCP_HDR_LEN, read_bytes = 0; socket_t *current_tcp_socket = &tcp_socket->socket_values; uint8_t send_buffer[BUFFER_SIZE]; ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t *)(&send_buffer)); tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t *)(&send_buffer[IPV6_HDR_LEN])); if (tcp_payload_len > 0) { if (check_tcp_consistency(current_tcp_socket, tcp_header) == PACKET_OK) { read_bytes = handle_payload(ipv6_header, tcp_header, tcp_socket, payload); /* Refresh TCP status values */ current_tcp_socket->tcp_control.state = ESTABLISHED; set_tcp_cb(¤t_tcp_socket->tcp_control, tcp_header->seq_nr + read_bytes, current_tcp_socket->tcp_control.rcv_wnd, current_tcp_socket->tcp_control.send_nxt, current_tcp_socket->tcp_control.send_una, current_tcp_socket->tcp_control.send_wnd); /* Send packet */ // block_continue_thread(); #ifdef TCP_HC current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER; #endif send_tcp(tcp_socket, current_tcp_packet, temp_ipv6_header, TCP_ACK, 0); } /* ACK packet probably got lost */ else { // block_continue_thread(); #ifdef TCP_HC current_tcp_socket->tcp_control.tcp_context.hc_type = FULL_HEADER; #endif send_tcp(tcp_socket, current_tcp_packet, temp_ipv6_header, TCP_ACK, 0); } } }