/****************************************************************************
                socket  통신 관련 protocol 정의
                -----------------------------------------

    begin      : 2015/05/15
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
    email      : huibong@solbox.com
    version    : 3.5

    CopyRight(C) 2005 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
*****************************************************************************/

#ifndef __PROTOCOL_DEFINE_H__
#define __PROTOCOL_DEFINE_H__

#include "ShmDefine.h"


// Packet Header stx 코드
#define HEADER_STX_CODE					0x05

// Packet Header type 구분코드
#define HEADER_TYPE_REQUEST				0x00
#define HEADER_TYPE_RESPONSE			0x01


// Packet Header command 구분 코드.
#define COMMAND_TRANSFER_SYSTEM         0x01   // system 수집 정보 전송.
#define COMMAND_TRANSFER_SERVICE        0x02   // service 상태 check 정보 전송.

// 기타 정보
#define LENGTH_FIELD_SIZE				4		// 가변데이터 형식 사용시 Length 필드의 메모리 크기 (unsigned int)


// RCTS rc_mond 와 통신시 사용할 통신 Header
// - 계산상 크기는 16Byte 이지만...
// - 통신상 sizeof() : 20Byte ( 64Bit OS )
struct PacketHeader {

	char stx;					// Packet 유효성 관리 코드
	char type;					// Request or Response 여부 ( 0x00: Request, 0x01: Response )
	char command[4];			// Command Code ( 4 Byte) : 0th csagent-rc_mond 만 사용.
	char result[4];				// Result Code  ( 4 Byte )
	unsigned int data_length;   // Packet Data 부분의 길이값 ( Network Byte Order 사용)
	
	// 2015-05-15 huibong
	// Protocol version 정보 추가로 인해... extend_code 2Byte 중 1Byte 사용.
	//char extend_code[2];		// 확장 및 Padding bits ( 2 Byte )

	char protocol_version;      // Packet Data 의 Protocol Version 정보. (1 Byte)
	char extend_code;		    // 확장 및 Padding bits ( 1 Byte )

};



////////////////////////////////////////////

// RC ID 최대 길이.
#define RC_ID_MAX_LENGTH  31



// RCTS rc_mond 로 전송할 system 수집 data 구조체 protocol version.
// - 최초 버전이므로 0x00 으로 설정.
#define PROTOCOL_VERSION_SYSTEM   0x00

// RCTS rc_mond 로 전송할 system 수집정보 data 구조체
// - 전송할 항목이 많아... struct 형식으로 전송 처리.
// - protocol version : 0x00
// - 공유메모리 SystemInfo 구조체를 사용하도록 처리할 수 있지만...
// -- 공유메모리 구조 변경시.. 통신 오류 발생 가능..
// -- 따라서 복잡하더라고.. 공유메모리 구조체와 통신 구조체를 별도로 분리 처리함.
struct PacketDataSystem {

	char   rcid[RC_ID_MAX_LENGTH+1];             // RCID 정보, 최대 31 자까지만 허용.
	char   hostname[HOST_NAME_MAX_LENGTH+1];     // hostname, key 값으로 사용, 최대 63자까지만 허용.

	double load_avg[3];                          // load average.

	uint64_t  memory_total;                      // Total memory size (byte 단위)
	uint64_t  memory_free;                       // Free  memory size (byte 단위)
	int       memory_usage;                      // memory 사용률 (%)

	uint64_t  swap_total;                        // Total swap size (byte 단위)
	uint64_t  swap_used;                         // Used  swap size (byte 단위)
	int       swap_usage;                        // swap 사용률 (%)

	uint64_t storage_total;                      // Total Storage size (byte 단위)
	uint64_t storage_avail;                      // Available Storage size (byte 단위)
	int      storage_max_usage;                  // Storage 중 최대 사용률 (%)
	
	uint64_t disk_max_queue;                     // Disk 상태 정보 중 Max Queue Length
	double   disk_max_busy;                      // Disk 상태 정보 중 Max busy(%)

	uint64_t network_packet_in;                  // Network inbound packet count (단위 시간내의 count)
	uint64_t network_packet_out;                 // Network outbound packet count (단위 시간내의 count)
	uint64_t network_traffic_in;                 // Network inbound 평균 traffic (Byte/sec)
	uint64_t network_traffic_out;                // Network outbound 평균 traffic (Byte/sec)

	unsigned int tcp_total;                      // TCP 세션 total count
	unsigned int tcp_80;                         // TCP 세션 중 local 80 port 를 사용하는 세션 count
	unsigned int tcp_80_establish;               // TCP 세션 중 local 80 port 를 사용하고.. ESTABLISH 상태인 세션 count

};


// RCTS rc_mond 로 전송할 service 상태 data 구조체 protocol version.
// - 최초 버전이므로 0x00 으로 설정.
#define PROTOCOL_VERSION_SERVICE   0x00

// RCTS rc_mond 로 전송할 service 상태 data 구조체
// - protocol version : 0x00
struct PacketDataService {

	char   rcid[RC_ID_MAX_LENGTH+1];          // RCID 정보, 최대 31 자까지만 허용.
	char   hostname[HOST_NAME_MAX_LENGTH+1];  // hostname, key 값으로 사용, 최대 63자까지만 허용.

	int    service_stat;      // Service 상태 정보, ShmDefine.h 정의 참고.
	int    storage_max_usage; // Storage 최대 사용률(%), ShmDefine.h 정의 참고.
};


#endif /* __PROTOCOL_DEFINE_H__ */

