1878ed226SJulian Elischer /* 2878ed226SJulian Elischer * ng_l2cap_cmds.h 3c398230bSWarner Losh */ 4c398230bSWarner Losh 5c398230bSWarner Losh /*- 6878ed226SJulian Elischer * Copyright (c) Maksim Yevmenkin <m_evmenkin@yahoo.com> 7878ed226SJulian Elischer * All rights reserved. 8878ed226SJulian Elischer * 9878ed226SJulian Elischer * Redistribution and use in source and binary forms, with or without 10878ed226SJulian Elischer * modification, are permitted provided that the following conditions 11878ed226SJulian Elischer * are met: 12878ed226SJulian Elischer * 1. Redistributions of source code must retain the above copyright 13878ed226SJulian Elischer * notice, this list of conditions and the following disclaimer. 14878ed226SJulian Elischer * 2. Redistributions in binary form must reproduce the above copyright 15878ed226SJulian Elischer * notice, this list of conditions and the following disclaimer in the 16878ed226SJulian Elischer * documentation and/or other materials provided with the distribution. 17878ed226SJulian Elischer * 18878ed226SJulian Elischer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19878ed226SJulian Elischer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20878ed226SJulian Elischer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21878ed226SJulian Elischer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22878ed226SJulian Elischer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23878ed226SJulian Elischer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24878ed226SJulian Elischer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25878ed226SJulian Elischer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26878ed226SJulian Elischer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27878ed226SJulian Elischer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28878ed226SJulian Elischer * SUCH DAMAGE. 29878ed226SJulian Elischer * 30f2bb1caeSJulian Elischer * $Id: ng_l2cap_cmds.h,v 1.4 2003/04/01 18:15:26 max Exp $ 31878ed226SJulian Elischer * $FreeBSD$ 32878ed226SJulian Elischer */ 33878ed226SJulian Elischer 34878ed226SJulian Elischer #ifndef _NETGRAPH_L2CAP_CMDS_H_ 35878ed226SJulian Elischer #define _NETGRAPH_L2CAP_CMDS_H_ 36878ed226SJulian Elischer 37878ed226SJulian Elischer /****************************************************************************** 38878ed226SJulian Elischer ****************************************************************************** 39878ed226SJulian Elischer ** L2CAP to L2CAP signaling command macros 40878ed226SJulian Elischer ****************************************************************************** 41878ed226SJulian Elischer ******************************************************************************/ 42878ed226SJulian Elischer 43878ed226SJulian Elischer /* 44878ed226SJulian Elischer * Note: All L2CAP implementations are required to support minimal signaling 45878ed226SJulian Elischer * MTU of 48 bytes. In order to simplify things we will send one command 46878ed226SJulian Elischer * per one L2CAP packet. Given evrything above we can assume that one 47878ed226SJulian Elischer * signaling packet will fit into single mbuf. 48878ed226SJulian Elischer */ 49878ed226SJulian Elischer 50878ed226SJulian Elischer /* L2CAP_CommandRej */ 51878ed226SJulian Elischer #define _ng_l2cap_cmd_rej(_m, _ident, _reason, _mtu, _scid, _dcid) \ 52878ed226SJulian Elischer do { \ 53878ed226SJulian Elischer struct _cmd_rej { \ 54878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 55878ed226SJulian Elischer ng_l2cap_cmd_rej_cp param; \ 56878ed226SJulian Elischer ng_l2cap_cmd_rej_data_t data; \ 57878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 58878ed226SJulian Elischer \ 59eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 60878ed226SJulian Elischer if ((_m) == NULL) \ 61878ed226SJulian Elischer break; \ 62878ed226SJulian Elischer \ 63878ed226SJulian Elischer c = mtod((_m), struct _cmd_rej *); \ 64878ed226SJulian Elischer c->hdr.code = NG_L2CAP_CMD_REJ; \ 65878ed226SJulian Elischer c->hdr.ident = (_ident); \ 66878ed226SJulian Elischer c->hdr.length = sizeof(c->param); \ 67878ed226SJulian Elischer \ 68878ed226SJulian Elischer c->param.reason = htole16((_reason)); \ 69878ed226SJulian Elischer \ 70878ed226SJulian Elischer if ((_reason) == NG_L2CAP_REJ_MTU_EXCEEDED) { \ 71878ed226SJulian Elischer c->data.mtu.mtu = htole16((_mtu)); \ 72878ed226SJulian Elischer c->hdr.length += sizeof(c->data.mtu); \ 73878ed226SJulian Elischer } else if ((_reason) == NG_L2CAP_REJ_INVALID_CID) { \ 74878ed226SJulian Elischer c->data.cid.scid = htole16((_scid)); \ 75878ed226SJulian Elischer c->data.cid.dcid = htole16((_dcid)); \ 76878ed226SJulian Elischer c->hdr.length += sizeof(c->data.cid); \ 77878ed226SJulian Elischer } \ 78878ed226SJulian Elischer \ 79878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(c->hdr) + \ 80878ed226SJulian Elischer c->hdr.length; \ 81878ed226SJulian Elischer \ 82878ed226SJulian Elischer c->hdr.length = htole16(c->hdr.length); \ 83878ed226SJulian Elischer } while (0) 84878ed226SJulian Elischer 85878ed226SJulian Elischer /* L2CAP_ConnectReq */ 86878ed226SJulian Elischer #define _ng_l2cap_con_req(_m, _ident, _psm, _scid) \ 87878ed226SJulian Elischer do { \ 88878ed226SJulian Elischer struct _con_req { \ 89878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 90878ed226SJulian Elischer ng_l2cap_con_req_cp param; \ 91878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 92878ed226SJulian Elischer \ 93eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 94878ed226SJulian Elischer if ((_m) == NULL) \ 95878ed226SJulian Elischer break; \ 96878ed226SJulian Elischer \ 97878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 98878ed226SJulian Elischer \ 99878ed226SJulian Elischer c = mtod((_m), struct _con_req *); \ 100878ed226SJulian Elischer c->hdr.code = NG_L2CAP_CON_REQ; \ 101878ed226SJulian Elischer c->hdr.ident = (_ident); \ 102878ed226SJulian Elischer c->hdr.length = htole16(sizeof(c->param)); \ 103878ed226SJulian Elischer \ 104878ed226SJulian Elischer c->param.psm = htole16((_psm)); \ 105878ed226SJulian Elischer c->param.scid = htole16((_scid)); \ 106878ed226SJulian Elischer } while (0) 107878ed226SJulian Elischer 108878ed226SJulian Elischer /* L2CAP_ConnectRsp */ 109878ed226SJulian Elischer #define _ng_l2cap_con_rsp(_m, _ident, _dcid, _scid, _result, _status) \ 110878ed226SJulian Elischer do { \ 111878ed226SJulian Elischer struct _con_rsp { \ 112878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 113878ed226SJulian Elischer ng_l2cap_con_rsp_cp param; \ 114878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 115878ed226SJulian Elischer \ 116eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 117878ed226SJulian Elischer if ((_m) == NULL) \ 118878ed226SJulian Elischer break; \ 119878ed226SJulian Elischer \ 120878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 121878ed226SJulian Elischer \ 122878ed226SJulian Elischer c = mtod((_m), struct _con_rsp *); \ 123878ed226SJulian Elischer c->hdr.code = NG_L2CAP_CON_RSP; \ 124878ed226SJulian Elischer c->hdr.ident = (_ident); \ 125878ed226SJulian Elischer c->hdr.length = htole16(sizeof(c->param)); \ 126878ed226SJulian Elischer \ 127878ed226SJulian Elischer c->param.dcid = htole16((_dcid)); \ 128878ed226SJulian Elischer c->param.scid = htole16((_scid)); \ 129878ed226SJulian Elischer c->param.result = htole16((_result)); \ 130878ed226SJulian Elischer c->param.status = htole16((_status)); \ 131878ed226SJulian Elischer } while (0) 132878ed226SJulian Elischer 133878ed226SJulian Elischer /* L2CAP_ConfigReq */ 134878ed226SJulian Elischer #define _ng_l2cap_cfg_req(_m, _ident, _dcid, _flags, _data) \ 135878ed226SJulian Elischer do { \ 136878ed226SJulian Elischer struct _cfg_req { \ 137878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 138878ed226SJulian Elischer ng_l2cap_cfg_req_cp param; \ 139878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 140878ed226SJulian Elischer \ 141eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 142878ed226SJulian Elischer if ((_m) == NULL) { \ 143878ed226SJulian Elischer NG_FREE_M((_data)); \ 144878ed226SJulian Elischer break; \ 145878ed226SJulian Elischer } \ 146878ed226SJulian Elischer \ 147878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 148878ed226SJulian Elischer \ 149878ed226SJulian Elischer c = mtod((_m), struct _cfg_req *); \ 150878ed226SJulian Elischer c->hdr.code = NG_L2CAP_CFG_REQ; \ 151878ed226SJulian Elischer c->hdr.ident = (_ident); \ 152878ed226SJulian Elischer c->hdr.length = sizeof(c->param); \ 153878ed226SJulian Elischer \ 154878ed226SJulian Elischer c->param.dcid = htole16((_dcid)); \ 155878ed226SJulian Elischer c->param.flags = htole16((_flags)); \ 156878ed226SJulian Elischer if ((_data) != NULL) { \ 157f2bb1caeSJulian Elischer int l = (_data)->m_pkthdr.len; \ 158f2bb1caeSJulian Elischer \ 159878ed226SJulian Elischer m_cat((_m), (_data)); \ 160f2bb1caeSJulian Elischer c->hdr.length += l; \ 161f2bb1caeSJulian Elischer (_m)->m_pkthdr.len += l; \ 162878ed226SJulian Elischer } \ 163878ed226SJulian Elischer \ 164878ed226SJulian Elischer c->hdr.length = htole16(c->hdr.length); \ 165878ed226SJulian Elischer } while (0) 166878ed226SJulian Elischer 167878ed226SJulian Elischer /* L2CAP_ConfigRsp */ 168878ed226SJulian Elischer #define _ng_l2cap_cfg_rsp(_m, _ident, _scid, _flags, _result, _data) \ 169878ed226SJulian Elischer do { \ 170878ed226SJulian Elischer struct _cfg_rsp { \ 171878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 172878ed226SJulian Elischer ng_l2cap_cfg_rsp_cp param; \ 173878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 174878ed226SJulian Elischer \ 175eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 176878ed226SJulian Elischer if ((_m) == NULL) { \ 177878ed226SJulian Elischer NG_FREE_M((_data)); \ 178878ed226SJulian Elischer break; \ 179878ed226SJulian Elischer } \ 180878ed226SJulian Elischer \ 181878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 182878ed226SJulian Elischer \ 183878ed226SJulian Elischer c = mtod((_m), struct _cfg_rsp *); \ 184878ed226SJulian Elischer c->hdr.code = NG_L2CAP_CFG_RSP; \ 185878ed226SJulian Elischer c->hdr.ident = (_ident); \ 186878ed226SJulian Elischer c->hdr.length = sizeof(c->param); \ 187878ed226SJulian Elischer \ 188878ed226SJulian Elischer c->param.scid = htole16((_scid)); \ 189878ed226SJulian Elischer c->param.flags = htole16((_flags)); \ 190878ed226SJulian Elischer c->param.result = htole16((_result)); \ 191878ed226SJulian Elischer if ((_data) != NULL) { \ 192f2bb1caeSJulian Elischer int l = (_data)->m_pkthdr.len; \ 193f2bb1caeSJulian Elischer \ 194878ed226SJulian Elischer m_cat((_m), (_data)); \ 195f2bb1caeSJulian Elischer c->hdr.length += l; \ 196f2bb1caeSJulian Elischer (_m)->m_pkthdr.len += l; \ 197878ed226SJulian Elischer } \ 198878ed226SJulian Elischer \ 199878ed226SJulian Elischer c->hdr.length = htole16(c->hdr.length); \ 200878ed226SJulian Elischer } while (0) 201878ed226SJulian Elischer 202*fbc48c2bSTakanori Watanabe #define _ng_l2cap_cmd_urs(_m, _ident, _result) \ 203*fbc48c2bSTakanori Watanabe do { \ 204*fbc48c2bSTakanori Watanabe struct _cmd_urs{ \ 205*fbc48c2bSTakanori Watanabe ng_l2cap_cmd_hdr_t hdr; \ 206*fbc48c2bSTakanori Watanabe uint16_t result; \ 207*fbc48c2bSTakanori Watanabe } __attribute__ ((packed)) *c = NULL; \ 208*fbc48c2bSTakanori Watanabe \ 209*fbc48c2bSTakanori Watanabe MGETHDR((_m), M_NOWAIT, MT_DATA); \ 210*fbc48c2bSTakanori Watanabe \ 211*fbc48c2bSTakanori Watanabe (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 212*fbc48c2bSTakanori Watanabe \ 213*fbc48c2bSTakanori Watanabe c = mtod((_m), struct _cmd_urs *); \ 214*fbc48c2bSTakanori Watanabe c->hdr.code = NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE; \ 215*fbc48c2bSTakanori Watanabe c->hdr.ident = (_ident); \ 216*fbc48c2bSTakanori Watanabe c->hdr.length = sizeof(c->result); \ 217*fbc48c2bSTakanori Watanabe \ 218*fbc48c2bSTakanori Watanabe c->result = htole16((_result)); \ 219*fbc48c2bSTakanori Watanabe } while (0) 220*fbc48c2bSTakanori Watanabe 221878ed226SJulian Elischer /* Build configuration options */ 222878ed226SJulian Elischer #define _ng_l2cap_build_cfg_options(_m, _mtu, _flush_timo, _flow) \ 223878ed226SJulian Elischer do { \ 224878ed226SJulian Elischer u_int8_t *p = NULL; \ 225878ed226SJulian Elischer \ 226eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 227878ed226SJulian Elischer if ((_m) == NULL) \ 228878ed226SJulian Elischer break; \ 229878ed226SJulian Elischer \ 230878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = 0; \ 231878ed226SJulian Elischer p = mtod((_m), u_int8_t *); \ 232878ed226SJulian Elischer \ 233878ed226SJulian Elischer if ((_mtu) != NULL) { \ 234878ed226SJulian Elischer struct _cfg_opt_mtu { \ 235878ed226SJulian Elischer ng_l2cap_cfg_opt_t hdr; \ 236878ed226SJulian Elischer u_int16_t val; \ 237878ed226SJulian Elischer } __attribute__ ((packed)) *o = NULL; \ 238878ed226SJulian Elischer \ 239878ed226SJulian Elischer o = (struct _cfg_opt_mtu *) p; \ 240878ed226SJulian Elischer o->hdr.type = NG_L2CAP_OPT_MTU; \ 241878ed226SJulian Elischer o->hdr.length = sizeof(o->val); \ 242878ed226SJulian Elischer o->val = htole16(*(u_int16_t *)(_mtu)); \ 243878ed226SJulian Elischer \ 244878ed226SJulian Elischer (_m)->m_pkthdr.len += sizeof(*o); \ 245878ed226SJulian Elischer p += sizeof(*o); \ 246878ed226SJulian Elischer } \ 247878ed226SJulian Elischer \ 248878ed226SJulian Elischer if ((_flush_timo) != NULL) { \ 249878ed226SJulian Elischer struct _cfg_opt_flush { \ 250878ed226SJulian Elischer ng_l2cap_cfg_opt_t hdr; \ 251878ed226SJulian Elischer u_int16_t val; \ 252878ed226SJulian Elischer } __attribute__ ((packed)) *o = NULL; \ 253878ed226SJulian Elischer \ 254878ed226SJulian Elischer o = (struct _cfg_opt_flush *) p; \ 255878ed226SJulian Elischer o->hdr.type = NG_L2CAP_OPT_FLUSH_TIMO; \ 256878ed226SJulian Elischer o->hdr.length = sizeof(o->val); \ 257878ed226SJulian Elischer o->val = htole16(*(u_int16_t *)(_flush_timo)); \ 258878ed226SJulian Elischer \ 259878ed226SJulian Elischer (_m)->m_pkthdr.len += sizeof(*o); \ 260878ed226SJulian Elischer p += sizeof(*o); \ 261878ed226SJulian Elischer } \ 262878ed226SJulian Elischer \ 263878ed226SJulian Elischer if ((_flow) != NULL) { \ 264878ed226SJulian Elischer struct _cfg_opt_flow { \ 265878ed226SJulian Elischer ng_l2cap_cfg_opt_t hdr; \ 266878ed226SJulian Elischer ng_l2cap_flow_t val; \ 267878ed226SJulian Elischer } __attribute__ ((packed)) *o = NULL; \ 268878ed226SJulian Elischer \ 269878ed226SJulian Elischer o = (struct _cfg_opt_flow *) p; \ 270878ed226SJulian Elischer o->hdr.type = NG_L2CAP_OPT_QOS; \ 271878ed226SJulian Elischer o->hdr.length = sizeof(o->val); \ 272878ed226SJulian Elischer o->val.flags = ((ng_l2cap_flow_p)(_flow))->flags; \ 273878ed226SJulian Elischer o->val.service_type = ((ng_l2cap_flow_p) \ 274878ed226SJulian Elischer (_flow))->service_type; \ 275878ed226SJulian Elischer o->val.token_rate = \ 276878ed226SJulian Elischer htole32(((ng_l2cap_flow_p)(_flow))->token_rate);\ 277878ed226SJulian Elischer o->val.token_bucket_size = \ 278878ed226SJulian Elischer htole32(((ng_l2cap_flow_p) \ 279878ed226SJulian Elischer (_flow))->token_bucket_size); \ 280878ed226SJulian Elischer o->val.peak_bandwidth = \ 281878ed226SJulian Elischer htole32(((ng_l2cap_flow_p) \ 282878ed226SJulian Elischer (_flow))->peak_bandwidth); \ 283878ed226SJulian Elischer o->val.latency = htole32(((ng_l2cap_flow_p) \ 284878ed226SJulian Elischer (_flow))->latency); \ 285878ed226SJulian Elischer o->val.delay_variation = \ 286878ed226SJulian Elischer htole32(((ng_l2cap_flow_p) \ 287878ed226SJulian Elischer (_flow))->delay_variation); \ 288878ed226SJulian Elischer \ 289878ed226SJulian Elischer (_m)->m_pkthdr.len += sizeof(*o); \ 290878ed226SJulian Elischer } \ 291878ed226SJulian Elischer \ 292878ed226SJulian Elischer (_m)->m_len = (_m)->m_pkthdr.len; \ 293878ed226SJulian Elischer } while (0) 294878ed226SJulian Elischer 295878ed226SJulian Elischer /* L2CAP_DisconnectReq */ 296878ed226SJulian Elischer #define _ng_l2cap_discon_req(_m, _ident, _dcid, _scid) \ 297878ed226SJulian Elischer do { \ 298878ed226SJulian Elischer struct _discon_req { \ 299878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 300878ed226SJulian Elischer ng_l2cap_discon_req_cp param; \ 301878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 302878ed226SJulian Elischer \ 303eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 304878ed226SJulian Elischer if ((_m) == NULL) \ 305878ed226SJulian Elischer break; \ 306878ed226SJulian Elischer \ 307878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 308878ed226SJulian Elischer \ 309878ed226SJulian Elischer c = mtod((_m), struct _discon_req *); \ 310878ed226SJulian Elischer c->hdr.code = NG_L2CAP_DISCON_REQ; \ 311878ed226SJulian Elischer c->hdr.ident = (_ident); \ 312878ed226SJulian Elischer c->hdr.length = htole16(sizeof(c->param)); \ 313878ed226SJulian Elischer \ 314878ed226SJulian Elischer c->param.dcid = htole16((_dcid)); \ 315878ed226SJulian Elischer c->param.scid = htole16((_scid)); \ 316878ed226SJulian Elischer } while (0) 317878ed226SJulian Elischer 318878ed226SJulian Elischer /* L2CA_DisconnectRsp */ 319878ed226SJulian Elischer #define _ng_l2cap_discon_rsp(_m, _ident, _dcid, _scid) \ 320878ed226SJulian Elischer do { \ 321878ed226SJulian Elischer struct _discon_rsp { \ 322878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 323878ed226SJulian Elischer ng_l2cap_discon_rsp_cp param; \ 324878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 325878ed226SJulian Elischer \ 326eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 327878ed226SJulian Elischer if ((_m) == NULL) \ 328878ed226SJulian Elischer break; \ 329878ed226SJulian Elischer \ 330878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 331878ed226SJulian Elischer \ 332878ed226SJulian Elischer c = mtod((_m), struct _discon_rsp *); \ 333878ed226SJulian Elischer c->hdr.code = NG_L2CAP_DISCON_RSP; \ 334878ed226SJulian Elischer c->hdr.ident = (_ident); \ 335878ed226SJulian Elischer c->hdr.length = htole16(sizeof(c->param)); \ 336878ed226SJulian Elischer \ 337878ed226SJulian Elischer c->param.dcid = htole16((_dcid)); \ 338878ed226SJulian Elischer c->param.scid = htole16((_scid)); \ 339878ed226SJulian Elischer } while (0) 340878ed226SJulian Elischer 341878ed226SJulian Elischer /* L2CAP_EchoReq */ 342878ed226SJulian Elischer #define _ng_l2cap_echo_req(_m, _ident, _data, _size) \ 343878ed226SJulian Elischer do { \ 344878ed226SJulian Elischer ng_l2cap_cmd_hdr_t *c = NULL; \ 345878ed226SJulian Elischer \ 346eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 347878ed226SJulian Elischer if ((_m) == NULL) \ 348878ed226SJulian Elischer break; \ 349878ed226SJulian Elischer \ 350878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 351878ed226SJulian Elischer \ 352878ed226SJulian Elischer c = mtod((_m), ng_l2cap_cmd_hdr_t *); \ 353878ed226SJulian Elischer c->code = NG_L2CAP_ECHO_REQ; \ 354878ed226SJulian Elischer c->ident = (_ident); \ 355878ed226SJulian Elischer c->length = 0; \ 356878ed226SJulian Elischer \ 357878ed226SJulian Elischer if ((_data) != NULL) { \ 358878ed226SJulian Elischer m_copyback((_m), sizeof(*c), (_size), (_data)); \ 359878ed226SJulian Elischer c->length += (_size); \ 360878ed226SJulian Elischer } \ 361878ed226SJulian Elischer \ 362878ed226SJulian Elischer c->length = htole16(c->length); \ 363878ed226SJulian Elischer } while (0) 364878ed226SJulian Elischer 365878ed226SJulian Elischer /* L2CAP_InfoReq */ 366878ed226SJulian Elischer #define _ng_l2cap_info_req(_m, _ident, _type) \ 367878ed226SJulian Elischer do { \ 368878ed226SJulian Elischer struct _info_req { \ 369878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 370878ed226SJulian Elischer ng_l2cap_info_req_cp param; \ 371878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 372878ed226SJulian Elischer \ 373eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 374878ed226SJulian Elischer if ((_m) == NULL) \ 375878ed226SJulian Elischer break; \ 376878ed226SJulian Elischer \ 377878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \ 378878ed226SJulian Elischer \ 379878ed226SJulian Elischer c = mtod((_m), struct _info_req *); \ 380878ed226SJulian Elischer c->hdr.code = NG_L2CAP_INFO_REQ; \ 381878ed226SJulian Elischer c->hdr.ident = (_ident); \ 382878ed226SJulian Elischer c->hdr.length = htole16(sizeof(c->param)); \ 383878ed226SJulian Elischer \ 384878ed226SJulian Elischer c->param.type = htole16((_type)); \ 385878ed226SJulian Elischer } while (0) 386878ed226SJulian Elischer 387878ed226SJulian Elischer /* L2CAP_InfoRsp */ 388878ed226SJulian Elischer #define _ng_l2cap_info_rsp(_m, _ident, _type, _result, _mtu) \ 389878ed226SJulian Elischer do { \ 390878ed226SJulian Elischer struct _info_rsp { \ 391878ed226SJulian Elischer ng_l2cap_cmd_hdr_t hdr; \ 392878ed226SJulian Elischer ng_l2cap_info_rsp_cp param; \ 393878ed226SJulian Elischer ng_l2cap_info_rsp_data_t data; \ 394878ed226SJulian Elischer } __attribute__ ((packed)) *c = NULL; \ 395878ed226SJulian Elischer \ 396eb1b1807SGleb Smirnoff MGETHDR((_m), M_NOWAIT, MT_DATA); \ 397878ed226SJulian Elischer if ((_m) == NULL) \ 398878ed226SJulian Elischer break; \ 399878ed226SJulian Elischer \ 400878ed226SJulian Elischer c = mtod((_m), struct _info_rsp *); \ 401fae16029SMaksim Yevmenkin c->hdr.code = NG_L2CAP_INFO_RSP; \ 402878ed226SJulian Elischer c->hdr.ident = (_ident); \ 403878ed226SJulian Elischer c->hdr.length = sizeof(c->param); \ 404878ed226SJulian Elischer \ 405878ed226SJulian Elischer c->param.type = htole16((_type)); \ 406878ed226SJulian Elischer c->param.result = htole16((_result)); \ 407878ed226SJulian Elischer \ 408878ed226SJulian Elischer if ((_result) == NG_L2CAP_SUCCESS) { \ 409878ed226SJulian Elischer switch ((_type)) { \ 410878ed226SJulian Elischer case NG_L2CAP_CONNLESS_MTU: \ 411878ed226SJulian Elischer c->data.mtu.mtu = htole16((_mtu)); \ 412878ed226SJulian Elischer c->hdr.length += sizeof((c->data.mtu.mtu)); \ 413878ed226SJulian Elischer break; \ 414878ed226SJulian Elischer } \ 415878ed226SJulian Elischer } \ 416878ed226SJulian Elischer \ 417878ed226SJulian Elischer (_m)->m_pkthdr.len = (_m)->m_len = sizeof(c->hdr) + \ 418878ed226SJulian Elischer c->hdr.length; \ 419878ed226SJulian Elischer \ 420878ed226SJulian Elischer c->hdr.length = htole16(c->hdr.length); \ 421878ed226SJulian Elischer } while (0) 422878ed226SJulian Elischer 423878ed226SJulian Elischer void ng_l2cap_con_wakeup (ng_l2cap_con_p); 424878ed226SJulian Elischer void ng_l2cap_con_fail (ng_l2cap_con_p, u_int16_t); 425878ed226SJulian Elischer void ng_l2cap_process_command_timeout (node_p, hook_p, void *, int); 426878ed226SJulian Elischer 427878ed226SJulian Elischer #endif /* ndef _NETGRAPH_L2CAP_CMDS_H_ */ 428878ed226SJulian Elischer 429