/****************************************************************************
                GMS 와의 통신 관련 protocol 정의
                -----------------------------------------

    begin      : 2015/07/07
    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_GMS_H__
#define __PROTOCOL_GMS_H__

#include <unistd.h>
#include <sys/types.h>
#include <stdint.h>


// GMS 로 전송시 Header 의 ulmode 값
#define GMS_MSG_MODE_VRCD_STATUSD_RTS_STATUS    0x0a01

// GMS 로 전송시 Header 의 ulResult 값
#define GMS_OK_ALL_PASSED                       0x1000


// GMS 로 Data 전송 관련 Header 구조체..
// 본 Header 의 크기는 32bit, 64Bit OS 모두 동일하게 320 Byte 임.
struct PacketHeaderGms {

	char		szTransactionID[52];
	uint32_t	ulMode;               // Network Byte Order
	char		szIssuer[128];
	char		szServiceID[128];
	uint32_t	ulResult;             // Network Byte Order
	uint32_t	ulBodyLength;         // Network Byte Order
};



// GMS 로 전달할 각 장비의 상태 정보를 저장하기 위한 구조체...
// - GMS 장비가 64 Bit 인 경우에만 사용. ( 32Bit 는 현재 사용하지 않지만.. GMS 가 32Bit 인 경우.. time_t 형 size 문제로 통신 오류 발생함. )
struct PacketDataGms {

	time_t      stamp;                  // stamp 값은 broadcast 를 수신한 시간정보 값임.
	                                    // GMS 가 64Bit 장비인 경우  time_t 의 size 가 8 Byte, 만약 GMS 장비가 32 Bit 인 경우.. time_t 의 size 가 4Byte 이므로...
										// 아래 코드를 사용할 것
										// #pragma pack(4)
										// int stamp;
										// #pragma pack()

	char		domain[512];			// vmasd.conf에 설정된 SERVER_NAME=sb-01-fhs001.solbox.com 정보 사용
	                                    // 해당 정보는 FHS 패키징 설치시 hostname 정보를 추출하여 자동 설정 처리하므로..
										// hostname 정보와 동일하다.

	uint64_t	total;					// 저장 경로로 지정된 Mount 의 총 Disk Size ( 각 mount statfs 의 f_blocks * f_bsize 합산 결과 )
	uint64_t	free;					// 저장 경로로 지정된 Mount 의 총 Disk Free Size ( 각 mount statfs 의 f_blocks * f_bavail 합산 결과 )
										// 본 total, free 값은 /stg/node0.disable 설정에는 영향받지 않음.

	int			manual_disable;			// 2 : fsck_ufs 프로세스가 동작 중인 경우.. 
										// 1 : /user/service/vmasd.disable 파일이 존재할 경우..
										//     .disable 설정이 되지 않은 유효 Mount 중.. 가장 큰 Free Disk 용량(f_bfree) 이 0 인 경우...
										// 0 : 그 외..

	int			upload_level;			// 본 구조체 항목 중 (disk_backlog/10) + (connection_established/50) 의 계산 값... ( vmasd 소스 참고)

	int			disk_backlog;			// 저장 경로 Mount 들의 Disk Queue 평균 대기 transaction 수 
										// 세부 내역은 devstat_compute_statistics 의 DSM_QUEUE_LENGTH 참고
										
	int			disk_percent;			// 저장 경로 Mount 들의 평균 Busy 율 ( devstat_compute_statistics 의 DSM_BUSY_PCT 참고 )

	int			connection_established;	// TCP 80 Port 에 연결된 세션 수..
	int			connection_total;		// TCP 80 전체 세션 수.

	uint32_t	traffic_ip;				// 평균 inbound packet count
	uint32_t	traffic_ib;				// 평균 inbound traffic ( byte/s )
	uint32_t	traffic_op;				// 평균 outbound packet count
	uint32_t	traffic_ob;				// 평균 outbound traffic ( byte/s )

	char		hostname[64];			// 장비 hostname (gethostname 함수로 추출)
										// domain[512] 와 동일 data 임.
										// 만약 domain 정보와 hostname 정보가 다른 경우는 패키징 설치 후 장비 hostname 을 임의로 변경한 경우임.

};


#endif /* __PROTOCOL_GMS_H__ */
