Signed-off-by: Vitezslav Samel <vitezslav(a)samel.cz>
---
src/itrafmon.c | 12 +++---------
src/othptab.c | 6 +++---
src/othptab.h | 2 +-
src/packet.c | 13 +++++++++++++
src/packet.h | 1 +
5 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/src/itrafmon.c b/src/itrafmon.c
index 328041a..9a81e96 100644
--- a/src/itrafmon.c
+++ b/src/itrafmon.c
@@ -583,8 +583,6 @@ void ipmon(time_t facilitytime, char *ifptr)
/* reattempt in updateentry() */
int pkt_result = 0; /* Non-IP filter ok */
- int fragment = 0; /* Set to 1 if not first fragment */
-
int fd;
struct pkt_hdr pkt;
@@ -993,7 +991,7 @@ void ipmon(time_t facilitytime, char *ifptr)
NOT_IP,
pkt.pkt_protocol,
pkt.pkt_payload, ifname, 0,
- 0, logging, logfile, 0);
+ 0, logging, logfile);
continue;
}
@@ -1114,21 +1112,17 @@ void ipmon(time_t facilitytime, char *ifptr)
}
} else if (pkt.iphdr) {
check_icmp_dest_unreachable(&table, &pkt, ifname);
-
- fragment = !ipv4_is_first_fragment(pkt.iphdr);
add_othp_entry(&othptbl, &pkt, &saddr, &daddr,
IS_IP, pkt_ip_protocol(&pkt),
ip_payload, ifname,
- &revlook, rvnfd, logging, logfile,
- fragment);
+ &revlook, rvnfd, logging, logfile);
} else {
check_icmp_dest_unreachable(&table, &pkt, ifname);
add_othp_entry(&othptbl, &pkt, &saddr, &daddr,
IS_IP, pkt_ip_protocol(&pkt),
ip_payload, ifname,
- &revlook, rvnfd, logging, logfile,
- fragment);
+ &revlook, rvnfd, logging, logfile);
}
}
diff --git a/src/othptab.c b/src/othptab.c
index 2a08882..4f5a002 100644
--- a/src/othptab.c
+++ b/src/othptab.c
@@ -195,7 +195,7 @@ struct othptabent *add_othp_entry(struct othptable *table, struct
pkt_hdr *pkt,
int protocol,
char *packet2,
char *ifname, int *rev_lookup, int rvnfd,
- int logging, FILE *logfile, int fragment)
+ int logging, FILE *logfile)
{
struct othptabent *new_entry;
struct othptabent *temp;
@@ -203,7 +203,7 @@ struct othptabent *add_othp_entry(struct othptable *table, struct
pkt_hdr *pkt,
new_entry = xmallocz(sizeof(struct othptabent));
new_entry->is_ip = is_ip;
- new_entry->fragment = fragment;
+ new_entry->fragment = !packet_is_first_fragment(pkt);
if (options.mac || !is_ip) {
if (pkt->from->sll_hatype == ARPHRD_ETHER) {
@@ -224,7 +224,7 @@ struct othptabent *add_othp_entry(struct othptable *table, struct
pkt_hdr *pkt,
revname(rev_lookup, daddr, new_entry->d_fqdn,
sizeof(new_entry->d_fqdn), rvnfd);
- if (!fragment) {
+ if (!new_entry->fragment) {
if (protocol == IPPROTO_ICMP) {
new_entry->un.icmp.type =
((struct icmphdr *) packet2)->type;
diff --git a/src/othptab.h b/src/othptab.h
index 1a93d8f..fd623d8 100644
--- a/src/othptab.h
+++ b/src/othptab.h
@@ -128,7 +128,7 @@ struct othptabent *add_othp_entry(struct othptable *table, struct
pkt_hdr *pkt,
int protocol,
char *packet2,
char *ifname, int *rev_lookup, int rvnamedon,
- int logging, FILE *logfile, int fragment);
+ int logging, FILE *logfile);
void printothpentry(struct othptable *table, struct othptabent *entry,
unsigned int screen_idx, int logging, FILE * logfile);
diff --git a/src/packet.c b/src/packet.c
index d5dd44e..eed02dd 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -369,3 +369,16 @@ unsigned int packet_get_dropped(int fd)
return stats.tp_drops;
}
+
+int packet_is_first_fragment(struct pkt_hdr *pkt)
+{
+ switch (pkt->pkt_protocol) {
+ case ETH_P_IP:
+ return ipv4_is_first_fragment(pkt->iphdr);
+ case ETH_P_IPV6:
+ /* FIXME: IPv6 can also be fragmented !!! */
+ /* fall through for now */
+ default:
+ return !0;
+ }
+}
diff --git a/src/packet.h b/src/packet.h
index d23c831..1f01336 100644
--- a/src/packet.h
+++ b/src/packet.h
@@ -68,5 +68,6 @@ int packet_process(struct pkt_hdr *pkt, unsigned int *total_br,
int packet_init(struct pkt_hdr *pkt);
void packet_destroy(struct pkt_hdr *pkt);
unsigned int packet_get_dropped(int fd);
+int packet_is_first_fragment(struct pkt_hdr *pkt);
#endif /* IPTRAF_NG_PACKET_H */
--
1.9.1