Ethereal-dev: [ethereal-dev] Patch to "packet-ip.c" to handle alignement for I[GC]MP
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: guy@xxxxxxxxxx (Guy Harris)
Date: Sat, 3 Oct 1998 01:50:05 -0700 (PDT)
FDDI, for example, can hand you quite badly misaligned packets; IP
copies the header to fix the alignment, but ICMP and IGMP don't:
*** packet-ip.c 1998/09/27 04:09:30 1.4
--- packet-ip.c 1998/10/03 08:48:38
***************
*** 181,203 ****
void
dissect_icmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
! e_icmp *ih;
GtkWidget *icmp_tree, *ti;
guint16 cksum;
gchar type_str[64], code_str[64] = "";
! ih = (e_icmp *) &pd[offset];
/* To do: check for runts, errs, etc. */
! cksum = ntohs(ih->icmp_cksum);
! switch (ih->icmp_type) {
case ICMP_ECHOREPLY:
strcpy(type_str, "Echo (ping) reply");
break;
case ICMP_UNREACH:
strcpy(type_str, "Destination unreachable");
! if (ih->icmp_code < 12) {
! sprintf(code_str, "(%s)", unreach_str[ih->icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
--- 181,204 ----
void
dissect_icmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
! e_icmp ih;
GtkWidget *icmp_tree, *ti;
guint16 cksum;
gchar type_str[64], code_str[64] = "";
! /* Avoids alignment problems on many architectures. */
! memcpy(&ih, &pd[offset], sizeof(e_icmp));
/* To do: check for runts, errs, etc. */
! cksum = ntohs(ih.icmp_cksum);
! switch (ih.icmp_type) {
case ICMP_ECHOREPLY:
strcpy(type_str, "Echo (ping) reply");
break;
case ICMP_UNREACH:
strcpy(type_str, "Destination unreachable");
! if (ih.icmp_code < 12) {
! sprintf(code_str, "(%s)", unreach_str[ih.icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
***************
*** 207,214 ****
break;
case ICMP_REDIRECT:
strcpy(type_str, "Redirect");
! if (ih->icmp_code < 4) {
! sprintf(code_str, "(%s)", redir_str[ih->icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
--- 208,215 ----
break;
case ICMP_REDIRECT:
strcpy(type_str, "Redirect");
! if (ih.icmp_code < 4) {
! sprintf(code_str, "(%s)", redir_str[ih.icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
***************
*** 218,233 ****
break;
case ICMP_TIMXCEED:
strcpy(type_str, "Time-to-live exceeded");
! if (ih->icmp_code < 2) {
! sprintf(code_str, "(%s)", ttl_str[ih->icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
break;
case ICMP_PARAMPROB:
strcpy(type_str, "Parameter problem");
! if (ih->icmp_code < 2) {
! sprintf(code_str, "(%s)", par_str[ih->icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
--- 219,234 ----
break;
case ICMP_TIMXCEED:
strcpy(type_str, "Time-to-live exceeded");
! if (ih.icmp_code < 2) {
! sprintf(code_str, "(%s)", ttl_str[ih.icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
break;
case ICMP_PARAMPROB:
strcpy(type_str, "Parameter problem");
! if (ih.icmp_code < 2) {
! sprintf(code_str, "(%s)", par_str[ih.icmp_code]);
} else {
strcpy(code_str, "(Unknown - error?)");
}
***************
*** 259,284 ****
icmp_tree = gtk_tree_new();
add_subtree(ti, icmp_tree, ETT_ICMP);
add_item_to_tree(icmp_tree, offset, 1, "Type: %d (%s)",
! ih->icmp_type, type_str);
add_item_to_tree(icmp_tree, offset + 1, 1, "Code: %d %s",
! ih->icmp_code, code_str);
add_item_to_tree(icmp_tree, offset + 2, 2, "Checksum: 0x%04x",
! ih->icmp_cksum);
}
}
void
dissect_igmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
! e_igmp *ih;
GtkWidget *igmp_tree, *ti;
guint16 cksum;
gchar type_str[64] = "";
! ih = (e_igmp *) &pd[offset];
/* To do: check for runts, errs, etc. */
! cksum = ntohs(ih->igmp_cksum);
! switch (ih->igmp_t) {
case IGMP_M_QRY:
strcpy(type_str, "Router query");
break;
--- 260,286 ----
icmp_tree = gtk_tree_new();
add_subtree(ti, icmp_tree, ETT_ICMP);
add_item_to_tree(icmp_tree, offset, 1, "Type: %d (%s)",
! ih.icmp_type, type_str);
add_item_to_tree(icmp_tree, offset + 1, 1, "Code: %d %s",
! ih.icmp_code, code_str);
add_item_to_tree(icmp_tree, offset + 2, 2, "Checksum: 0x%04x",
! ih.icmp_cksum);
}
}
void
dissect_igmp(const u_char *pd, int offset, frame_data *fd, GtkTree *tree) {
! e_igmp ih;
GtkWidget *igmp_tree, *ti;
guint16 cksum;
gchar type_str[64] = "";
! /* Avoids alignment problems on many architectures. */
! memcpy(&ih, &pd[offset], sizeof(e_igmp));
/* To do: check for runts, errs, etc. */
! cksum = ntohs(ih.igmp_cksum);
! switch (ih.igmp_t) {
case IGMP_M_QRY:
strcpy(type_str, "Router query");
break;
***************
*** 317,330 ****
igmp_tree = gtk_tree_new();
add_subtree(ti, igmp_tree, ETT_IGMP);
add_item_to_tree(igmp_tree, offset, 1, "Version: %d",
! ih->igmp_v);
add_item_to_tree(igmp_tree, offset , 1, "Type: %d (%s)",
! ih->igmp_t, type_str);
add_item_to_tree(igmp_tree, offset + 1, 1, "Unused: 0x%02x",
! ih->igmp_unused);
add_item_to_tree(igmp_tree, offset + 2, 2, "Checksum: 0x%04x",
! ih->igmp_cksum);
add_item_to_tree(igmp_tree, offset + 4, 4, "Group address: %s",
! ip_to_str((guint8 *) &ih->igmp_gaddr));
}
}
--- 319,332 ----
igmp_tree = gtk_tree_new();
add_subtree(ti, igmp_tree, ETT_IGMP);
add_item_to_tree(igmp_tree, offset, 1, "Version: %d",
! ih.igmp_v);
add_item_to_tree(igmp_tree, offset , 1, "Type: %d (%s)",
! ih.igmp_t, type_str);
add_item_to_tree(igmp_tree, offset + 1, 1, "Unused: 0x%02x",
! ih.igmp_unused);
add_item_to_tree(igmp_tree, offset + 2, 2, "Checksum: 0x%04x",
! ih.igmp_cksum);
add_item_to_tree(igmp_tree, offset + 4, 4, "Group address: %s",
! ip_to_str((guint8 *) &ih.igmp_gaddr));
}
}
- Prev by Date: [ethereal-dev] Patch to "packet-fddi.c" for non-0, non-4 priority async frames
- Next by Date: [ethereal-dev] Patch to fix up byte order handling
- Previous by thread: [ethereal-dev] Patch to "packet-fddi.c" for non-0, non-4 priority async frames
- Next by thread: [ethereal-dev] Patch to fix up byte order handling
- Index(es):





