static void parse_message(char *msg) { char *label = msg; char *value = strchr(label, ' '); char *cksum; if (!value) { fprintf(stderr, "Did not find value in message \"%s\"\n", msg); return; } *value = 0; value++; cksum = strchr(value, ' '); if (!cksum) { fprintf(stderr, "Did not find cksum in message \"%s\"\n", msg); return; } *cksum = 0; cksum++; if (*cksum != compute_cksum(label, value)) { fprintf(stderr, "%s %s has cksum %c, invalid on the wire.\n", label, value, *cksum); return; } else { // fprintf(stderr, "%s %s has valid cksum %c\n", label, value, *cksum); accumulate_value(label, value); } }
int send_final_close_ack(uint32_t source_port, int portno, int sockfd) { int num_sent; struct tcp_hdr close_req_seg; char tcp_char_seg[255]; unsigned short int cksum_arr[12]; close_req_seg.src = source_port; //set source port close_req_seg.des = portno; //set destination port close_req_seg.seq = 0; //Assign an initial client sequence number with close_req_seg.ack = 0; //a zero acknowledgement number close_req_seg.hdr_flags = FIN; //set the FIN bit to 1 close_req_seg.rec = 0; close_req_seg.cksum = 0; close_req_seg.ptr = 0; close_req_seg.opt = 0; memcpy(cksum_arr, &close_req_seg, 24); close_req_seg.cksum = compute_cksum(cksum_arr); printf("-----CLOSE ACKNOWLEDGEMENT TO SERVER-----\n"); print_tcp_seg(&close_req_seg); memcpy(tcp_char_seg, &close_req_seg, sizeof close_req_seg); num_sent = write(sockfd, tcp_char_seg, 255); if (num_sent < 0) { printf("error writing to socket...\n"); return 1; } return 0; }
int send_conn_request(uint32_t source_port, int portno, int sockfd) { int num_sent; struct tcp_hdr tcp_seg; unsigned short int cksum_arr[12]; char tcp_char_segment[255]; /*set up connection request tcp struct*/ tcp_seg.src = source_port; //set source port tcp_seg.des = portno; //set destination port tcp_seg.seq = CLIENT_SEQ; //Assign an initial client sequence number with tcp_seg.ack = 0; //a zero acknowledgement number tcp_seg.hdr_flags = SYN; //set the SYN bit to 1 tcp_seg.rec = 0; tcp_seg.cksum = 0; tcp_seg.ptr = 0; tcp_seg.opt = 0; memcpy(cksum_arr, &tcp_seg, 24); //Copying 24 bytes tcp_seg.cksum = compute_cksum(cksum_arr); //compute checksum printf("-----TRANSMITTED CONNECTION REQUEST SEGMENT-----\n"); print_tcp_seg(&tcp_seg); /* send TCP struct to server */ memcpy(tcp_char_segment, &tcp_seg, sizeof(tcp_seg)); //copy struct to char array num_sent = write(sockfd, tcp_char_segment, 255); //write to socket if (num_sent < 0) { printf("error writing to socket...\n"); exit(1); } return 0; }
int send_ack_tcp_seg(int sockfd) { int num_recv, num_sent, temp_portno; char tcp_char_seg[255]; unsigned short int cksum_arr[12]; struct tcp_hdr conn_grant_seg; /* read in connection granted segment */ num_recv = read(sockfd, tcp_char_seg, 255); //read from socket if(num_recv < 0) { printf("error reading from socket...\n"); exit(1); } memcpy(&conn_grant_seg, tcp_char_seg, sizeof conn_grant_seg); //copy buffer to segment printf("-----RECEIVED CONNECTION GRANTED SEGMENT-----\n"); print_tcp_seg(&conn_grant_seg); //swap port numbers temp_portno = conn_grant_seg.src; conn_grant_seg.src = conn_grant_seg.des; conn_grant_seg.des = temp_portno; //Assign a sequence number as initial client sequence number + 1 with an acknowledgement number equal to initial server sequence number + 1 conn_grant_seg.ack = conn_grant_seg.seq + 1; //201 //Set the ACK bit to 1 conn_grant_seg.hdr_flags = ACK; //Compute the 16-bit checksum of the entire TCP segment and populate the checksum field memcpy(cksum_arr, &conn_grant_seg, 24); conn_grant_seg.cksum = compute_cksum(cksum_arr); //respond to server with acknowledgent TCP segment bzero(tcp_char_seg,255); memcpy(tcp_char_seg, &conn_grant_seg, sizeof conn_grant_seg); printf("-----TRANSMITTED ACKNOWLEDGEMENT SEGMENT-----\n"); print_tcp_seg(&conn_grant_seg); num_sent = write(sockfd, tcp_char_seg, 255); //write back to server if (num_sent < 0) { printf("error writing to socket...\n"); exit(1); } return 0; }
static void run_reset_resident(void) { const struct rrcode *p = (const struct rrcode *)phystop; for (--p; p > (struct rrcode *)&etv_timer; p--) { if (p->magic != RR_MAGIC) continue; if (p->pointer != p) continue; if (compute_cksum((const UWORD *)p) != RR_CHKSUM) continue; regsafe_call(p->program); } }
int send_close_req(uint32_t source_port, int portno, int sockfd) { int num_sent, num_recv; struct tcp_hdr close_req_seg; struct tcp_hdr close_ack_seg; char tcp_char_seg[255]; unsigned short int cksum_arr[12]; close_req_seg.src = source_port; //set source port close_req_seg.des = portno; //set destination port close_req_seg.seq = CLIENT_SEQ; //Assign an initial client sequence number with close_req_seg.ack = 0; //a zero acknowledgement number close_req_seg.hdr_flags = FIN; //set the FIN bit to 1 close_req_seg.rec = 0; close_req_seg.cksum = 0; close_req_seg.ptr = 0; close_req_seg.opt = 0; memcpy(cksum_arr, &close_req_seg, 24); close_req_seg.cksum = compute_cksum(cksum_arr); printf("-----TRANSMITTED CLOSE REQUEST-----\n"); print_tcp_seg(&close_req_seg); memcpy(tcp_char_seg, &close_req_seg, sizeof close_req_seg); num_sent = write(sockfd, tcp_char_seg, 255); if (num_sent < 0) { printf("error writing to socket...\n"); return 1; } /* read in close acknowledge segment */ bzero(tcp_char_seg, 255); num_recv = read(sockfd, tcp_char_seg, 255); //read from socket if(num_recv < 0) { printf("error reading from socket...\n"); exit(1); } memcpy(&close_ack_seg, tcp_char_seg, sizeof close_ack_seg); //copy buffer to segment printf("-----CLOSE ACK SEGMENT FROM SERVER-----\n"); print_tcp_seg(&close_ack_seg); /* read in second close acknowledge segment */ bzero(tcp_char_seg, 255); num_recv = read(sockfd, tcp_char_seg, 255); //read from socket if(num_recv < 0) { printf("error reading from socket...\n"); exit(1); } memcpy(&close_ack_seg, tcp_char_seg, sizeof close_ack_seg); //copy buffer to segment close_ack_seg.hdr_flags = ACK; close_ack_seg.ack = close_ack_seg.seq; printf("-----SECOND CLOSE ACK SEGMENT FROM SERVER-----\n"); print_tcp_seg(&close_ack_seg); return 0; }