1128763Spjd/*- 2128763Spjd * Copyright (c) 2004 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3128763Spjd * All rights reserved. 4128763Spjd * 5128763Spjd * Redistribution and use in source and binary forms, with or without 6128763Spjd * modification, are permitted provided that the following conditions 7128763Spjd * are met: 8128763Spjd * 1. Redistributions of source code must retain the above copyright 9128763Spjd * notice, this list of conditions and the following disclaimer. 10128763Spjd * 2. Redistributions in binary form must reproduce the above copyright 11128763Spjd * notice, this list of conditions and the following disclaimer in the 12128763Spjd * documentation and/or other materials provided with the distribution. 13128763Spjd * 14128763Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15128763Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16128763Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17128763Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18128763Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19128763Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20128763Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21128763Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22128763Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23128763Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24128763Spjd * SUCH DAMAGE. 25128763Spjd * 26128763Spjd * $FreeBSD$ 27128763Spjd */ 28128763Spjd 29128763Spjd#ifndef _GGATE_H_ 30128763Spjd#define _GGATE_H_ 31128763Spjd 32128763Spjd#include <sys/endian.h> 33145795Sdelphij#include <stdarg.h> 34128763Spjd 35128763Spjd#define G_GATE_PORT 3080 36128763Spjd 37128763Spjd#define G_GATE_RCVBUF 131072 38128763Spjd#define G_GATE_SNDBUF 131072 39128763Spjd#define G_GATE_QUEUE_SIZE 1024 40147844Spjd#define G_GATE_TIMEOUT 0 41128763Spjd 42147844Spjd#define GGATE_MAGIC "GEOM_GATE " 43147844Spjd#define GGATE_VERSION 0 44147844Spjd 45147844Spjd#define GGATE_FLAG_RDONLY 0x0001 46147844Spjd#define GGATE_FLAG_WRONLY 0x0002 47147844Spjd/* 48147844Spjd * If GGATE_FLAG_SEND not GGATE_FLAG_RECV flag is set, this is initial 49147844Spjd * connection. 50147844Spjd * If GGATE_FLAG_SEND flag is set - this is socket to send data. 51147844Spjd * If GGATE_FLAG_RECV flag is set - this is socket to receive data. 52147844Spjd */ 53147844Spjd#define GGATE_FLAG_SEND 0x0004 54147844Spjd#define GGATE_FLAG_RECV 0x0008 55147844Spjd 56147844Spjd#define GGATE_CMD_READ 0 57147844Spjd#define GGATE_CMD_WRITE 1 58147844Spjd 59128763Spjdextern int g_gate_devfd; 60128763Spjdextern int g_gate_verbose; 61128763Spjd 62147844Spjdextern int nagle; 63147844Spjdextern unsigned rcvbuf, sndbuf; 64147844Spjd 65147844Spjdstruct g_gate_version { 66147844Spjd char gv_magic[16]; 67147844Spjd uint16_t gv_version; 68147844Spjd uint16_t gv_error; 69147844Spjd} __packed; 70147844Spjd 71128763Spjd/* Client's initial packet. */ 72128763Spjdstruct g_gate_cinit { 73147844Spjd char gc_path[PATH_MAX + 1]; 74147844Spjd uint64_t gc_flags; 75147844Spjd uint16_t gc_nconn; 76147844Spjd uint32_t gc_token; 77147844Spjd} __packed; 78128763Spjd 79128763Spjd/* Server's initial packet. */ 80128763Spjdstruct g_gate_sinit { 81128763Spjd uint8_t gs_flags; 82128763Spjd uint64_t gs_mediasize; 83128763Spjd uint32_t gs_sectorsize; 84128763Spjd uint16_t gs_error; 85147844Spjd} __packed; 86128763Spjd 87128763Spjd/* Control struct. */ 88128763Spjdstruct g_gate_hdr { 89128763Spjd uint8_t gh_cmd; /* command */ 90128763Spjd uint64_t gh_offset; /* device offset */ 91128763Spjd uint32_t gh_length; /* size of block */ 92147844Spjd uint64_t gh_seq; /* request number */ 93147844Spjd uint16_t gh_error; /* error value (0 if ok) */ 94147844Spjd} __packed; 95128763Spjd 96128763Spjdvoid g_gate_vlog(int priority, const char *message, va_list ap); 97128763Spjdvoid g_gate_log(int priority, const char *message, ...); 98239525Sdimvoid g_gate_xvlog(const char *message, va_list ap) __dead2; 99239525Sdimvoid g_gate_xlog(const char *message, ...) __dead2; 100128763Spjdoff_t g_gate_mediasize(int fd); 101165327Spjdunsigned g_gate_sectorsize(int fd); 102128763Spjdvoid g_gate_open_device(void); 103128763Spjdvoid g_gate_close_device(void); 104128763Spjdvoid g_gate_ioctl(unsigned long req, void *data); 105128763Spjdvoid g_gate_destroy(int unit, int force); 106128763Spjdvoid g_gate_load_module(void); 107147844Spjdssize_t g_gate_recv(int s, void *buf, size_t len, int flags); 108147844Spjdssize_t g_gate_send(int s, const void *buf, size_t len, int flags); 109147844Spjdvoid g_gate_socket_settings(int sfd); 110128763Spjd#ifdef LIBGEOM 111128763Spjdvoid g_gate_list(int unit, int verbose); 112128763Spjd#endif 113128763Spjdin_addr_t g_gate_str2ip(const char *str); 114128763Spjd 115128763Spjd/* 116128763Spjd * g_gate_swap2h_* - functions swap bytes to host byte order (from big endian). 117128763Spjd * g_gate_swap2n_* - functions swap bytes to network byte order (actually 118128763Spjd * to big endian byte order). 119128763Spjd */ 120128763Spjd 121128763Spjdstatic __inline void 122147844Spjdg_gate_swap2h_version(struct g_gate_version *ver) 123128763Spjd{ 124128763Spjd 125147844Spjd ver->gv_version = be16toh(ver->gv_version); 126147844Spjd ver->gv_error = be16toh(ver->gv_error); 127128763Spjd} 128128763Spjd 129128763Spjdstatic __inline void 130147844Spjdg_gate_swap2n_version(struct g_gate_version *ver) 131128763Spjd{ 132128763Spjd 133147844Spjd ver->gv_version = htobe16(ver->gv_version); 134147844Spjd ver->gv_error = htobe16(ver->gv_error); 135128763Spjd} 136128763Spjd 137128763Spjdstatic __inline void 138147844Spjdg_gate_swap2h_cinit(struct g_gate_cinit *cinit) 139147844Spjd{ 140147844Spjd 141147844Spjd cinit->gc_flags = be64toh(cinit->gc_flags); 142147844Spjd cinit->gc_nconn = be16toh(cinit->gc_nconn); 143147844Spjd cinit->gc_token = be32toh(cinit->gc_token); 144147844Spjd} 145147844Spjd 146147844Spjdstatic __inline void 147147844Spjdg_gate_swap2n_cinit(struct g_gate_cinit *cinit) 148147844Spjd{ 149147844Spjd 150147844Spjd cinit->gc_flags = htobe64(cinit->gc_flags); 151147844Spjd cinit->gc_nconn = htobe16(cinit->gc_nconn); 152147844Spjd cinit->gc_token = htobe32(cinit->gc_token); 153147844Spjd} 154147844Spjd 155147844Spjdstatic __inline void 156128763Spjdg_gate_swap2h_sinit(struct g_gate_sinit *sinit) 157128763Spjd{ 158128763Spjd 159128763Spjd /* Swap only used fields. */ 160128763Spjd sinit->gs_mediasize = be64toh(sinit->gs_mediasize); 161128763Spjd sinit->gs_sectorsize = be32toh(sinit->gs_sectorsize); 162128763Spjd sinit->gs_error = be16toh(sinit->gs_error); 163128763Spjd} 164128763Spjd 165128763Spjdstatic __inline void 166128763Spjdg_gate_swap2n_sinit(struct g_gate_sinit *sinit) 167128763Spjd{ 168128763Spjd 169128763Spjd /* Swap only used fields. */ 170128763Spjd sinit->gs_mediasize = htobe64(sinit->gs_mediasize); 171128763Spjd sinit->gs_sectorsize = htobe32(sinit->gs_sectorsize); 172128763Spjd sinit->gs_error = htobe16(sinit->gs_error); 173128763Spjd} 174128763Spjd 175128763Spjdstatic __inline void 176128763Spjdg_gate_swap2h_hdr(struct g_gate_hdr *hdr) 177128763Spjd{ 178128763Spjd 179128763Spjd /* Swap only used fields. */ 180128763Spjd hdr->gh_offset = be64toh(hdr->gh_offset); 181128763Spjd hdr->gh_length = be32toh(hdr->gh_length); 182147844Spjd hdr->gh_seq = be64toh(hdr->gh_seq); 183128763Spjd hdr->gh_error = be16toh(hdr->gh_error); 184128763Spjd} 185128763Spjd 186128763Spjdstatic __inline void 187128763Spjdg_gate_swap2n_hdr(struct g_gate_hdr *hdr) 188128763Spjd{ 189128763Spjd 190128763Spjd /* Swap only used fields. */ 191128763Spjd hdr->gh_offset = htobe64(hdr->gh_offset); 192128763Spjd hdr->gh_length = htobe32(hdr->gh_length); 193147844Spjd hdr->gh_seq = htobe64(hdr->gh_seq); 194128763Spjd hdr->gh_error = htobe16(hdr->gh_error); 195128763Spjd} 196128763Spjd#endif /* _GGATE_H_ */ 197