19ec7b004SRick Macklem /*- 251369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 351369649SPedro F. Giffuni * 49ec7b004SRick Macklem * Copyright (c) 1989, 1993 59ec7b004SRick Macklem * The Regents of the University of California. All rights reserved. 69ec7b004SRick Macklem * 79ec7b004SRick Macklem * This code is derived from software contributed to Berkeley by 89ec7b004SRick Macklem * Rick Macklem at The University of Guelph. 99ec7b004SRick Macklem * 109ec7b004SRick Macklem * Redistribution and use in source and binary forms, with or without 119ec7b004SRick Macklem * modification, are permitted provided that the following conditions 129ec7b004SRick Macklem * are met: 139ec7b004SRick Macklem * 1. Redistributions of source code must retain the above copyright 149ec7b004SRick Macklem * notice, this list of conditions and the following disclaimer. 159ec7b004SRick Macklem * 2. Redistributions in binary form must reproduce the above copyright 169ec7b004SRick Macklem * notice, this list of conditions and the following disclaimer in the 179ec7b004SRick Macklem * documentation and/or other materials provided with the distribution. 18fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 199ec7b004SRick Macklem * may be used to endorse or promote products derived from this software 209ec7b004SRick Macklem * without specific prior written permission. 219ec7b004SRick Macklem * 229ec7b004SRick Macklem * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 239ec7b004SRick Macklem * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 249ec7b004SRick Macklem * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 259ec7b004SRick Macklem * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 269ec7b004SRick Macklem * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 279ec7b004SRick Macklem * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 289ec7b004SRick Macklem * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 299ec7b004SRick Macklem * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 309ec7b004SRick Macklem * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 319ec7b004SRick Macklem * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 329ec7b004SRick Macklem * SUCH DAMAGE. 339ec7b004SRick Macklem * 349ec7b004SRick Macklem * $FreeBSD$ 359ec7b004SRick Macklem */ 369ec7b004SRick Macklem 379ec7b004SRick Macklem #ifndef _NFS_NFSM_SUBS_H_ 389ec7b004SRick Macklem #define _NFS_NFSM_SUBS_H_ 399ec7b004SRick Macklem 409ec7b004SRick Macklem 419ec7b004SRick Macklem /* 429ec7b004SRick Macklem * These macros do strange and peculiar things to mbuf chains for 439ec7b004SRick Macklem * the assistance of the nfs code. To attempt to use them for any 449ec7b004SRick Macklem * other purpose will be dangerous. (they make weird assumptions) 459ec7b004SRick Macklem */ 469ec7b004SRick Macklem 479ec7b004SRick Macklem #ifndef APPLE 489ec7b004SRick Macklem /* 499ec7b004SRick Macklem * First define what the actual subs. return 509ec7b004SRick Macklem */ 519ec7b004SRick Macklem #define NFSM_DATAP(m, s) (m)->m_data += (s) 529ec7b004SRick Macklem 539ec7b004SRick Macklem /* 549ec7b004SRick Macklem * Now for the macros that do the simple stuff and call the functions 559ec7b004SRick Macklem * for the hard stuff. 569ec7b004SRick Macklem * They use fields in struct nfsrv_descript to handle the mbuf queues. 579ec7b004SRick Macklem * Replace most of the macro with an inline function, to minimize 589ec7b004SRick Macklem * the machine code. The inline functions in lower case can be called 599ec7b004SRick Macklem * directly, bypassing the macro. 609ec7b004SRick Macklem */ 619ec7b004SRick Macklem static __inline void * 629ec7b004SRick Macklem nfsm_build(struct nfsrv_descript *nd, int siz) 639ec7b004SRick Macklem { 649ec7b004SRick Macklem void *retp; 659ec7b004SRick Macklem struct mbuf *mb2; 669ec7b004SRick Macklem 679ec7b004SRick Macklem if (siz > M_TRAILINGSPACE(nd->nd_mb)) { 68eb1b1807SGleb Smirnoff NFSMCLGET(mb2, M_NOWAIT); 699ec7b004SRick Macklem if (siz > MLEN) 709ec7b004SRick Macklem panic("build > MLEN"); 719f6624d3SRick Macklem mb2->m_len = 0; 729f6624d3SRick Macklem nd->nd_bpos = mtod(mb2, caddr_t); 739ec7b004SRick Macklem nd->nd_mb->m_next = mb2; 749ec7b004SRick Macklem nd->nd_mb = mb2; 759ec7b004SRick Macklem } 769ec7b004SRick Macklem retp = (void *)(nd->nd_bpos); 779ec7b004SRick Macklem nd->nd_mb->m_len += siz; 789ec7b004SRick Macklem nd->nd_bpos += siz; 799ec7b004SRick Macklem return (retp); 809ec7b004SRick Macklem } 819ec7b004SRick Macklem 829ec7b004SRick Macklem #define NFSM_BUILD(a, c, s) ((a) = (c)nfsm_build(nd, (s))) 839ec7b004SRick Macklem 849ec7b004SRick Macklem static __inline void * 859ec7b004SRick Macklem nfsm_dissect(struct nfsrv_descript *nd, int siz) 869ec7b004SRick Macklem { 879ec7b004SRick Macklem int tt1; 889ec7b004SRick Macklem void *retp; 899ec7b004SRick Macklem 909f6624d3SRick Macklem tt1 = mtod(nd->nd_md, caddr_t) + nd->nd_md->m_len - nd->nd_dpos; 919ec7b004SRick Macklem if (tt1 >= siz) { 929ec7b004SRick Macklem retp = (void *)nd->nd_dpos; 939ec7b004SRick Macklem nd->nd_dpos += siz; 949ec7b004SRick Macklem } else { 95d96b98a3SKenneth D. Merry retp = nfsm_dissct(nd, siz, M_WAITOK); 96d96b98a3SKenneth D. Merry } 97d96b98a3SKenneth D. Merry return (retp); 98d96b98a3SKenneth D. Merry } 99d96b98a3SKenneth D. Merry 100d96b98a3SKenneth D. Merry static __inline void * 101d96b98a3SKenneth D. Merry nfsm_dissect_nonblock(struct nfsrv_descript *nd, int siz) 102d96b98a3SKenneth D. Merry { 103d96b98a3SKenneth D. Merry int tt1; 104d96b98a3SKenneth D. Merry void *retp; 105d96b98a3SKenneth D. Merry 1069f6624d3SRick Macklem tt1 = mtod(nd->nd_md, caddr_t) + nd->nd_md->m_len - nd->nd_dpos; 107d96b98a3SKenneth D. Merry if (tt1 >= siz) { 108d96b98a3SKenneth D. Merry retp = (void *)nd->nd_dpos; 109d96b98a3SKenneth D. Merry nd->nd_dpos += siz; 110d96b98a3SKenneth D. Merry } else { 111d96b98a3SKenneth D. Merry retp = nfsm_dissct(nd, siz, M_NOWAIT); 1129ec7b004SRick Macklem } 1139ec7b004SRick Macklem return (retp); 1149ec7b004SRick Macklem } 1159ec7b004SRick Macklem 1169ec7b004SRick Macklem #define NFSM_DISSECT(a, c, s) \ 1179ec7b004SRick Macklem do { \ 1189ec7b004SRick Macklem (a) = (c)nfsm_dissect(nd, (s)); \ 1199ec7b004SRick Macklem if ((a) == NULL) { \ 1209ec7b004SRick Macklem error = EBADRPC; \ 1219ec7b004SRick Macklem goto nfsmout; \ 1229ec7b004SRick Macklem } \ 1239ec7b004SRick Macklem } while (0) 124d96b98a3SKenneth D. Merry 125d96b98a3SKenneth D. Merry #define NFSM_DISSECT_NONBLOCK(a, c, s) \ 126d96b98a3SKenneth D. Merry do { \ 127d96b98a3SKenneth D. Merry (a) = (c)nfsm_dissect_nonblock(nd, (s)); \ 128d96b98a3SKenneth D. Merry if ((a) == NULL) { \ 129d96b98a3SKenneth D. Merry error = EBADRPC; \ 130d96b98a3SKenneth D. Merry goto nfsmout; \ 131d96b98a3SKenneth D. Merry } \ 132d96b98a3SKenneth D. Merry } while (0) 1339ec7b004SRick Macklem #endif /* !APPLE */ 1349ec7b004SRick Macklem 1359ec7b004SRick Macklem #define NFSM_STRSIZ(s, m) \ 1369ec7b004SRick Macklem do { \ 1379ec7b004SRick Macklem tl = (u_int32_t *)nfsm_dissect(nd, NFSX_UNSIGNED); \ 1389ec7b004SRick Macklem if (!tl || ((s) = fxdr_unsigned(int32_t, *tl)) > (m)) { \ 1399ec7b004SRick Macklem error = EBADRPC; \ 1409ec7b004SRick Macklem goto nfsmout; \ 1419ec7b004SRick Macklem } \ 1429ec7b004SRick Macklem } while (0) 1439ec7b004SRick Macklem 1449ec7b004SRick Macklem #define NFSM_RNDUP(a) (((a)+3)&(~0x3)) 1459ec7b004SRick Macklem 1469ec7b004SRick Macklem #endif /* _NFS_NFSM_SUBS_H_ */ 147