1b725ae77Skettenis /* 2b725ae77Skettenis * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved. 3b725ae77Skettenis * 4b725ae77Skettenis * This software may be freely used, copied, modified, and distributed 5b725ae77Skettenis * provided that the above copyright notice is preserved in all copies of the 6b725ae77Skettenis * software. 7b725ae77Skettenis */ 8b725ae77Skettenis 9b725ae77Skettenis /* -*-C-*- 10b725ae77Skettenis * 11*63addd46Skettenis * $Revision: 1.3 $ 12*63addd46Skettenis * $Date: 2004/12/27 14:00:54 $ 13b725ae77Skettenis * 14b725ae77Skettenis */ 15b725ae77Skettenis #ifndef angsd_hostchan_h 16b725ae77Skettenis #define angsd_hostchan_h 17b725ae77Skettenis 18b725ae77Skettenis /* A temporary sop to older compilers */ 19b725ae77Skettenis #if defined (__NetBSD__) || defined (unix) 20b725ae77Skettenis # ifndef __unix /* (good for long-term portability?) */ 21b725ae77Skettenis # define __unix 1 22b725ae77Skettenis # endif 23b725ae77Skettenis #endif 24b725ae77Skettenis 25b725ae77Skettenis /* struct timeval */ 26b725ae77Skettenis #if defined(__unix) || defined(__CYGWIN__) 27b725ae77Skettenis # include <sys/time.h> 28b725ae77Skettenis #else 29b725ae77Skettenis # include "winsock.h" 30b725ae77Skettenis # include "time.h" 31b725ae77Skettenis #endif 32b725ae77Skettenis 33b725ae77Skettenis #include "chandefs.h" 34b725ae77Skettenis #include "adperr.h" 35b725ae77Skettenis #include "devsw.h" 36b725ae77Skettenis 37b725ae77Skettenis /* 38b725ae77Skettenis * asynchronous processing modes 39b725ae77Skettenis */ 40b725ae77Skettenis enum AsyncMode 41b725ae77Skettenis { 42b725ae77Skettenis async_block_on_nothing, 43b725ae77Skettenis async_block_on_read, 44b725ae77Skettenis async_block_on_write 45b725ae77Skettenis }; 46b725ae77Skettenis 47b725ae77Skettenis #ifndef __cplusplus 48b725ae77Skettenis typedef enum AsyncMode AsyncMode; 49b725ae77Skettenis #endif 50b725ae77Skettenis 51b725ae77Skettenis /* 52b725ae77Skettenis * prototype for channels callback function 53b725ae77Skettenis */ 54b725ae77Skettenis typedef void (*ChannelCallback)(Packet *packet, void *state); 55b725ae77Skettenis 56b725ae77Skettenis /* 57b725ae77Skettenis * Function: Adp_initSeq 58b725ae77Skettenis * Purpose: initialise the channel protocol and sequence numbers 59b725ae77Skettenis * 60b725ae77Skettenis * Params: none 61b725ae77Skettenis * 62b725ae77Skettenis * Returns: Nothing 63b725ae77Skettenis */ 64b725ae77Skettenis extern void Adp_initSeq(void); 65b725ae77Skettenis 66b725ae77Skettenis /* 67b725ae77Skettenis * Function: Adp_addToQueue 68b725ae77Skettenis * Purpose: chain a Packet to the end of a linked list of such structures 69b725ae77Skettenis * 70b725ae77Skettenis * Params: 71b725ae77Skettenis * In/Out: head Head of the linked list 72b725ae77Skettenis * 73b725ae77Skettenis * newpkt Packet to be chained onto the list 74b725ae77Skettenis * 75b725ae77Skettenis * Returns: Nothing 76b725ae77Skettenis */ 77b725ae77Skettenis extern void Adp_addToQueue(Packet **head, Packet *newpkt); 78b725ae77Skettenis 79b725ae77Skettenis /* 80b725ae77Skettenis * Function: removeFromQueue 81b725ae77Skettenis * Purpose: remove a Packet from the head of a linked list of such structures 82b725ae77Skettenis * 83b725ae77Skettenis * Params: 84b725ae77Skettenis * In/Out: head Head of the linked list 85b725ae77Skettenis * 86b725ae77Skettenis * Returns: Old head from the linked list 87b725ae77Skettenis * 88b725ae77Skettenis * Post-conditions: Second element in the list will be the new head. 89b725ae77Skettenis */ 90b725ae77Skettenis 91b725ae77Skettenis extern Packet *Adp_removeFromQueue(Packet **head); 92b725ae77Skettenis 93b725ae77Skettenis /* 94b725ae77Skettenis * Set log file and Enable/disable logging of ADP packets to file. 95b725ae77Skettenis */ 96b725ae77Skettenis 97b725ae77Skettenis void Adp_SetLogfile(const char *filename); 98b725ae77Skettenis void Adp_SetLogEnable(int logEnableFlag); 99b725ae77Skettenis 100b725ae77Skettenis /* 101b725ae77Skettenis * Function: Adp_OpenDevice 102b725ae77Skettenis * Purpose: Open a device to use for channels communication. This is a 103b725ae77Skettenis * very thin veneer to the device drivers: what hostchan.c 104b725ae77Skettenis * will do is call DeviceMatch for each device driver until it 105b725ae77Skettenis * finds a driver that will accept name and arg, then call 106b725ae77Skettenis * DeviceOpen for that device. 107b725ae77Skettenis * 108b725ae77Skettenis * Pre-conditions: No previous open is still active 109b725ae77Skettenis * 110b725ae77Skettenis * Params: 111b725ae77Skettenis * Input: name Identifies which device to open. This can either be 112b725ae77Skettenis * a host specific identifier (e.g. "/dev/ttya", 113b725ae77Skettenis * "COM1:"), or a number which is used to refer to 114b725ae77Skettenis * `standard' interfaces, so "1" would be the first host 115b725ae77Skettenis * interface, "2" the second, and so on. 116b725ae77Skettenis * 117b725ae77Skettenis * arg Driver specific arguments. For example, some serial 118b725ae77Skettenis * drivers accept speed and control arguments such as 119b725ae77Skettenis * "9600" or "19200/NO_BREAK". These arguments are 120b725ae77Skettenis * completely free-form: it is the individual drivers 121b725ae77Skettenis * which do the necessary interpretation. 122b725ae77Skettenis * 123b725ae77Skettenis * heartbeat_on Incicates if the heartbeat is configured to be 124b725ae77Skettenis * used or not, true if it is, false otherwise 125b725ae77Skettenis * 126b725ae77Skettenis * Returns: 127b725ae77Skettenis * OK: adp_ok 128b725ae77Skettenis * Error: adp_device_not_known, 129b725ae77Skettenis * adp_device_open_failed 130b725ae77Skettenis * adp_device_already_open 131b725ae77Skettenis */ 132b725ae77Skettenis AdpErrs Adp_OpenDevice(const char *name, const char *arg, 133b725ae77Skettenis unsigned int heartbeat_on); 134b725ae77Skettenis 135b725ae77Skettenis /* 136b725ae77Skettenis * Function: Adp_CloseDevice 137b725ae77Skettenis * Purpose: Close the device used for channels communication. 138b725ae77Skettenis * 139b725ae77Skettenis * Params: None 140b725ae77Skettenis * 141b725ae77Skettenis * Returns: 142b725ae77Skettenis * OK: adp_ok 143b725ae77Skettenis * Error: adp_device_not_open 144b725ae77Skettenis */ 145b725ae77Skettenis AdpErrs Adp_CloseDevice(void); 146b725ae77Skettenis 147b725ae77Skettenis /* 148b725ae77Skettenis * Function: Adp_Ioctl 149b725ae77Skettenis * Purpose: Perform miscellaneous control operations on 150b725ae77Skettenis * the device used for channels communication. 151b725ae77Skettenis * This is a minimal veneer to DevSW_Ioctl. 152b725ae77Skettenis * 153b725ae77Skettenis * Params: 154b725ae77Skettenis * Input: opcode Reason code indicating the operation to perform. 155b725ae77Skettenis * In/Out: args Pointer to opcode-sensitive arguments/result space. 156b725ae77Skettenis * 157b725ae77Skettenis * 158b725ae77Skettenis * Returns: 159b725ae77Skettenis * OK: adp_ok 160b725ae77Skettenis * Error: adp_device_not_open, adp_failed 161b725ae77Skettenis */ 162b725ae77Skettenis AdpErrs Adp_Ioctl(int opcode, void *args); 163b725ae77Skettenis 164b725ae77Skettenis /* 165b725ae77Skettenis * Function: Adp_ChannelRegisterRead 166b725ae77Skettenis * Purpose: Register a callback function for received packets on a given 167b725ae77Skettenis * channel 168b725ae77Skettenis * 169b725ae77Skettenis * Params: 170b725ae77Skettenis * Input: chan The channel the callback function is for. 171b725ae77Skettenis * 172b725ae77Skettenis * cbfunc The callback function. If NULL, then the current 173b725ae77Skettenis * callback is removed. 174b725ae77Skettenis * 175b725ae77Skettenis * cbstate State pointer to pass into the callback function 176b725ae77Skettenis * 177b725ae77Skettenis * Returns: 178b725ae77Skettenis * OK: adp_ok 179b725ae77Skettenis * Error: adp_device_not_open 180b725ae77Skettenis * adp_bad_channel_id 181b725ae77Skettenis * 182b725ae77Skettenis * Post-conditions: The callback function is responsible for freeing the 183b725ae77Skettenis * packet that is passed to it, when that packet is 184b725ae77Skettenis * no longer needed. 185b725ae77Skettenis */ 186b725ae77Skettenis #ifdef __cplusplus 187b725ae77Skettenis extern "C" { 188b725ae77Skettenis #endif 189b725ae77Skettenis 190b725ae77Skettenis 191b725ae77Skettenis extern AdpErrs Adp_ChannelRegisterRead(const ChannelID chan, 192b725ae77Skettenis const ChannelCallback cbfunc, 193b725ae77Skettenis void *cbstate); 194b725ae77Skettenis 195b725ae77Skettenis #ifdef __cplusplus 196b725ae77Skettenis } 197b725ae77Skettenis #endif 198b725ae77Skettenis /* 199b725ae77Skettenis * Function: Adp_ChannelRead 200b725ae77Skettenis * Purpose: Wait until a packet has been read for a given channel, and 201b725ae77Skettenis * then return it. Callbacks for other channels are still 202b725ae77Skettenis * active while this read is blocking. 203b725ae77Skettenis * 204b725ae77Skettenis * Pre-conditions: No callback has been already been registered for 205b725ae77Skettenis * the channel. 206b725ae77Skettenis * 207b725ae77Skettenis * Params: 208b725ae77Skettenis * Input: chan The channel to read. 209b725ae77Skettenis * 210b725ae77Skettenis * Output: packet The received packet. 211b725ae77Skettenis * 212b725ae77Skettenis * Returns: 213b725ae77Skettenis * OK: adp_ok 214b725ae77Skettenis * Error: adp_device_not_open 215b725ae77Skettenis * adp_bad_channel_id 216b725ae77Skettenis * adp_callback_already_registered 217b725ae77Skettenis * 218b725ae77Skettenis * Post-conditions: The calling function is responsible for freeing the 219b725ae77Skettenis * received packet, when that packet is no longer 220b725ae77Skettenis * needed. 221b725ae77Skettenis */ 222b725ae77Skettenis AdpErrs Adp_ChannelRead(const ChannelID chan, Packet **packet); 223b725ae77Skettenis 224b725ae77Skettenis /* 225b725ae77Skettenis * Function: Adp_ChannelWrite 226b725ae77Skettenis * Purpose: Write a packet to the given channel 227b725ae77Skettenis * 228b725ae77Skettenis * Pre-conditions: Channel must have been previously opened. 229b725ae77Skettenis * 230b725ae77Skettenis * Params: 231b725ae77Skettenis * Input: chan The channel to write. 232b725ae77Skettenis * 233b725ae77Skettenis * packet The packet to write. 234b725ae77Skettenis * 235b725ae77Skettenis * Returns: 236b725ae77Skettenis * OK: adp_ok 237b725ae77Skettenis * Error: adp_device_not_open 238b725ae77Skettenis * adp_bad_channel_id 239b725ae77Skettenis * 240b725ae77Skettenis * Post-conditions: The packet being written becomes the "property" of 241b725ae77Skettenis * Adp_ChannelWrite, which is responsible for freeing 242b725ae77Skettenis * the packet when it is no longer needed. 243b725ae77Skettenis */ 244b725ae77Skettenis AdpErrs Adp_ChannelWrite(const ChannelID chan, Packet *packet); 245b725ae77Skettenis 246b725ae77Skettenis /* 247b725ae77Skettenis * Function: Adp_ChannelWriteAsync 248b725ae77Skettenis * Purpose: Write a packet to the given channel, but don't wait 249b725ae77Skettenis * for the write to complete before returning. 250b725ae77Skettenis * 251b725ae77Skettenis * Pre-conditions: Channel must have been previously opened. 252b725ae77Skettenis * 253b725ae77Skettenis * Params: 254b725ae77Skettenis * Input: chan The channel to write. 255b725ae77Skettenis * 256b725ae77Skettenis * packet The packet to write. 257b725ae77Skettenis * 258b725ae77Skettenis * Returns: 259b725ae77Skettenis * OK: adp_ok 260b725ae77Skettenis * Error: adp_device_not_open 261b725ae77Skettenis * adp_bad_channel_id 262b725ae77Skettenis * 263b725ae77Skettenis * Post-conditions: The packet being written becomes the "property" of 264b725ae77Skettenis * Adp_ChannelWrite, which is responsible for freeing 265b725ae77Skettenis * the packet when it is no longer needed. 266b725ae77Skettenis */ 267b725ae77Skettenis AdpErrs Adp_ChannelWriteAsync(const ChannelID chan, Packet *packet); 268b725ae77Skettenis 269b725ae77Skettenis /* 270b725ae77Skettenis * Function: Adp_AsynchronousProcessing 271b725ae77Skettenis * Purpose: This routine should be called from persistent any idle loop 272b725ae77Skettenis * to give the data I/O routines a chance to poll for packet 273b725ae77Skettenis * activity. Depending upon the requested mode, this routine 274b725ae77Skettenis * may, or may not, block. 275b725ae77Skettenis * 276b725ae77Skettenis * Params: 277b725ae77Skettenis * Input: mode Specifies whether to block until a complete packet 278b725ae77Skettenis * has been read, all pending writes have completed, 279b725ae77Skettenis * or not to block at all. 280b725ae77Skettenis * 281b725ae77Skettenis * Returns: Nothing. 282b725ae77Skettenis */ 283b725ae77Skettenis void Adp_AsynchronousProcessing(const AsyncMode mode); 284b725ae77Skettenis 285b725ae77Skettenis /* 286b725ae77Skettenis * prototype for DC_APPL packet handler 287b725ae77Skettenis */ 288b725ae77Skettenis typedef void (*DC_Appl_Handler)(const DeviceDescr *device, Packet *packet); 289b725ae77Skettenis 290b725ae77Skettenis /* 291b725ae77Skettenis * install a handler for DC_APPL packets (can be NULL), returning old one. 292b725ae77Skettenis */ 293b725ae77Skettenis DC_Appl_Handler Adp_Install_DC_Appl_Handler(const DC_Appl_Handler handler); 294b725ae77Skettenis 295b725ae77Skettenis /* 296b725ae77Skettenis * prototype for asynchronous processing callback 297b725ae77Skettenis */ 298b725ae77Skettenis typedef void (*Adp_Async_Callback)(const DeviceDescr *device, 299b725ae77Skettenis const struct timeval *const time_now); 300b725ae77Skettenis 301b725ae77Skettenis /* 302b725ae77Skettenis * add an asynchronous processing callback to the list 303b725ae77Skettenis * TRUE == okay, FALSE == no more async processing slots 304b725ae77Skettenis */ 305b725ae77Skettenis bool Adp_Install_Async_Callback( const Adp_Async_Callback callback_proc ); 306b725ae77Skettenis 307b725ae77Skettenis /* 308b725ae77Skettenis * delay for a given period (in microseconds) 309b725ae77Skettenis */ 310b725ae77Skettenis void Adp_delay(unsigned int period); 311b725ae77Skettenis 312b725ae77Skettenis #endif /* ndef angsd_hostchan_h */ 313b725ae77Skettenis 314b725ae77Skettenis /* EOF hostchan.h */ 315