ipv6_addr_t init_threeway_handshake(void) { border_syn_packet_t *syn; msg_t m; m.content.ptr = NULL; msg_send(&m, border_get_serial_reader(), 1); msg_receive(&m); syn = (border_syn_packet_t *)m.content.ptr; border_conf_header_t *synack = (border_conf_header_t *)get_serial_out_buffer(0); ipv6_addr_t addr; memcpy(&addr, &(syn->addr), sizeof(ipv6_addr_t)); slwin_stat.next_exp = syn->next_seq_num; slwin_stat.last_frame = syn->next_exp - 1; slwin_stat.last_ack = slwin_stat.last_frame; synack->empty = 0; synack->type = BORDER_PACKET_CONF_TYPE; synack->conftype = BORDER_CONF_SYNACK; sending_slot_pid = thread_create(sending_slot_stack, SENDING_SLOT_STACK_SIZE, PRIORITY_MAIN - 1, CREATE_SLEEPING, sending_slot, "sending slot"); flowcontrol_send_over_uart((border_packet_t *)synack, sizeof(border_conf_header_t)); synack_seqnum = synack->seq_num; return addr; }
void send_ack(uint8_t seq_num) { border_packet_t *packet = (border_packet_t *)get_serial_out_buffer(0); packet->empty = 0; packet->type = BORDER_PACKET_ACK_TYPE; packet->seq_num = seq_num; writepacket((uint8_t *)packet, sizeof (border_packet_t)); }
void multiplex_send_ipv6_over_tty(const struct ip6_hdr *packet) { border_l3_header_t *l3_hdr = (border_l3_header_t *)get_serial_out_buffer(0); size_t packet_size = sizeof(struct ip6_hdr) + packet->ip6_plen; l3_hdr->empty = 0; l3_hdr->type = BORDER_PACKET_L3_TYPE; l3_hdr->ethertype = ETHERTYPE_IPV6; memcpy( get_serial_out_buffer(0) + sizeof(border_l3_header_t), packet, packet_size ); flowcontrol_send_over_tty( (border_packet_t *) l3_hdr, sizeof(border_l3_header_t) + packet_size ); }
void multiplex_send_ipv6_over_uart(ipv6_hdr_t *packet) { border_l3_header_t *serial_buf; serial_buf = (border_l3_header_t *)get_serial_out_buffer(0); serial_buf->empty = 0; serial_buf->type = BORDER_PACKET_L3_TYPE; serial_buf->ethertype = BORDER_ETHERTYPE_IPV6; memcpy(get_serial_in_buffer(0) + sizeof(border_l3_header_t), packet, IPV6_HDR_LEN + packet->length); flowcontrol_send_over_uart((border_packet_t *) serial_buf, sizeof(border_l3_header_t)); }
void multiplex_send_addr_over_tty(struct in6_addr *addr) { border_addr_packet_t *packet = (border_addr_packet_t *)get_serial_out_buffer(0); packet->empty = 0; packet->type = BORDER_PACKET_CONF_TYPE; packet->conftype = BORDER_CONF_IPADDR; memcpy( &packet->addr, addr, sizeof(struct in6_addr) ); flowcontrol_send_over_tty( (border_packet_t *) packet, sizeof(border_addr_packet_t) ); }
void multiplex_send_context_over_tty(const border_context_t *context) { border_context_packet_t *con_packet = (border_context_packet_t *)get_serial_out_buffer(0); con_packet->empty = 0; con_packet->type = BORDER_PACKET_CONF_TYPE; con_packet->conftype = BORDER_CONF_CONTEXT; memcpy( &con_packet->context, context, sizeof(border_context_t) ); flowcontrol_send_over_tty( (border_packet_t *) con_packet, sizeof(border_context_packet_t) ); }