1 /* 2 * Copyright (c) 2010-2011, Red Hat, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND RED HAT, INC. DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 10 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RED HAT, INC. BE LIABLE 11 * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /* 18 * Author: Jan Friesse <jfriesse@redhat.com> 19 */ 20 21 #ifndef _TLV_H_ 22 #define _TLV_H_ 23 24 #include <sys/socket.h> 25 26 #include <netinet/in.h> 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /* 33 * Definitions 34 */ 35 36 /* 37 * Address families how defined by AIANA 38 */ 39 enum { 40 AF_IANA_IP = 1, 41 AF_IANA_IP6 = 2, 42 }; 43 44 /* 45 * TLV option type definition 46 */ 47 enum tlv_opt_type { 48 TLV_OPT_TYPE_VERSION = 0, 49 TLV_OPT_TYPE_CLIENT_ID = 1, 50 TLV_OPT_TYPE_SEQ_NUM = 2, 51 TLV_OPT_TYPE_CLIENT_TSTAMP = 3, 52 TLV_OPT_TYPE_MCAST_GRP = 4, 53 TLV_OPT_TYPE_OPT_REQUEST = 5, 54 TLV_OPT_TYPE_SERVER_INFO = 6, 55 /* 7 and 8 are reserved and copied only */ 56 TLV_OPT_TYPE_TTL = 9, 57 TLV_OPT_TYPE_MCAST_PREFIX = 10, 58 TLV_OPT_TYPE_SES_ID = 11, 59 TLV_OPT_TYPE_SERVER_TSTAMP = 12, 60 }; 61 62 /* 63 * tlv_iterator type 64 */ 65 struct tlv_iterator { 66 const char *msg; 67 size_t msg_len; 68 size_t pos; 69 }; 70 71 /* 72 * Functions 73 */ 74 extern int tlv_add(char *msg, size_t msg_len, size_t *pos, enum tlv_opt_type opt_type, 75 uint16_t opt_len, const void *value); 76 77 extern int tlv_add_client_tstamp(char *msg, size_t msg_len, size_t *pos); 78 79 extern int tlv_add_mcast_grp(char *msg, size_t msg_len, size_t *pos, 80 const struct sockaddr_storage *sas); 81 82 extern int tlv_add_mcast_prefix(char *msg, size_t msg_len, size_t *pos, 83 const struct sockaddr_storage *sas); 84 85 extern int tlv_add_opt_request(char *msg, size_t msg_len, size_t *pos, uint16_t *opts, 86 size_t opts_len); 87 88 extern int tlv_add_seq_num(char *msg, size_t msg_len, size_t *pos, uint32_t seq); 89 90 extern int tlv_add_server_info(char *msg, size_t msg_len, size_t *pos, 91 const char *server_info); 92 93 extern int tlv_add_server_tstamp(char *msg, size_t msg_len, size_t *pos); 94 95 extern int tlv_add_ttl(char *msg, size_t msg_len, size_t *pos, uint8_t ttl); 96 97 extern int tlv_add_version(char *msg, size_t msg_len, size_t *pos); 98 99 extern const char *tlv_iter_get_data(const struct tlv_iterator *tlv_iter); 100 101 extern uint16_t tlv_iter_get_len(const struct tlv_iterator *tlv_iter); 102 103 extern enum tlv_opt_type tlv_iter_get_type(const struct tlv_iterator *tlv_iter); 104 105 extern void tlv_iter_init(const char *msg, size_t msg_len, struct tlv_iterator *tlv_iter); 106 107 extern int tlv_iter_item_copy(const struct tlv_iterator *tlv_iter, char *new_msg, 108 size_t new_msg_len, size_t *pos); 109 110 extern int tlv_iter_next(struct tlv_iterator *tlv_iter); 111 112 extern int tlv_iter_pref_eq(const struct tlv_iterator *tlv_iter, 113 const struct sockaddr_storage *sas); 114 115 extern int tlv_mcast_grp_eq(const struct sockaddr_storage *sas, const char *mcast_grp, 116 size_t mcast_grp_len); 117 118 extern const char *tlv_opt_type_to_str(enum tlv_opt_type opt); 119 120 extern int tlv_pref_eq(const struct sockaddr_storage *sas, uint16_t iana_af, uint8_t prefix, 121 const char *addr); 122 123 #ifdef __cplusplus 124 } 125 #endif 126 127 #endif /* _TLV_H_ */ 128