Signed-off-by: Vitezslav Samel <vitezslav(a)samel.cz>
---
src/itrafmon.c | 7 ++-----
src/othptab.c | 14 ++++++++------
src/serv.c | 2 +-
src/servname.c | 10 +++++-----
src/servname.h | 2 +-
src/sockaddr.c | 32 ++++++++++++++++++++++++++++++++
src/sockaddr.h | 2 ++
src/tcptable.c | 38 +++++++++++---------------------------
src/tcptable.h | 4 ----
9 files changed, 62 insertions(+), 49 deletions(-)
diff --git a/src/itrafmon.c b/src/itrafmon.c
index d28d988..4ea57f4 100644
--- a/src/itrafmon.c
+++ b/src/itrafmon.c
@@ -1040,17 +1040,16 @@ void ipmon(struct OPTIONS *options, struct filterstate *ofilter,
__u8 ip_protocol = pkt_ip_protocol(&pkt);
if (ip_protocol == IPPROTO_TCP) {
+ sockaddr_set_port(&saddr, ntohs(sport));
+ sockaddr_set_port(&daddr, ntohs(dport));
if (pkt.iphdr) {
tcpentry =
in_table(&table, &saddr, &daddr,
- ntohs(sport),
- ntohs(dport),
ifname, logging,
logfile, options);
} else {
tcpentry =
in_table(&table, &saddr, &daddr,
- ntohs(sport), ntohs(dport),
ifname, logging, logfile, options);
}
@@ -1071,14 +1070,12 @@ void ipmon(struct OPTIONS *options, struct filterstate *ofilter,
if (pkt.iphdr)
tcpentry =
addentry(&table, &saddr, &daddr,
- sport, dport,
pkt_ip_protocol(&pkt),
ifname, &revlook, rvnfd,
options->servnames);
else
tcpentry =
addentry(&table, &saddr, &daddr,
- sport, dport,
pkt_ip_protocol(&pkt),
ifname, &revlook, rvnfd,
options->servnames);
diff --git a/src/othptab.c b/src/othptab.c
index 592ee09..dc4d7a9 100644
--- a/src/othptab.c
+++ b/src/othptab.c
@@ -144,20 +144,22 @@ void process_dest_unreach(struct tcptable *table, char *packet, char
*ifname)
tcp = (struct tcphdr *) (packet + 48);
struct sockaddr_storage saddr, daddr;
sockaddr_make_ipv6(&saddr, &ip6->ip6_src);
+ sockaddr_set_port(&saddr, ntohs(tcp->source));
sockaddr_make_ipv6(&daddr, &ip6->ip6_dst);
+ sockaddr_set_port(&daddr, ntohs(tcp->dest));
tcpentry =
- in_table(table, &saddr, &daddr, ntohs(tcp->source),
- ntohs(tcp->dest), ifname, 0, NULL, NULL);
+ in_table(table, &saddr, &daddr, ifname, 0, NULL, NULL);
} else {
if (ip->protocol != IPPROTO_TCP)
return;
tcp = (struct tcphdr *) (packet + 8 + (ip->ihl * 4));
struct sockaddr_storage saddr, daddr;
sockaddr_make_ipv4(&saddr, ip->saddr);
+ sockaddr_set_port(&saddr, ntohs(tcp->source));
sockaddr_make_ipv4(&daddr, ip->daddr);
+ sockaddr_set_port(&daddr, ntohs(tcp->dest));
tcpentry =
- in_table(table, &saddr, &daddr, ntohs(tcp->source),
- ntohs(tcp->dest), ifname, 0, NULL, NULL);
+ in_table(table, &saddr, &daddr, ifname, 0, NULL, NULL);
}
if (tcpentry != NULL) {
@@ -216,11 +218,11 @@ struct othptabent *add_othp_entry(struct othptable *table, struct
pkt_hdr *pkt,
((struct icmp6_hdr *) packet2)->icmp6_code;
} else if (protocol == IPPROTO_UDP) {
servlook(servnames,
- ((struct udphdr *) packet2)->source,
+ ntohs(((struct udphdr *) packet2)->source),
IPPROTO_UDP, new_entry->un.udp.s_sname,
10);
servlook(servnames,
- ((struct udphdr *) packet2)->dest,
+ ntohs(((struct udphdr *) packet2)->dest),
IPPROTO_UDP, new_entry->un.udp.d_sname,
10);
} else if (protocol == IPPROTO_OSPFIGP) {
diff --git a/src/serv.c b/src/serv.c
index c6a5521..f2470b4 100644
--- a/src/serv.c
+++ b/src/serv.c
@@ -219,7 +219,7 @@ static struct portlistent *addtoportlist(struct portlist *list,
* Obtain appropriate service name
*/
- servlook(servnames, htons(port), protocol, ptemp->servname, 10);
+ servlook(servnames, port, protocol, ptemp->servname, 10);
memset(&ptemp->serv_count, 0, sizeof(ptemp->serv_count));
diff --git a/src/servname.c b/src/servname.c
index c7285ee..658a1c0 100644
--- a/src/servname.c
+++ b/src/servname.c
@@ -10,7 +10,7 @@ servname.c - lookup module for TCP and UDP service names based on
#include "iptraf-ng-compat.h"
-void servlook(int servnames, unsigned int port, unsigned int protocol,
+void servlook(int servnames, in_port_t port, unsigned int protocol,
char *target, int maxlen)
{
static struct servent *sve;
@@ -19,16 +19,16 @@ void servlook(int servnames, unsigned int port, unsigned int
protocol,
if (servnames) {
if (protocol == IPPROTO_TCP)
- sve = getservbyport(port, "tcp");
+ sve = getservbyport(htons(port), "tcp");
else
- sve = getservbyport(port, "udp");
+ sve = getservbyport(htons(port), "udp");
if (sve != NULL) {
strncpy(target, sve->s_name, maxlen);
} else {
- sprintf(target, "%u", ntohs(port));
+ sprintf(target, "%u", port);
}
} else {
- sprintf(target, "%u", ntohs(port));
+ sprintf(target, "%u", port);
}
}
diff --git a/src/servname.h b/src/servname.h
index 55de3ae..7fc4fed 100644
--- a/src/servname.h
+++ b/src/servname.h
@@ -7,7 +7,7 @@ servname.h - function prototype for service lookup
***/
-void servlook(int servnames, unsigned int port, unsigned int protocol,
+void servlook(int servnames, in_port_t port, unsigned int protocol,
char *target, int maxlen);
#endif /* IPTRAF_NG_SERVNAME_H */
diff --git a/src/sockaddr.c b/src/sockaddr.c
index b86ec5c..6ffc989 100644
--- a/src/sockaddr.c
+++ b/src/sockaddr.c
@@ -33,6 +33,38 @@ void sockaddr_make_ipv6(struct sockaddr_storage *sockaddr,
sockaddr_in6->sin6_scope_id = 0;
}
+in_port_t sockaddr_get_port(struct sockaddr_storage *sockaddr)
+{
+ if (!sockaddr)
+ die("%s(): sockaddr == NULL", __FUNCTION__);
+
+ switch (sockaddr->ss_family) {
+ case AF_INET:
+ return ((struct sockaddr_in *)sockaddr)->sin_port;
+ case AF_INET6:
+ return ((struct sockaddr_in6 *)sockaddr)->sin6_port;
+ default:
+ die("%s(): Unknown address family", __FUNCTION__);
+ }
+}
+
+void sockaddr_set_port(struct sockaddr_storage *sockaddr, in_port_t port)
+{
+ if (!sockaddr)
+ die("%s(): sockaddr == NULL", __FUNCTION__);
+
+ switch (sockaddr->ss_family) {
+ case AF_INET:
+ ((struct sockaddr_in *)sockaddr)->sin_port = port;
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)sockaddr)->sin6_port = port;
+ break;
+ default:
+ die("%s(): Unknown address family", __FUNCTION__);
+ }
+}
+
int sockaddr_is_equal(struct sockaddr_storage *addr1,
struct sockaddr_storage *addr2)
{
diff --git a/src/sockaddr.h b/src/sockaddr.h
index 83648c5..b9727e8 100644
--- a/src/sockaddr.h
+++ b/src/sockaddr.h
@@ -5,6 +5,8 @@ void sockaddr_make_ipv4(struct sockaddr_storage *sockaddr,
u_int32_t addr);
void sockaddr_make_ipv6(struct sockaddr_storage *sockaddr,
struct in6_addr *addr);
+in_port_t sockaddr_get_port(struct sockaddr_storage *sockaddr);
+void sockaddr_set_port(struct sockaddr_storage *sockaddr, in_port_t port);
int sockaddr_is_equal(struct sockaddr_storage *addr1,
struct sockaddr_storage *addr2);
void sockaddr_ntop(struct sockaddr_storage *addr, char *buf, size_t buflen);
diff --git a/src/tcptable.c b/src/tcptable.c
index 1167b10..6979505 100644
--- a/src/tcptable.c
+++ b/src/tcptable.c
@@ -51,8 +51,8 @@ static void setlabels(WINDOW *win, int mode)
* The hash function for the TCP hash table
*/
-static unsigned int tcp_hash(struct sockaddr_storage *saddr, unsigned int sport,
- struct sockaddr_storage *daddr, unsigned int dport,
+static unsigned int tcp_hash(struct sockaddr_storage *saddr,
+ struct sockaddr_storage *daddr,
char *ifname)
{
size_t i;
@@ -64,14 +64,14 @@ static unsigned int tcp_hash(struct sockaddr_storage *saddr, unsigned
int sport,
switch (saddr->ss_family) {
case AF_INET:
ifsum += 4 * ((struct sockaddr_in *)saddr)->sin_addr.s_addr;
- ifsum += 3 * sport;
+ ifsum += 3 * ((struct sockaddr_in *)saddr)->sin_port;
break;
case AF_INET6: {
unsigned int ip6sum = 0;
for (i = 0; i < 4; i++)
ip6sum ^= ((struct sockaddr_in6 *)saddr)->sin6_addr.s6_addr32[i];
ifsum += 4 * ip6sum;
- ifsum += 3 * sport;
+ ifsum += 3 * ((struct sockaddr_in6 *)saddr)->sin6_port;
break; }
default:
die("%s(): saddr: unknown address family", __FUNCTION__);
@@ -79,14 +79,14 @@ static unsigned int tcp_hash(struct sockaddr_storage *saddr, unsigned
int sport,
switch (daddr->ss_family) {
case AF_INET:
ifsum += 2 * ((struct sockaddr_in *)daddr)->sin_addr.s_addr;
- ifsum += dport;
+ ifsum += ((struct sockaddr_in *)daddr)->sin_port;
break;
case AF_INET6: {
unsigned int ip6sum = 0;
for (i = 0; i < 4; i++)
ip6sum ^= ((struct sockaddr_in6 *)daddr)->sin6_addr.s6_addr32[i];
ifsum += 2 * ip6sum;
- ifsum += dport;
+ ifsum += ((struct sockaddr_in6 *)daddr)->sin6_port;
break; }
default:
die("%s(): daddr: unknown address family", __FUNCTION__);
@@ -100,7 +100,6 @@ static void print_tcp_num_entries(struct tcptable *table)
table->count);
}
-
void init_tcp_table(struct tcptable *table)
{
int i;
@@ -160,8 +159,7 @@ static void add_tcp_hash_entry(struct tcptable *table, struct
tcptableent *entry
unsigned int hp; /* hash position in table */
struct tcp_hashentry *ptmp;
- hp = tcp_hash(&entry->saddr, entry->sport,
- &entry->daddr, entry->dport, entry->ifname);
+ hp = tcp_hash(&entry->saddr, &entry->daddr, entry->ifname);
ptmp = xmallocz(sizeof(struct tcp_hashentry));
/*
* Add backpointer from screen node to hash node for deletion later
@@ -228,7 +226,6 @@ static void del_tcp_hash_node(struct tcptable *table, struct
tcptableent *entry)
struct tcptableent *addentry(struct tcptable *table,
struct sockaddr_storage *saddr,
struct sockaddr_storage *daddr,
- unsigned int sport, unsigned int dport,
int protocol, char *ifname,
int *rev_lookup, int rvnfd, int servnames)
{
@@ -348,13 +345,6 @@ struct tcptableent *addentry(struct tcptable *table,
memset(new_entry->smacaddr, 0, sizeof(new_entry->smacaddr));
memset(new_entry->oth_connection->smacaddr, 0,
sizeof(new_entry->oth_connection->smacaddr));
- /*
- * Set raw port numbers
- */
-
- new_entry->sport = new_entry->oth_connection->dport = ntohs(sport);
- new_entry->dport = new_entry->oth_connection->sport = ntohs(dport);
-
new_entry->stat = new_entry->oth_connection->stat = 0;
new_entry->s_fstat =
@@ -365,12 +355,9 @@ struct tcptableent *addentry(struct tcptable *table,
revname(rev_lookup, &new_entry->daddr,
new_entry->d_fqdn, sizeof(new_entry->d_fqdn), rvnfd);
- /*
- * Set port service names (where applicable)
- */
-
- servlook(servnames, sport, IPPROTO_TCP, new_entry->s_sname, 10);
- servlook(servnames, dport, IPPROTO_TCP, new_entry->d_sname, 10);
+ /* set port service names (where applicable) */
+ servlook(servnames, sockaddr_get_port(saddr), IPPROTO_TCP, new_entry->s_sname, 10);
+ servlook(servnames, sockaddr_get_port(daddr), IPPROTO_TCP, new_entry->d_sname, 10);
strcpy(new_entry->oth_connection->s_sname, new_entry->d_sname);
strcpy(new_entry->oth_connection->d_sname, new_entry->s_sname);
@@ -502,7 +489,6 @@ void write_timeout_log(int logging, FILE * logfile, struct tcptableent
*tcpnode,
struct tcptableent *in_table(struct tcptable *table,
struct sockaddr_storage *saddr,
struct sockaddr_storage *daddr,
- unsigned int sport, unsigned int dport,
char *ifname, int logging,
FILE *logfile, struct OPTIONS *opts)
{
@@ -524,14 +510,12 @@ struct tcptableent *in_table(struct tcptable *table,
* Determine hash table index for this set of addresses and ports
*/
- hp = tcp_hash(saddr, sport, daddr, dport, ifname);
+ hp = tcp_hash(saddr, daddr, ifname);
hashptr = table->hash_table[hp];
while (hashptr != NULL) {
if (sockaddr_is_equal(&hashptr->tcpnode->saddr, saddr)
&& sockaddr_is_equal(&hashptr->tcpnode->daddr, daddr)
- && (hashptr->tcpnode->sport == sport)
- && (hashptr->tcpnode->dport == dport)
&& (strcmp(hashptr->tcpnode->ifname, ifname) == 0))
break;
diff --git a/src/tcptable.h b/src/tcptable.h
index cc2d0c0..5cfa746 100644
--- a/src/tcptable.h
+++ b/src/tcptable.h
@@ -28,8 +28,6 @@ struct tcptableent {
char d_fqdn[45];
int s_fstat;
int d_fstat;
- unsigned int sport;
- unsigned int dport;
char smacaddr[18];
char s_sname[11]; /* Service names, maxlen=10 */
char d_sname[11];
@@ -99,14 +97,12 @@ void init_tcp_table(struct tcptable *table);
struct tcptableent *addentry(struct tcptable *table,
struct sockaddr_storage *saddr,
struct sockaddr_storage *daddr,
- unsigned int sport, unsigned int dport,
int protocol, char *ifname,
int *rev_lookup, int rvnamedon, int servnames);
struct tcptableent *in_table(struct tcptable *table,
struct sockaddr_storage *saddr,
struct sockaddr_storage *daddr,
- unsigned int sport, unsigned int dport,
char *ifname, int logging,
FILE * logfile, struct OPTIONS *opts);
--
1.7.8.4