static void handle_tokenring_packet(unsigned char* args, const struct pcap_pkthdr* pkthdr, const unsigned char* packet) { struct token_header *trp; int dir = -1; trp = (struct token_header *)packet; if(IS_SOURCE_ROUTED(trp)) { packet += RIF_LENGTH(trp); } packet += TOKEN_HDRLEN; if(memcmp(trp->token_shost, if_hw_addr, 6) == 0 ) { /* packet leaving this i/f */ dir = 1; } else if(memcmp(trp->token_dhost, if_hw_addr, 6) == 0 || memcmp("\xFF\xFF\xFF\xFF\xFF\xFF", trp->token_dhost, 6) == 0) { /* packet entering this i/f */ dir = 0; } /* Only know how to deal with LLC encapsulated packets */ if(FRAME_TYPE(trp) == TOKEN_FC_LLC) { handle_llc_packet((struct llc*)packet, dir); } }
int8_t frame_decode(struct frame *fr, void *data, uint8_t *data_len, uint8_t *type) { uint8_t data_crc = 0xff, i; *data_len = FRAME_LEN(fr); *type = FRAME_TYPE(fr); data_crc = frame_crc_calc(data_crc, fr->header); for (i = 0; i < *data_len; i++) { data_crc = frame_crc_calc(data_crc, fr->payload[i]); } if (data_crc == fr->checksum) { memcpy(data, fr->payload, *data_len); } else { return -FRAME_ERR_CRC; } return FRAME_OK; }
u_int _token_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen) { const struct token_header *trp; u_short extracted_ethertype; struct ether_header ehdr; u_int route_len = 0, hdr_len = TOKEN_HDRLEN; int seg; trp = (const struct token_header *)p; if (caplen < TOKEN_HDRLEN) { ND_PRINT((ndo, "%s", tstr)); return hdr_len; } /* * Get the TR addresses into a canonical form */ extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr)); /* Adjust for source routing information in the MAC header */ if (IS_SOURCE_ROUTED(trp)) { /* Clear source-routed bit */ *ESRC(&ehdr) &= 0x7f; if (ndo->ndo_eflag) token_hdr_print(ndo, trp, length, ESRC(&ehdr), EDST(&ehdr)); if (caplen < TOKEN_HDRLEN + 2) { ND_PRINT((ndo, "%s", tstr)); return hdr_len; } route_len = RIF_LENGTH(trp); hdr_len += route_len; if (caplen < hdr_len) { ND_PRINT((ndo, "%s", tstr)); return hdr_len; } if (ndo->ndo_vflag) { ND_PRINT((ndo, "%s ", broadcast_indicator[BROADCAST(trp)])); ND_PRINT((ndo, "%s", direction[DIRECTION(trp)])); for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) ND_PRINT((ndo, " [%d:%d]", RING_NUMBER(trp, seg), BRIDGE_NUMBER(trp, seg))); } else { ND_PRINT((ndo, "rt = %x", EXTRACT_16BITS(&trp->token_rcf))); for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) ND_PRINT((ndo, ":%x", EXTRACT_16BITS(&trp->token_rseg[seg]))); } ND_PRINT((ndo, " (%s) ", largest_frame[LARGEST_FRAME(trp)])); } else { if (ndo->ndo_eflag) token_hdr_print(ndo, trp, length, ESRC(&ehdr), EDST(&ehdr)); } /* Skip over token ring MAC header and routing information */ length -= hdr_len; p += hdr_len; caplen -= hdr_len; /* Frame Control field determines interpretation of packet */ if (FRAME_TYPE(trp) == TOKEN_FC_LLC) { /* Try to print the LLC-layer header & higher layers */ if (llc_print(ndo, p, length, caplen, ESRC(&ehdr), EDST(&ehdr), &extracted_ethertype) == 0) { /* ether_type not known, print raw packet */ if (!ndo->ndo_eflag) token_hdr_print(ndo, trp, length + TOKEN_HDRLEN + route_len, ESRC(&ehdr), EDST(&ehdr)); if (extracted_ethertype) { ND_PRINT((ndo, "(LLC %s) ", etherproto_string(htons(extracted_ethertype)))); } if (!ndo->ndo_suppress_default_print) ND_DEFAULTPRINT(p, caplen); } } else { /* Some kinds of TR packet we cannot handle intelligently */ /* XXX - dissect MAC packets if frame type is 0 */ if (!ndo->ndo_eflag) token_hdr_print(ndo, trp, length + TOKEN_HDRLEN + route_len, ESRC(&ehdr), EDST(&ehdr)); if (!ndo->ndo_suppress_default_print) ND_DEFAULTPRINT(p, caplen); } return (hdr_len); }
static int fill_internal_msg(internal_msg_t *dst, uint8_t *buf, int len, uint8_t *chunk, size_t size) { int msg_len; struct frame_body_data_st *fdp = (struct frame_body_data_st *)buf; dst->msg_type = (int)FRAME_TYPE(ntohs(fdp->type_id)); /* data frame */ if (dst->msg_type == 0) { dst->data_frame_body.flow_id = (int)FRAME_PIPLINEID(ntohs(fdp->type_id)); msg_len = len - 2; //uint16_t if (msg_len > size) { return -1; } memcpy(chunk, fdp->data, msg_len); dst->data_frame_body.data = chunk; dst->data_frame_body.data_len = msg_len; return 0; } /* control frame */ struct frame_body_ctl_socket_cert_req_st *tfcp = (struct frame_body_ctl_socket_cert_req_st *)buf; dst->ctl_frame_body.code = (int)FRAME_OPCODE(ntohs(tfcp->type_opcode)); switch (dst->ctl_frame_body.code) { case CTL_SOCKET_CERT_REQ: //do nothing break; case CTL_SOCKET_CERT: msg_len = len - 2; if (msg_len > size) { return -1; } memcpy(chunk, ((struct frame_body_ctl_socket_cert_st *)buf)->x509_certificate, msg_len); dst->ctl_frame_body.arg.socket_cert.crt_bin = chunk; dst->ctl_frame_body.arg.socket_cert.crt_len = msg_len; break; case CTL_SOCKET_KEY_SYNC: dst->ctl_frame_body.arg.socket_key_sync.crc32 = ntohl(((struct frame_body_ctl_socket_key_sync_st *)buf)->crc32); msg_len = len - 6; if (msg_len > size) { return -1; } memcpy(chunk, ((struct frame_body_ctl_socket_key_sync_st *)buf)->encrypted_shared_key, msg_len); dst->ctl_frame_body.arg.socket_key_sync.encrypted_shared_key = chunk; dst->ctl_frame_body.arg.socket_key_sync.encrypted_shared_key_len = msg_len; break; case CTL_SOCKET_KEY_OK: //do nothing break; case CTL_SOCKET_KEY_REJ: //do nothing break; case CTL_PIPELINE_OPEN: dst->ctl_frame_body.arg.pipeline_open.flow_id = (int)ntohs(((struct frame_body_ctl_pipeline_open_st *)buf)->pipeline_id); dst->ctl_frame_body.arg.pipeline_open.max_delay_in_ms = (int)ntohs(((struct frame_body_ctl_pipeline_open_st *)buf)->max_delay_in_ms); dst->ctl_frame_body.arg.pipeline_open.reply_frame_flags = (int)((struct frame_body_ctl_pipeline_open_st *)buf)->reply_frame_flags; dst->ctl_frame_body.arg.pipeline_open.upstream_recvtimeo_ms = (int)ntohs(((struct frame_body_ctl_pipeline_open_st *)buf)->upstream_recvtimeo_ms); msg_len = len - 9; if (msg_len > size) { return -1; } memcpy(chunk, ((struct frame_body_ctl_pipeline_open_st *)buf)->data, msg_len); dst->ctl_frame_body.arg.pipeline_open.data = chunk; dst->ctl_frame_body.arg.pipeline_open.data_len = msg_len; break; case CTL_PIPELINE_FAILURE: dst->ctl_frame_body.arg.pipeline_failure.flow_id = (int)ntohs(((struct frame_body_ctl_pipeline_failure_st *)buf)->pipeline_id); dst->ctl_frame_body.arg.pipeline_failure.error_code = ((struct frame_body_ctl_pipeline_failure_st *)buf)->error_code; break; case CTL_PIPELINE_CLOSE: dst->ctl_frame_body.arg.pipeline_close.flow_id = (int)ntohs(((struct frame_body_ctl_pipeline_close_st *)buf)->pipeline_id); break; default: return -1; } return 0; }
u_int token_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen) { const struct token_header *trp; int llc_hdrlen; nd_mac_addr srcmac, dstmac; struct lladdr_info src, dst; u_int route_len = 0, hdr_len = TOKEN_HDRLEN; int seg; ndo->ndo_protocol = "token"; trp = (const struct token_header *)p; if (caplen < TOKEN_HDRLEN) { nd_print_trunc(ndo); return hdr_len; } /* * Get the TR addresses into a canonical form */ extract_token_addrs(trp, (char*)srcmac, (char*)dstmac); /* Adjust for source routing information in the MAC header */ if (IS_SOURCE_ROUTED(trp)) { /* Clear source-routed bit */ srcmac[0] &= 0x7f; if (ndo->ndo_eflag) token_hdr_print(ndo, trp, length, srcmac, dstmac); if (caplen < TOKEN_HDRLEN + 2) { nd_print_trunc(ndo); return hdr_len; } route_len = RIF_LENGTH(trp); hdr_len += route_len; if (caplen < hdr_len) { nd_print_trunc(ndo); return hdr_len; } if (ndo->ndo_vflag) { ND_PRINT("%s ", broadcast_indicator[BROADCAST(trp)]); ND_PRINT("%s", direction[DIRECTION(trp)]); for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) ND_PRINT(" [%u:%u]", RING_NUMBER(trp, seg), BRIDGE_NUMBER(trp, seg)); } else { ND_PRINT("rt = %x", EXTRACT_BE_U_2(trp->token_rcf)); for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) ND_PRINT(":%x", EXTRACT_BE_U_2(trp->token_rseg[seg])); } ND_PRINT(" (%s) ", largest_frame[LARGEST_FRAME(trp)]); } else { if (ndo->ndo_eflag) token_hdr_print(ndo, trp, length, srcmac, dstmac); } src.addr = srcmac; src.addr_string = etheraddr_string; dst.addr = dstmac; dst.addr_string = etheraddr_string; /* Skip over token ring MAC header and routing information */ length -= hdr_len; p += hdr_len; caplen -= hdr_len; /* Frame Control field determines interpretation of packet */ if (FRAME_TYPE(trp) == TOKEN_FC_LLC) { /* Try to print the LLC-layer header & higher layers */ llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst); if (llc_hdrlen < 0) { /* packet type not known, print raw packet */ if (!ndo->ndo_suppress_default_print) ND_DEFAULTPRINT(p, caplen); llc_hdrlen = -llc_hdrlen; } hdr_len += llc_hdrlen; } else { /* Some kinds of TR packet we cannot handle intelligently */ /* XXX - dissect MAC packets if frame type is 0 */ if (!ndo->ndo_eflag) token_hdr_print(ndo, trp, length + TOKEN_HDRLEN + route_len, srcmac, dstmac); if (!ndo->ndo_suppress_default_print) ND_DEFAULTPRINT(p, caplen); } return (hdr_len); }