/****************************************************************************
                opendav-listener service stats message header for rc_sscd 
                -----------------------------------------

    begin      : 2015/08/26
    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_OPENDAV_LISTENER_H__
#define __PROTOCOL_OPENDAV_LISTENER_H__

#include <unistd.h>
#include <stdint.h>


// 본 Header 파일은 FHS 의 opendav listener가 UDP 13108 port로 전송하는 서비스 통계 관련 Protocol 을 정의하기 위한 header 이다.
// 본 Protocol 형식이 향후 변경될 수 있으므로.. 다음과 같이 특정하여 처리한다.
// sizeof( struct opendav_message_header ) => 352 (64Bit OS)

struct opendav_message_header {

	char		szTransactionID[52];	// 20131029180001-20f8b8d9f4-138303720-660114157 ( 세션 ID 정보 )
	uint32_t	ulMode;					// 0x0110 (MODE 정보, network byte odrer )
	char		szIssuer[128];			// bd-16-fhs003.ktsh.co.kr (장비명)
	char		szServiceID[128];		// 348.0@207
	char		szRCID[32];				// bd16 (RC ID)
	uint32_t	ulResult;				// 4096 (처리결과, network byte odrer)
	uint32_t	ulBodyLength;			// 276 (int + Body Size , network byte odrer)
};

// opendav-listener 가 전송한 메시지 중....
// opendav_message_header 구조체에서 ntohl(ulMode) == MSG_MODE_OPENDAV_RCSTAT_NETSTAT 정보만 처리한다.
#define MSG_MODE_OPENDAV_RCSTAT_NETSTAT    0x0110

// 위의 Header 다음에 4 Byte int 값이 온다... 
// 해당 값은 opendav-listener 가 보내는 서비스의 index 순서 정보를 기록하는 값으로써...
// n 번째 data 라는 의미임.
// - 해당 패킷에 n 개의 data 가 저장된다는 의미는 아니며...
// - 1개 패킷에는 무조건 1개 정보만 저장하여 전송 처리함.
// 해당 값은 Network byte order 아님.

// 이후 아래와 같이 body 가 나타난다. ( rc_statd(3.4 이전) 의 protocol_local.h 참고 )
// 아래 구조체의 각 항목 중 배열 첨자가 나타내는 것은. 다음을 의미 ( opendav 의 share.h 확인 내역 )
// #define OUTB      0  => FHS 에서 송신
// #define INB       1  => FHS 에서 수신


// 서비스 세션 통계 정보 저장 구조체...
// sizeof( struct service_stat ) => 56 (64Bit OS)
// 각 항목에 대한 정보는 opendav 상의 구현 코드를 바탕으로 분석한 내용임.
struct service_stat {

	uint32_t    success[2];               // 2nd: 각 요청에 대해 HTTP 200 ~ 399 응답이 발생한 횟수.
	uint32_t    fail_not_auth[2];         // 3rd: 각 요청에 대해 HTTP 401 응답 발생 횟수
	uint32_t    fail_illegal_request[2];  // 5th: HTTP 404 응답 외 요청에 대한 횟수.
	uint32_t    fail_timeout[2];          // 4th: keepalive 관련 timeout 발생 횟수.
	uint32_t    fail_disconnected[2];     // 1st: 각 요청에 대해 Connection 이 aborted 된 횟수..

	uint32_t    concurrent[2];            // 각 요청에 의해 발생된 최대 동시 세션 수
	uint32_t    saved_concurrent[2];      // 각 요청에 대한 현재 동시 세션 수
	                                      // 기존 cc_statd 확인 결과 본 값은 CCDB 에 저장하지 않음.

};


// 네트워크 통계 정보 저장 구조체...
// sizeof( struct network_stat ) => 48 (64Bit OS)
// 각 항목에 대한 정보는 opendav 상의 구현 코드를 바탕으로 분석한 내용임.
// #define CONTENT_TO_TRAFFIC(s)  ((int)(s * 1.1))
struct network_stat {

	uint64_t    traffic[2];               // 아래 content 항목이 의미하는 실제 송수신된 Content Size 정보에..
	                                      // CONTENT_TO_TRAFFIC 매크로를 사용하여 1.1 을 곱해...
										  // 전송된 Hader 포함 패킷량을 Byte 단위로 나타냄.

	uint64_t    content[2];               // 송수신한 Content 의 Size 정보 (Byte 단위)

	uint64_t    tc_traffic[2];            // 실제 네트워크 전송량에 1.1 곱한 값의 의미로 사용하려 한 듯하나...
                                          // 0으로 표시되며 실제 opendav 에서  무조건 0 으로 설정함.
										  // 따라서 해당 값은 미사용.

};

// 서비스 통계 정보 저장 구조체... Body 부분
// sizeof( opendav_message_body ) => 272 (64Bit OS)
struct opendav_message_body {

	char		szServiceID[128];         // 348.0@207
	char		szRCID[32];               // 사용 안함 (값 없음)
	uint32_t	timestamp;                // 4610133
	uint32_t	__temp;                   // 의미 없는 dummy 코드임.

	struct service_stat sst;
	struct network_stat nst;

};

#endif /* __PROTOCOL_OPENDAV_LISTENER_H__ */
