1 /*- 2 * Copyright (c) 2004 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29 #ifndef _GGATE_H_ 30 #define _GGATE_H_ 31 32 #include <sys/endian.h> 33 34 #define G_GATE_BUFSIZE_START 65536 35 #define G_GATE_PORT 3080 36 37 #define G_GATE_RCVBUF 131072 38 #define G_GATE_SNDBUF 131072 39 #define G_GATE_QUEUE_SIZE 1024 40 #define G_GATE_TIMEOUT 30 41 42 extern int g_gate_devfd; 43 extern int g_gate_verbose; 44 45 /* Client's initial packet. */ 46 struct g_gate_cinit { 47 char gc_path[PATH_MAX + 1]; 48 uint8_t gc_flags; 49 }; 50 51 /* Server's initial packet. */ 52 struct g_gate_sinit { 53 uint8_t gs_flags; 54 uint64_t gs_mediasize; 55 uint32_t gs_sectorsize; 56 uint16_t gs_error; 57 }; 58 59 /* Control struct. */ 60 struct g_gate_hdr { 61 uint8_t gh_cmd; /* command */ 62 uint64_t gh_offset; /* device offset */ 63 uint32_t gh_length; /* size of block */ 64 int16_t gh_error; /* error value (0 if ok) */ 65 }; 66 67 void g_gate_vlog(int priority, const char *message, va_list ap); 68 void g_gate_log(int priority, const char *message, ...); 69 void g_gate_xvlog(const char *message, va_list ap); 70 void g_gate_xlog(const char *message, ...); 71 off_t g_gate_mediasize(int fd); 72 size_t g_gate_sectorsize(int fd); 73 void g_gate_open_device(void); 74 void g_gate_close_device(void); 75 void g_gate_ioctl(unsigned long req, void *data); 76 void g_gate_destroy(int unit, int force); 77 int g_gate_openflags(unsigned ggflags); 78 void g_gate_load_module(void); 79 #ifdef LIBGEOM 80 void g_gate_list(int unit, int verbose); 81 #endif 82 in_addr_t g_gate_str2ip(const char *str); 83 84 /* 85 * g_gate_swap2h_* - functions swap bytes to host byte order (from big endian). 86 * g_gate_swap2n_* - functions swap bytes to network byte order (actually 87 * to big endian byte order). 88 */ 89 90 static __inline void 91 g_gate_swap2h_cinit(struct g_gate_cinit *cinit __unused) 92 { 93 94 /* Nothing here for now. */ 95 } 96 97 static __inline void 98 g_gate_swap2n_cinit(struct g_gate_cinit *cinit __unused) 99 { 100 101 /* Nothing here for now. */ 102 } 103 104 static __inline void 105 g_gate_swap2h_sinit(struct g_gate_sinit *sinit) 106 { 107 108 /* Swap only used fields. */ 109 sinit->gs_mediasize = be64toh(sinit->gs_mediasize); 110 sinit->gs_sectorsize = be32toh(sinit->gs_sectorsize); 111 sinit->gs_error = be16toh(sinit->gs_error); 112 } 113 114 static __inline void 115 g_gate_swap2n_sinit(struct g_gate_sinit *sinit) 116 { 117 118 /* Swap only used fields. */ 119 sinit->gs_mediasize = htobe64(sinit->gs_mediasize); 120 sinit->gs_sectorsize = htobe32(sinit->gs_sectorsize); 121 sinit->gs_error = htobe16(sinit->gs_error); 122 } 123 124 static __inline void 125 g_gate_swap2h_hdr(struct g_gate_hdr *hdr) 126 { 127 128 /* Swap only used fields. */ 129 hdr->gh_offset = be64toh(hdr->gh_offset); 130 hdr->gh_length = be32toh(hdr->gh_length); 131 hdr->gh_error = be16toh(hdr->gh_error); 132 } 133 134 static __inline void 135 g_gate_swap2n_hdr(struct g_gate_hdr *hdr) 136 { 137 138 /* Swap only used fields. */ 139 hdr->gh_offset = htobe64(hdr->gh_offset); 140 hdr->gh_length = htobe32(hdr->gh_length); 141 hdr->gh_error = htobe16(hdr->gh_error); 142 } 143 #endif /* _GGATE_H_ */ 144