#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-slow.c,v 1.5 2006-05-18 08:23:26 hannes Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-slow.c,v 1.8 2006-10-12 05:44:33 hannes Exp $";
#endif
#ifdef HAVE_CONFIG_H
{ 0x0020, "Remote Evaluating" },
{ 0x0040, "Remote Stable" },
{ 0, NULL}
-};
+};
#define SLOW_OAM_CODE_INFO 0x00
#define SLOW_OAM_CODE_EVENT_NOTIF 0x01
u_int8_t revision[2];
u_int8_t state;
u_int8_t oam_config;
- u_int8_t oam_pdu_config;
+ u_int8_t oam_pdu_config[2];
u_int8_t oui[3];
u_int8_t vendor_private[4];
};
u_int8_t length;
};
+struct slow_oam_loopbackctrl_t {
+ u_int8_t command;
+};
+
static const struct tok slow_oam_loopbackctrl_cmd_values[] = {
{ 0x01, "Enable OAM Remote Loopback" },
{ 0x02, "Disable OAM Remote Loopback" },
u_int8_t port[2];
u_int8_t state;
u_int8_t pad[3];
-};
+};
static const struct tok lacp_tlv_actor_partner_info_state_values[] = {
{ 0x01, "Activity"},
struct lacp_tlv_collector_info_t {
u_int8_t max_delay[2];
u_int8_t pad[12];
-};
+};
struct marker_tlv_marker_info_t {
u_int8_t req_port[2];
u_int8_t req_sys[ETHER_ADDR_LEN];
u_int8_t req_trans_id[4];
u_int8_t pad[2];
-};
+};
struct lacp_marker_tlv_terminator_t {
u_int8_t pad[50];
-};
+};
void slow_marker_lacp_print(register const u_char *, register u_int);
void slow_oam_print(register const u_char *, register u_int);
/* unrecognized subtype */
if (print_version == -1) {
- print_unknown_data(pptr, "\n\t", len);
+ print_unknown_data(gndo,pptr, "\n\t", len);
return;
}
const struct lacp_tlv_collector_info_t *lacp_tlv_collector_info;
const struct marker_tlv_marker_info_t *marker_tlv_marker_info;
} tlv_ptr;
-
+
while(tlen>0) {
/* did we capture enough for fully decoding the tlv header ? */
TCHECK2(*tptr, sizeof(struct tlv_header_t));
tlv_header->type != LACP_TLV_TERMINATOR &&
tlv_header->type != MARKER_TLV_TERMINATOR) {
printf("\n\t-----trailing data-----");
- print_unknown_data(tptr+sizeof(sizeof(struct tlv_header_t)),"\n\t ",tlen);
+ print_unknown_data(gndo,tptr+sizeof(struct tlv_header_t),"\n\t ",tlen);
return;
}
default:
if (vflag <= 1)
- print_unknown_data(tlv_tptr,"\n\t ",tlv_tlen);
+ print_unknown_data(gndo,tlv_tptr,"\n\t ",tlv_tlen);
break;
}
/* do we want to see an additional hexdump ? */
if (vflag > 1) {
- print_unknown_data(tptr+sizeof(sizeof(struct tlv_header_t)),"\n\t ",
+ print_unknown_data(gndo,tptr+sizeof(struct tlv_header_t),"\n\t ",
tlv_len-sizeof(struct tlv_header_t));
}
const struct slow_oam_link_event_t *slow_oam_link_event;
const struct slow_oam_variablerequest_t *slow_oam_variablerequest;
const struct slow_oam_variableresponse_t *slow_oam_variableresponse;
+ const struct slow_oam_loopbackctrl_t *slow_oam_loopbackctrl;
} tlv;
-
+
ptr.slow_oam_common_header = (struct slow_oam_common_header_t *)tptr;
tptr += sizeof(struct slow_oam_common_header_t);
tlen -= sizeof(struct slow_oam_common_header_t);
printf("\n\t ERROR: illegal length - should be 0");
}
return;
-
+
case SLOW_OAM_INFO_TYPE_LOCAL: /* identical format - fall through */
case SLOW_OAM_INFO_TYPE_REMOTE:
tlv.slow_oam_info = (const struct slow_oam_info_t *)tptr;
-
+
if (tlv.slow_oam_info->info_length !=
sizeof(struct slow_oam_info_t)) {
- printf("\n\t ERROR: illegal length - should be %u",
- sizeof(struct slow_oam_info_t));
+ printf("\n\t ERROR: illegal length - should be %lu",
+ (unsigned long) sizeof(struct slow_oam_info_t));
return;
}
tlv.slow_oam_info->oam_version,
EXTRACT_16BITS(&tlv.slow_oam_info->revision));
- printf("\n\t State-MUX-Action %s, State-Parser-Action %s",
+ printf("\n\t State-Parser-Action %s, State-MUX-Action %s",
tok2str(slow_oam_info_type_state_parser_values, "Reserved",
tlv.slow_oam_info->state & OAM_INFO_TYPE_PARSER_MASK),
tok2str(slow_oam_info_type_state_mux_values, "Reserved",
EXTRACT_24BITS(&tlv.slow_oam_info->oui),
EXTRACT_32BITS(&tlv.slow_oam_info->vendor_private));
break;
-
+
case SLOW_OAM_INFO_TYPE_ORG_SPECIFIC:
hexdump = TRUE;
break;
-
+
default:
hexdump = TRUE;
break;
/* do we also want to see a hex dump ? */
if (vflag > 1 || hexdump==TRUE) {
- print_unknown_data(tptr,"\n\t ",
+ print_unknown_data(gndo,tptr,"\n\t ",
ptr.slow_oam_tlv_header->length);
}
printf("\n\t ERROR: illegal length - should be 0");
}
return;
-
+
case SLOW_OAM_LINK_EVENT_ERR_SYM_PER: /* identical format - fall through */
case SLOW_OAM_LINK_EVENT_ERR_FRM:
case SLOW_OAM_LINK_EVENT_ERR_FRM_PER:
case SLOW_OAM_LINK_EVENT_ERR_FRM_SUMM:
tlv.slow_oam_link_event = (const struct slow_oam_link_event_t *)tptr;
-
+
if (tlv.slow_oam_link_event->event_length !=
sizeof(struct slow_oam_link_event_t)) {
- printf("\n\t ERROR: illegal length - should be %u",
- sizeof(struct slow_oam_link_event_t));
+ printf("\n\t ERROR: illegal length - should be %lu",
+ (unsigned long) sizeof(struct slow_oam_link_event_t));
return;
}
EXTRACT_64BITS(&tlv.slow_oam_link_event->errors_running_total),
EXTRACT_32BITS(&tlv.slow_oam_link_event->event_running_total));
break;
-
+
case SLOW_OAM_LINK_EVENT_ORG_SPECIFIC:
hexdump = TRUE;
break;
-
+
default:
hexdump = TRUE;
break;
/* do we also want to see a hex dump ? */
if (vflag > 1 || hexdump==TRUE) {
- print_unknown_data(tptr,"\n\t ",
+ print_unknown_data(gndo,tptr,"\n\t ",
ptr.slow_oam_tlv_header->length);
}
}
break;
+ case SLOW_OAM_CODE_LOOPBACK_CTRL:
+ tlv.slow_oam_loopbackctrl = (const struct slow_oam_loopbackctrl_t *)tptr;
+ printf("\n\t Command %s (%u)",
+ tok2str(slow_oam_loopbackctrl_cmd_values,
+ "Unknown",
+ tlv.slow_oam_loopbackctrl->command),
+ tlv.slow_oam_loopbackctrl->command);
+ tptr ++;
+ tlen --;
+ break;
+
/*
* FIXME those are the defined codes that lack a decoder
* you are welcome to contribute code ;-)
*/
case SLOW_OAM_CODE_VAR_REQUEST:
case SLOW_OAM_CODE_VAR_RESPONSE:
- case SLOW_OAM_CODE_LOOPBACK_CTRL:
case SLOW_OAM_CODE_PRIVATE:
default:
if (vflag <= 1) {
- print_unknown_data(tptr,"\n\t ", tlen);
+ print_unknown_data(gndo,tptr,"\n\t ", tlen);
}
break;
}