module PAP_Types { /* (C) 2019 by Harald Welte * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or * (at your option) any later version. * * SPDX-License-Identifier: GPL-2.0-or-later */ import from Osmocom_Types all; /* RFC1334 */ type enumerated PapCode { PAP_AuthenticateReq ('01'O), PAP_AuthenticateAck ('02'O), PAP_AuthenticateNak ('03'O) } with { variant "FIELDLENGTH(8)" }; type record PapPacket { PapCode code, uint8_t identifier, uint16_t len, PapPayloadUnion payload } with { variant (len) "LENGTHTO(code,identifier,len,payload)" variant (payload) "CROSSTAG( req, code = PAP_AuthenticateReq; ack, code = PAP_AuthenticateAck; nak, code = PAP_AuthenticateNak)" }; type union PapPayloadUnion { PapAuthReq req, PapAuthResp ack, PapAuthResp nak }; type record PapAuthReq { uint8_t peer_id_len, octetstring peer_id, uint8_t passwd_len, octetstring passwd } with { variant (peer_id_len) "LENGTHTO(peer_id)" variant (passwd_len) "LENGTHTO(passwd)" }; type record PapAuthResp { uint8_t msg_len, charstring msg } with { variant (msg_len) "LENGTHTO(msg)" }; external function enc_PapPacket(in PapPacket inp) return octetstring with { extension "prototype(convert)" extension "encode(RAW)" }; external function dec_PapPacket(in octetstring inp) return PapPacket with { extension "prototype(convert)" extension "decode(RAW)" }; template (value) PapPacket ts_PAP(template (value) PapCode code, template (value) uint8_t identifier, template (value) PapPayloadUnion payload) := { code := code, identifier := identifier, len := 0, /* overwritten */ payload := payload } template PapPacket tr_PAP(template PapCode code, template uint8_t identifier, template PapPayloadUnion payload) := { code := code, identifier := identifier, len := ?, payload := payload } template (value) PapPacket ts_PAP_AuthReq(uint8_t identifier := 0, octetstring peer_id, octetstring passwd) := ts_PAP(PAP_AuthenticateReq, identifier, { req := { peer_id_len := 0, peer_id := peer_id, passwd_len := 0, passwd := passwd } }); template PapPacket tr_PAP_AuthReq(template uint8_t identifier := ?, octetstring peer_id, octetstring passwd) := tr_PAP(PAP_AuthenticateReq, identifier, { req := { peer_id_len := ?, peer_id := peer_id, passwd_len := ?, passwd := passwd } }); template (value) PapPacket ts_PAP_AuthAck(uint8_t identifier := 0, charstring msg) := ts_PAP(PAP_AuthenticateAck, identifier, { ack := { msg_len := 0, msg := msg } }); template PapPacket tr_PAP_AuthAck(template uint8_t identifier := ?) := tr_PAP(PAP_AuthenticateAck, identifier, { ack := ? }); template (value) PapPacket ts_PAP_AuthNak(uint8_t identifier := 0, charstring msg) := ts_PAP(PAP_AuthenticateNak, identifier, { nak := { msg_len := 0, msg := msg } }); template PapPacket tr_PAP_AuthNak(template uint8_t identifier := ?) := tr_PAP(PAP_AuthenticateNak, identifier, { nak := ? }); } with { encode "RAW" ; variant "FIELDORDER(msb)" }