* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+/* \summary: Ethernet printer */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
{ ETHERTYPE_RRCP, "RRCP" },
{ ETHERTYPE_MS_NLB_HB, "MS NLB heartbeat" },
{ ETHERTYPE_JUMBO, "Jumbo" },
+ { ETHERTYPE_NSH, "NSH" },
{ ETHERTYPE_LOOPBACK, "Loopback" },
{ ETHERTYPE_ISO, "OSI" },
{ ETHERTYPE_GRE_ISO, "GRE-OSI" },
* This might be encapsulated within another frame; we might be passed
* a pointer to a function that can print header information for that
* frame's protocol, and an argument to pass to that function.
+ *
+ * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
*/
u_int
ether_print(netdissect_options *ndo,
u_short length_type;
u_int hdrlen;
int llc_hdrlen;
+ struct lladdr_info src, dst;
if (caplen < ETHER_HDRLEN) {
ND_PRINT((ndo, "[|ether]"));
p += ETHER_HDRLEN;
hdrlen = ETHER_HDRLEN;
+ src.addr = ESRC(ep);
+ src.addr_string = etheraddr_string;
+ dst.addr = EDST(ep);
+ dst.addr_string = etheraddr_string;
length_type = EXTRACT_16BITS(&ep->ether_length_type);
recurse:
*/
if (length_type <= ETHERMTU) {
/* Try to print the LLC-layer header & higher layers */
- llc_hdrlen = llc_print(ndo, p, length, caplen, ESRC(ep), EDST(ep));
+ 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)
* there's an LLC header and payload.
*/
/* Try to print the LLC-layer header & higher layers */
- llc_hdrlen = llc_print(ndo, p, length, caplen, ESRC(ep), EDST(ep));
+ 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)
}
hdrlen += llc_hdrlen;
} else {
- if (ethertype_print(ndo, length_type, p, length, caplen) == 0) {
+ if (ethertype_print(ndo, length_type, p, length, caplen, &src, &dst) == 0) {
/* type not known, print raw packet */
if (!ndo->ndo_eflag) {
if (print_encap_header != NULL)
int
ethertype_print(netdissect_options *ndo,
u_short ether_type, const u_char *p,
- u_int length, u_int caplen)
+ u_int length, u_int caplen,
+ const struct lladdr_info *src, const struct lladdr_info *dst)
{
switch (ether_type) {
return (1);
case ETHERTYPE_ISO:
- isoclns_print(ndo, p + 1, length - 1, length - 1);
+ if (length == 0 || caplen == 0) {
+ ND_PRINT((ndo, " [|osi]"));
+ return (1);
+ }
+ isoclns_print(ndo, p + 1, length - 1, caplen - 1);
return(1);
case ETHERTYPE_PPPOED:
return (1);
case ETHERTYPE_RRCP:
- rrcp_print(ndo, p - 14 , length + 14);
+ rrcp_print(ndo, p, length, src, dst);
return (1);
case ETHERTYPE_PPP:
lldp_print(ndo, p, length);
return (1);
+ case ETHERTYPE_NSH:
+ nsh_print(ndo, p, length);
+ return (1);
+
case ETHERTYPE_LOOPBACK:
loopback_print(ndo, p, length);
return (1);
case ETHERTYPE_GEONET_OLD:
case ETHERTYPE_GEONET:
- geonet_print(ndo, p-14, p, length);
+ geonet_print(ndo, p, length, src);
return (1);
case ETHERTYPE_CALM_FAST:
- calm_fast_print(ndo, p-14, p, length);
+ calm_fast_print(ndo, p, length, src);
return (1);
case ETHERTYPE_AOE:
return (1);
case ETHERTYPE_MEDSA:
- medsa_print(ndo, p, length, caplen);
+ medsa_print(ndo, p, length, caplen, src, dst);
return (1);
case ETHERTYPE_LAT: