3 * IPv4 address class. They understand how to take netmasks into consideration
4 * during equivalence testing.
6 * Gilbert Ramirez <gram@xiexie.org>
8 * $Id: ipv4.c,v 1.5 2000/01/07 22:05:28 guy Exp $
10 * Ethereal - Network traffic analyzer
11 * By Gerald Combs <gerald@zing.org>
12 * Copyright 1998 Gerald Combs
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
37 #ifdef HAVE_SYS_TYPES_H
38 # include <sys/types.h>
41 #ifdef HAVE_NETINET_IN_H
42 # include <netinet/in.h>
46 #include "packet.h" /* for ip_to_str */
48 static guint32 create_nmask(gint net_bits);
55 ipv4 = g_new(ipv4_addr, 1);
60 ipv4_addr_free(ipv4_addr *ipv4)
67 ipv4_addr_set_host_order_addr(ipv4_addr *ipv4, guint32 new_addr)
69 ipv4->addr = new_addr;
73 ipv4_addr_set_net_order_addr(ipv4_addr *ipv4, guint32 new_addr)
75 ipv4->addr = ntohl(new_addr);
79 ipv4_addr_set_netmask_bits(ipv4_addr *ipv4, guint new_nmask_bits)
81 /* ipv4->nmask_bits = new_nmask_bits;*/
82 ipv4->nmask = create_nmask(new_nmask_bits);
86 ipv4_get_net_order_addr(ipv4_addr *ipv4)
88 return htonl(ipv4->addr);
92 ipv4_get_host_order_addr(ipv4_addr *ipv4)
98 ipv4_addr_str(ipv4_addr *ipv4)
100 guint32 ipv4_host_order = htonl(ipv4->addr);
101 return ip_to_str((gchar*)&ipv4_host_order);
105 create_nmask(gint net_bits)
107 static guint32 bitmasks[33] = {
109 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
110 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
111 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000,
112 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000,
113 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000,
114 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00,
115 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0,
116 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff,
119 g_assert(net_bits <= 32);
121 return bitmasks[net_bits];
127 * w.x.y.z/32 eq w.x.y.0/24 TRUE
130 /* Returns TRUE if equal, FALSE if not */
132 ipv4_addr_eq(ipv4_addr *a, ipv4_addr *b)
134 guint32 val_a, val_b, nmask;
136 nmask = MIN(a->nmask, b->nmask);
137 val_a = a->addr & nmask;
138 val_b = b->addr & nmask;
139 return (val_a == val_b);
143 ipv4_addr_gt(ipv4_addr *a, ipv4_addr *b)
145 guint32 val_a, val_b, nmask;
147 nmask = MIN(a->nmask, b->nmask);
148 val_a = a->addr & nmask;
149 val_b = b->addr & nmask;
151 return (val_a > val_b);
155 ipv4_addr_ge(ipv4_addr *a, ipv4_addr *b)
157 guint32 val_a, val_b, nmask;
159 nmask = MIN(a->nmask, b->nmask);
160 val_a = a->addr & nmask;
161 val_b = b->addr & nmask;
163 return (val_a >= val_b);
167 ipv4_addr_lt(ipv4_addr *a, ipv4_addr *b)
169 guint32 val_a, val_b, nmask;
171 nmask = MIN(a->nmask, b->nmask);
172 val_a = a->addr & nmask;
173 val_b = b->addr & nmask;
175 return (val_a < val_b);
179 ipv4_addr_le(ipv4_addr *a, ipv4_addr *b)
181 guint32 val_a, val_b, nmask;
183 nmask = MIN(a->nmask, b->nmask);
184 val_a = a->addr & nmask;
185 val_b = b->addr & nmask;
187 return (val_a <= val_b);