/** Check if \a x is an integer power of 2. */
#define IS_POW2(x) (!(bool)((x) & ((x)-1)))
+/** Check if \a x is aligned to \a byte_count bytes */
+#define IS_ALIGNED(x, byte_count) ((uintptr_t)(const void *)(x) % (byte_count) == 0)
+
/** Calculate a compile-time log2 for a uint8_t */
#define UINT8_LOG2(x) \
((x) < 2 ? 0 : \
/** \} */ //defgroup macros
+
+/**
+ * Macro to unpack the ip addres from lwip format in 4 int
+ * \param addr is struct ip_addr ip_addr;
+ * \return for int variable separated from comma
+ *
+ * \code
+ * //Upack into 4 int the lwip ip address
+ * LOG_INFO("dhcp ok: ip = %d.%d.%d.%d\n", IP_ADDR_TO_INT_TUPLE(netif.ip_addr.addr));
+ * \endcode
+ */
+#define IP_ADDR_TO_INT_TUPLE(addr) \
+ (int)((addr) >> 0 & 0xff), \
+ (int)((addr) >> 8 & 0xff), \
+ (int)((addr) >> 16 & 0xff), \
+ (int)((addr) >> 24 & 0xff)
+
#endif /* MACROS_H */