/* $Id: ha_msg.h,v 1.24.2.2 2004/09/22 17:01:09 gshi Exp $ */ /* * Intracluster message object (struct ha_msg) * * Copyright (C) 1999, 2000 Alan Robertson * This software licensed under the GNU LGPL. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _HA_MSG_H # define _HA_MSG_H 1 #include #include #include #include #define HA_FAIL 0 #define HA_OK 1 enum cl_netstring_type{ FT_STRING, FT_BINARY, FT_STRUCT }; enum cl_msgfmt{ MSGFMT_NVPAIR, MSGFMT_NETSTRING, }; #define NEEDHEAD 1 #define NOHEAD 0 typedef struct hb_msg_stats_s { unsigned long totalmsgs; /* Total # of messages */ /* ever handled */ unsigned long allocmsgs; /* # Msgs currently allocated */ longclock_t lastmsg; }hb_msg_stats_t; struct ha_msg { int nfields; int nalloc; size_t stringlen; /* #bytes needed to convert this to a string * including the '\0' character at the end. */ size_t netstringlen; char ** names; int * nlens; void ** values; size_t* vlens; int * types; }; #define IFACE "!^!\n" #define MSG_START ">>>\n" #define MSG_END "<<<\n" #define MSG_START_NETSTRING "###\n" #define MSG_END_NETSTRING "%%%\n" #define EQUAL "=" #define MAXMSG 40000 /* Maximum string length for a message */ #define MAXDEPTH 10 /* Maximum recursive message depth */ /* Common field names for our messages */ #define F_TYPE "t" /* Message type */ #define F_SUBTYPE "subt" /* Message type */ #define F_ORIG "src" /* Real Originator */ #define F_NODE "node" /* Node being described */ #define F_TO "dest" /* Destination (optional) */ #define F_STATUS "st" /* New status (type = status) */ #define F_CLIENTNAME "cn" /* Client name */ #define F_CLIENTSTATUS "cs" /* Client status */ #define F_TIME "ts" /* Timestamp */ #define F_SEQ "seq" /* Sequence number */ #define F_LOAD "ld" /* Load average */ #define F_COMMENT "info" /* Comment */ #define F_TTL "ttl" /* Time To Live */ #define F_AUTH "auth" /* Authentication string */ #define F_HBGENERATION "hg" /* Heartbeat generation number */ #define F_FIRSTSEQ "firstseq" /* Lowest seq # to retransmit */ #define F_LASTSEQ "lastseq" /* Highest seq # to retransmit */ #define F_RESOURCES "rsc_hold" /* What resources do we hold? */ #define F_FROMID "from_id" /* from Client id */ #define F_TOID "to_id" /* To client id */ #define F_PID "pid" /* PID of client */ #define F_UID "uid" /* uid of client */ #define F_GID "gid" /* gid of client */ #define F_ISSTABLE "isstable" /* true/false for RESOURCES */ #define F_APIREQ "reqtype" /* API request type for "hbapi" */ #define F_APIRESULT "result" /* API request result code */ #define F_IFNAME "ifname" /* Interface name */ #define F_PNAME "pname" /* Parameter name */ #define F_PVALUE "pvalue" /* Parameter name */ #define F_DEADTIME "deadtime" /* Dead time interval in ms. */ #define F_KEEPALIVE "keepalive" /* Keep alive time interval in ms. */ #define F_LOGFACILITY "logfacility" /* Suggested cluster syslog facility */ #define F_NODETYPE "nodetype" /* Type of node */ #define F_RTYPE "rtype" /* Resource type */ #define F_ORDERSEQ "oseq" /* Order Sequence number */ /* Message types */ #define T_STATUS "status" /* Status (heartbeat) */ #define T_IFSTATUS "ifstat" /* Interface status */ #define T_ASKRESOURCES "ask_resources" /* Let other node ask my resources */ #define T_ASKRELEASE "ip-request" /* Please give up these resources... */ #define T_ACKRELEASE "ip-request-resp"/* Resources given up... */ #define T_QCSTATUS "query-cstatus" /* Query client status */ #define T_RCSTATUS "respond-cstatus"/* Respond client status */ #define T_STONITH "stonith" /* Stonith return code */ #define T_SHUTDONE "shutdone" /* External Shutdown complete */ #define T_APIREQ "hbapi-req" /* Heartbeat API request */ #define T_APIRESP "hbapi-resp" /* Heartbeat API response */ #define T_APICLISTAT "hbapi-clstat" /* Client status notification" */ #define NOSEQ_PREFIX "NS_" /* PREFIX: Give no sequence number */ /* Used for messages which can't be retransmitted */ /* Either they're protocol messages or from dumb (ping) endpoints */ #define T_REXMIT NOSEQ_PREFIX "rexmit" /* Rexmit request */ #define T_NAKREXMIT NOSEQ_PREFIX "nak_rexmit" /* NAK Rexmit request */ #define T_NS_STATUS NOSEQ_PREFIX "st" /* ping status */ /* Messages associated with nice_failback */ #define T_STARTING "starting" /* Starting Heartbeat */ /* (requesting resource report) */ #define T_RESOURCES "resource" /* Resources report */ /* Messages associated with stonith completion results */ #define T_STONITH_OK "OK" /* stonith completed successfully */ #define T_STONITH_BADHOST "badhost" /* stonith failed */ #define T_STONITH_BAD "bad" /* stonith failed */ #define T_STONITH_NOTCONFGD "n_stnth" /* no stonith device configured */ #define T_STONITH_UNNEEDED "unneeded" /* STONITH not required */ /* Set up message statistics area */ void cl_msg_setstats(volatile hb_msg_stats_t* stats); /* Allocate new (empty) message */ struct ha_msg * ha_msg_new(int nfields); /* Free message */ void ha_msg_del(struct ha_msg *msg); /* Copy message */ struct ha_msg* ha_msg_copy(const struct ha_msg *msg); /*Add a null-terminated name and binary value to a message*/ int ha_msg_addbin(struct ha_msg * msg, const char * name, const void * value, size_t vallen); /* Add null-terminated name and a value to the message */ int ha_msg_add(struct ha_msg * msg , const char* name, const char* value); int cl_msg_modstring(struct ha_msg * msg, const char* name, const char* value); int cl_msg_modbin(struct ha_msg * msg, const char* name, const void* value, size_t vlen); int cl_msg_modstruct(struct ha_msg * msg, const char* name, const struct ha_msg* value); #define ha_msg_mod(msg, name, value) cl_msg_modstring(msg, name, value) /* Add name, value (with known lengths) to the message */ int ha_msg_nadd(struct ha_msg * msg, const char * name, int namelen , const char * value, int vallen); /* Add a name/value/type to a message (with sizes for name and value) */ int ha_msg_nadd_type(struct ha_msg * msg, const char * name, int namelen , const char * value, int vallen, int type); /* Add name=value string to a message */ int ha_msg_add_nv(struct ha_msg* msg, const char * nvline, const char * bufmax); /* Return value associated with particular name */ #define ha_msg_value(m,name) cl_get_string(m, name) /* Reads an IPC stream -- converts it into a message */ struct ha_msg * msgfromIPC(IPC_Channel * f); IPC_Message * ipcmsgfromIPC(IPC_Channel * ch); /* Reads a stream -- converts it into a message */ struct ha_msg * msgfromstream(FILE * f); /* Reads a stream with string format--converts it into a message */ struct ha_msg * msgfromstream_string(FILE * f); /* Reads a stream with netstring format--converts it into a message */ struct ha_msg * msgfromstream_netstring(FILE * f); /* Same as above plus copying the iface name to "iface" */ struct ha_msg * if_msgfromstream(FILE * f, char *iface); /* Writes a message into a stream */ int msg2stream(struct ha_msg* m, FILE * f); /* Converts a message into a string and adds the iface name on start */ char * msg2if_string(const struct ha_msg *m, const char * iface); /* Converts a string gotten via UDP into a message */ struct ha_msg * string2msg(const char * s, size_t length); /* Converts a message into a string */ char * msg2string(const struct ha_msg *m); /* Converts a message into a string in the provided buffer with certain depth and with or without start/end */ int msg2string_buf(const struct ha_msg *m, char* buf, size_t len, int depth, int needhead); /* Converts a message into wire format */ char* msg2wirefmt(const struct ha_msg *m, size_t* ); /* Converts wire format data into a message */ struct ha_msg* wirefmt2msg(const char* s, size_t length); /* Convets wire format data into an IPC message */ IPC_Message* wirefmt2ipcmsg(void* p, size_t len, IPC_Channel* ch); /* Converts an ha_msg into an IPC message */ IPC_Message* hamsg2ipcmsg(struct ha_msg* m, IPC_Channel* ch); /* Converts an IPC message into an ha_msg */ struct ha_msg* ipcmsg2hamsg(IPC_Message*m); /* Outputs a message to an IPC channel */ int msg2ipcchan(struct ha_msg*m, IPC_Channel*ch); /* Outpus a message to an IPC channel without authencating the message */ struct ha_msg* msgfromIPC_noauth(IPC_Channel * ch); /* Reads from control fifo, and creates a new message from it */ /* This adds the default sequence#, load avg, etc. to the message */ struct ha_msg * controlfifo2msg(FILE * f); /* Check if the message is authenticated */ gboolean isauthentic(const struct ha_msg * msg); /* Get the required string length for the given message */ int get_stringlen(const struct ha_msg *m, int depth); /* Get the requried netstring length for the given message*/ int get_netstringlen(const struct ha_msg *m, int depth); /* Add a child message to a message as a field */ int ha_msg_addstruct(struct ha_msg * msg, const char * name, void* ptr); /* Get binary data from a message */ const void * cl_get_binary(const struct ha_msg *msg, const char * name, size_t * vallen); /* Get string data from a message */ const char * cl_get_string(const struct ha_msg *msg, const char *name); /* Get the type for a field from a message */ int cl_get_type(const struct ha_msg *msg, const char *name); /* Get a child message from a message*/ struct ha_msg *cl_get_struct(const struct ha_msg *msg, const char* name); /* Log the contents of a message */ void cl_log_message (const struct ha_msg *m); /* Supply messaging system with old style authentication/authorization method */ void cl_set_oldmsgauthfunc(gboolean (*authfunc)(const struct ha_msg*)); /* Set default messaging format */ void cl_set_msg_format(enum cl_msgfmt mfmt); #endif /* __HA_MSG_H */