union iaddr {
struct sockaddr sa;
struct sockaddr_in sin;
+#ifdef CONFIG_IPV6
+ struct sockaddr_in6 sin6;
+#endif
};
#define ASSERT(x) do { if (!(x)) { fatal("assertion failed line %d file " \
/* List-manipulation functions */
extern list_t *list_new(void);
-extern int32_t list_length(list_t *a);
+extern int32_t list_length(const list_t *a);
extern list_t *list_append(list_t *a, item_t *i);
extern list_t *list_append_list(list_t *a, list_t *b);
/* Returns an item from the list (index starts at 0), or NULL */
struct comm_addr {
/* This struct is pure data; in particular comm's clients may
freely copy it. */
- /* Everyone is also guaranteed that all padding is set to zero, ie
- that comm_addrs referring to semantically identical peers will
- compare equal with memcmp. Anyone who constructs a comm_addr
- must start by memsetting it with FILLZERO, or some
- equivalent. */
struct comm_if *comm;
union iaddr ia;
+ int ix; /* see comment `Re comm_addr.ix' in udp.c */
};
/* Return True if the packet was processed, and shouldn't be passed to
comm_addr_to_string_fn *addr_to_string;
};
+bool_t iaddr_equal(const union iaddr *ia, const union iaddr *ib);
+
static inline const char *comm_addr_to_string(const struct comm_addr *ca)
{
return ca->comm->addr_to_string(ca->comm->st, ca);
}
+static inline bool_t comm_addr_equal(const struct comm_addr *a,
+ const struct comm_addr *b)
+{
+ return a->comm==b->comm && iaddr_equal(&a->ia,&b->ia);
+}
+
/* LOG interface */
#define LOG_MESSAGE_BUFLEN 1023
#define STRING(x) STRING2(x)
#define FILLZERO(obj) (memset(&(obj),0,sizeof((obj))))
+#define ARRAY_SIZE(ary) (sizeof((ary))/sizeof((ary)[0]))
/*
* void COPY_OBJ( OBJECT& dst, const OBJECT& src);