#ifndef __COMMON_H
#define __COMMON_H

#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/socket.h>

#include "lnxall_list.h"
#include "mqtt_session.h"
#include "dy_utils/dy_common.h"

#define MAXEPOLLSIZE 10000
#define LISTEN_BACKLOG 10

#define HASH_SIZE 1024

#define FRONT_CFG "/app/config/socket_mqtt.json"

#define NAPI_QUEUE_LEN 64
#define WAIT_TIME_SECONDS 1
#define CONNECT_CHECK_INTERVAL 3 //网络连接检查间隔，秒为单位
#define MAX_MQTT_CHANNEL_CNT 8

#define FRONT_LOG "/app/socket_mqtt.log"

static inline int socket_hash(int socket)
{
    return socket & (HASH_SIZE - 1);
}

static inline int hash_string(const char *s)
{
    unsigned long h = 0;
    for (; *s; ++s)
        h = 5 * h + *s;
    return h & (HASH_SIZE - 1);
}

typedef struct socket_data_node_s
{
    struct list_head list;
    int socket; // 本机socket
    uint16_t payload_len;
    uint8_t payload[0];
} socket_data_node_t;

typedef struct socket_mqtt_var_s
{
    int mqtt_cnt;
    mqtt_session_t *mqtt[MAX_MQTT_CHANNEL_CNT]; // MQTT session, used to forward the TCP/UDP socket data to broker
    char sn_str[SN_MAX_LEN];
    int tcp_port;
    int udp_port;
    struct list_head socket_rcv_head;
    pthread_rwlock_t sock_sess_lock;
    pthread_mutex_t socket_data_lock;
    pthread_cond_t socket_recv_cond;
    int socket_received;
} socket_mqtt_var_t;

extern socket_mqtt_var_t socket_mqtt_var;
extern void *start_tcp_server(void *param);
extern void *mqtt_forward_loop(void *param);
extern void *socket_forward_loop(void *param);
extern int mqtt_init(socket_mqtt_var_t *var);
extern ssize_t socket_send(int sockfd, const char *buffer, size_t buflen);

#endif
