Ejemplo n.º 1
0
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);
    }
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
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);
}