3 * IPv4 address class. They understand how to take netmasks into consideration
4 * during equivalence testing.
6 * Gilbert Ramirez <gram@alumni.rice.edu>
8 * $Id: ipv4.c,v 1.4 2002/08/28 20:40:44 jmayer 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.
38 #include "packet.h" /* for ip_to_str */
40 static guint32 create_nmask(gint net_bits);
47 ipv4 = g_new(ipv4_addr, 1);
52 ipv4_addr_free(ipv4_addr *ipv4)
59 ipv4_addr_set_host_order_addr(ipv4_addr *ipv4, guint32 new_addr)
61 ipv4->addr = new_addr;
65 ipv4_addr_set_net_order_addr(ipv4_addr *ipv4, guint32 new_addr)
67 ipv4->addr = g_ntohl(new_addr);
71 ipv4_addr_set_netmask_bits(ipv4_addr *ipv4, guint new_nmask_bits)
73 /* ipv4->nmask_bits = new_nmask_bits;*/
74 ipv4->nmask = create_nmask(new_nmask_bits);
78 ipv4_get_net_order_addr(ipv4_addr *ipv4)
80 return g_htonl(ipv4->addr);
84 ipv4_get_host_order_addr(ipv4_addr *ipv4)
90 ipv4_addr_str(ipv4_addr *ipv4)
92 guint32 ipv4_host_order = g_htonl(ipv4->addr);
93 return ip_to_str((gchar*)&ipv4_host_order);
97 create_nmask(gint net_bits)
99 static guint32 bitmasks[33] = {
101 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
102 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
103 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000,
104 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000,
105 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000,
106 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00,
107 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0,
108 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff,
111 g_assert(net_bits <= 32);
113 return bitmasks[net_bits];
119 * w.x.y.z/32 eq w.x.y.0/24 TRUE
122 /* Returns TRUE if equal, FALSE if not */
124 ipv4_addr_eq(ipv4_addr *a, ipv4_addr *b)
126 guint32 val_a, val_b, nmask;
128 nmask = MIN(a->nmask, b->nmask);
129 val_a = a->addr & nmask;
130 val_b = b->addr & nmask;
131 return (val_a == val_b);
135 ipv4_addr_gt(ipv4_addr *a, ipv4_addr *b)
137 guint32 val_a, val_b, nmask;
139 nmask = MIN(a->nmask, b->nmask);
140 val_a = a->addr & nmask;
141 val_b = b->addr & nmask;
143 return (val_a > val_b);
147 ipv4_addr_ge(ipv4_addr *a, ipv4_addr *b)
149 guint32 val_a, val_b, nmask;
151 nmask = MIN(a->nmask, b->nmask);
152 val_a = a->addr & nmask;
153 val_b = b->addr & nmask;
155 return (val_a >= val_b);
159 ipv4_addr_lt(ipv4_addr *a, ipv4_addr *b)
161 guint32 val_a, val_b, nmask;
163 nmask = MIN(a->nmask, b->nmask);
164 val_a = a->addr & nmask;
165 val_b = b->addr & nmask;
167 return (val_a < val_b);
171 ipv4_addr_le(ipv4_addr *a, ipv4_addr *b)
173 guint32 val_a, val_b, nmask;
175 nmask = MIN(a->nmask, b->nmask);
176 val_a = a->addr & nmask;
177 val_b = b->addr & nmask;
179 return (val_a <= val_b);