/* * Usurpataion --- client-server protocol interface. * * Copyright (C) 2019 Ramūnas Mažeikis * * This program 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; version 2.1 * of the License. * * This program 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 program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef PROTOCOL_H_INCLUDED #define PROTOCOL_H_INCLUDED #include #define E_TLV_OVERFLOW (1 << 0) #define E_UNKNOWN_TYPE (1 << 1) #define E_IVALID_DESCRIPTOR (1 << 2) /** * Regular packets contain tlv's defined by tlv_type. * * Hearbeat packet tell daemon that device is still alive and listening. * * Discovery packets are used for what they say. */ enum packet_type { REGURAL, HEARTBEAT, DISCOVERY }; /** * Message sequence number since beggining of sesssion. * * Mainly used for identifying lost messages. */ typedef unsigned int msg_idx_t; enum tlv_type { /** * NULL-terminated string. To be put in a queue to display on the * screen. */ TEXT, /** Fixed point. 1 decimal digit of precision. */ FPI1, /** Literally time_t */ TIMESTAMP, /** Represents a request for lost message. Data is unsigned integer * that uniquely identifies the message. */ REQUEST, /** * Response to request. Begins with unsigned integer that represents * which message is being repeated and the actual null-terminated * message after that. */ REPLY, /** * UUID that represents a particular device. */ UUID }; /** * Packet data itself is a special type of tlv. A packet is either regular, * hearbeat or discovery. * * May be used to send data. */ struct tlv_packet { enum packet_type type; size_t size; size_t offset; char *data; /* Bytes representing tlv's */ }; /** * Literally type-length-value * */ struct tlv { enum tlv_type type; size_t length; void *data; }; struct tlv_parser { char *data; size_t offset; size_t size; }; int get_tlv(struct tlv_parser *parser, struct tlv *ret); /** * Appends data to the next packet to be sent. Type of data is determined by * enum tlv_type. * */ int push_data(struct tlv_packet *packet, enum tlv_type type, char *data); void clear_data(struct tlv_packet *packet); size_t tlv_data_size(struct tlv_parser *parser); #endif /* PROTOCOL_H_INCLUDED */