Annotation of fwsync/driver/fwsync_utils.c, revision 1.2
1.1 misho 1: /*************************************************************************
2: * (C) 2022 CloudSigma AG - Sofia/Bulgaria
3: * by Michael Pounov <misho@elwix.org>
4: **************************************************************************/
5: #include "fwsync.h"
6:
7:
1.2 ! misho 8: #ifndef IPFIREWALL_JENKINSHASH
! 9: __inline uint32_t
! 10: fwsync_hash_packet(const struct ipfw_flow_id *id)
! 11: {
! 12: uint32_t i;
! 13:
! 14: #ifdef INET6
! 15: if (IS_IP6_FLOW_ID(id))
! 16: i = ntohl((id->dst_ip6.__u6_addr.__u6_addr32[2]) ^
! 17: (id->dst_ip6.__u6_addr.__u6_addr32[3]) ^
! 18: (id->src_ip6.__u6_addr.__u6_addr32[2]) ^
! 19: (id->src_ip6.__u6_addr.__u6_addr32[3]));
! 20: else
! 21: #endif /* INET6 */
! 22: i = (id->dst_ip) ^ (id->src_ip);
! 23: i ^= (id->dst_port) ^ (id->src_port);
! 24: return (i);
! 25: }
! 26:
! 27: __inline uint32_t
! 28: fwsync_hash_parent(const struct ipfw_flow_id *id, const void *rule)
! 29: {
! 30:
! 31: return (fwsync_hash_packet(id) ^ ((uintptr_t)rule));
! 32: }
! 33:
! 34: #else /* IPFIREWALL_JENKINSHASH */
! 35:
! 36: VNET_DEFINE_STATIC(uint32_t, dyn_hashseed);
! 37: #define V_dyn_hashseed VNET(dyn_hashseed)
! 38:
! 39: static __inline int
! 40: addrcmp4(const struct ipfw_flow_id *id)
! 41: {
! 42:
! 43: if (id->src_ip < id->dst_ip)
! 44: return (0);
! 45: if (id->src_ip > id->dst_ip)
! 46: return (1);
! 47: if (id->src_port <= id->dst_port)
! 48: return (0);
! 49: return (1);
! 50: }
! 51:
! 52: #ifdef INET6
! 53: static __inline int
! 54: addrcmp6(const struct ipfw_flow_id *id)
! 55: {
! 56: int ret;
! 57:
! 58: ret = memcmp(&id->src_ip6, &id->dst_ip6, sizeof(struct in6_addr));
! 59: if (ret < 0)
! 60: return (0);
! 61: if (ret > 0)
! 62: return (1);
! 63: if (id->src_port <= id->dst_port)
! 64: return (0);
! 65: return (1);
! 66: }
! 67:
! 68: __inline uint32_t
! 69: fwsync_hash_packet6(const struct ipfw_flow_id *id)
! 70: {
! 71: struct tuple6 {
! 72: struct in6_addr addr[2];
! 73: uint16_t port[2];
! 74: } t6;
! 75:
! 76: if (addrcmp6(id) == 0) {
! 77: t6.addr[0] = id->src_ip6;
! 78: t6.addr[1] = id->dst_ip6;
! 79: t6.port[0] = id->src_port;
! 80: t6.port[1] = id->dst_port;
! 81: } else {
! 82: t6.addr[0] = id->dst_ip6;
! 83: t6.addr[1] = id->src_ip6;
! 84: t6.port[0] = id->dst_port;
! 85: t6.port[1] = id->src_port;
! 86: }
! 87: return (jenkins_hash32((const uint32_t *)&t6,
! 88: sizeof(t6) / sizeof(uint32_t), V_dyn_hashseed));
! 89: }
! 90: #endif
! 91:
! 92: __inline uint32_t
! 93: fwsync_hash_packet(const struct ipfw_flow_id *id)
! 94: {
! 95: struct tuple4 {
! 96: in_addr_t addr[2];
! 97: uint16_t port[2];
! 98: } t4;
! 99:
! 100: if (IS_IP4_FLOW_ID(id)) {
! 101: /* All fields are in host byte order */
! 102: if (addrcmp4(id) == 0) {
! 103: t4.addr[0] = id->src_ip;
! 104: t4.addr[1] = id->dst_ip;
! 105: t4.port[0] = id->src_port;
! 106: t4.port[1] = id->dst_port;
! 107: } else {
! 108: t4.addr[0] = id->dst_ip;
! 109: t4.addr[1] = id->src_ip;
! 110: t4.port[0] = id->dst_port;
! 111: t4.port[1] = id->src_port;
! 112: }
! 113: return (jenkins_hash32((const uint32_t *)&t4,
! 114: sizeof(t4) / sizeof(uint32_t), V_dyn_hashseed));
! 115: } else
! 116: #ifdef INET6
! 117: if (IS_IP6_FLOW_ID(id))
! 118: return (fwsync_hash_packet6(id));
! 119: #endif
! 120: return (0);
! 121: }
! 122:
! 123: __inline uint32_t
! 124: fwsync_hash_parent(const struct ipfw_flow_id *id, const void *rule)
! 125: {
! 126:
! 127: return (jenkins_hash32((const uint32_t *)&rule,
! 128: sizeof(rule) / sizeof(uint32_t), fwsync_hash_packet(id)));
! 129: }
! 130: #endif /* IPFIREWALL_JENKINSHASH */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>