123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909 |
- #define AX25_PAD_C
- #include "direwolf.h"
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include <stdio.h>
- #include <ctype.h>
- #include "ax25_pad.h"
- #include "ax25_pad2.h"
- extern int ax25memdebug;
- static int set_addrs (packet_t pp, char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr);
-
- #if AX25MEMDEBUG
- packet_t ax25_u_frame_debug (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, ax25_frame_type_t ftype, int pf, int pid, unsigned char *pinfo, int info_len, char *src_file, int src_line)
- #else
- packet_t ax25_u_frame (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, ax25_frame_type_t ftype, int pf, int pid, unsigned char *pinfo, int info_len)
- #endif
- {
- packet_t this_p;
- unsigned char *p;
- int ctrl = 0;
- unsigned int t = 999;
- int i = 0;
- this_p = ax25_new ();
- #if AX25MEMDEBUG
- if (ax25memdebug) {
- printf ("ax25_u_frame, seq=%d, called from %s %d\n", this_p->seq, src_file, src_line);
- }
- #endif
-
- if (this_p == NULL) return (NULL);
- this_p->modulo = 0;
- if ( ! set_addrs (this_p, addrs, num_addr, cr)) {
- printf ("Internal error in %s: Could not set addresses for U frame.\n", __func__);
- ax25_delete (this_p);
- return (NULL);
- }
- switch (ftype) {
-
- case frame_type_U_SABME: ctrl = 0x6f; t = 1; break;
- case frame_type_U_SABM: ctrl = 0x2f; t = 1; break;
- case frame_type_U_DISC: ctrl = 0x43; t = 1; break;
- case frame_type_U_DM: ctrl = 0x0f; t = 0; break;
- case frame_type_U_UA: ctrl = 0x63; t = 0; break;
- case frame_type_U_FRMR: ctrl = 0x87; t = 0; i = 1; break;
- case frame_type_U_UI: ctrl = 0x03; t = 2; i = 1; break;
- case frame_type_U_XID: ctrl = 0xaf; t = 2; i = 1; break;
- case frame_type_U_TEST: ctrl = 0xe3; t = 2; i = 1; break;
- default:
- printf ("Internal error in %s: Invalid ftype %d for U frame.\n", __func__, ftype);
- ax25_delete (this_p);
- return (NULL);
- break;
- }
- if (pf) ctrl |= 0x10;
- if (t != 2) {
- if (cr != t) {
- printf ("Internal error in %s: U frame, cr is %d but must be %d. ftype=%d\n", __func__, cr, t, ftype);
- }
- }
- p = this_p->frame_data + this_p->frame_len;
- *p++ = ctrl;
- this_p->frame_len++;
- if (ftype == frame_type_U_UI) {
-
-
- if (pid < 0 || pid == 0 || pid == 0xff) {
- printf ("Internal error in %s: U frame, Invalid pid value 0x%02x.\n", __func__, pid);
- pid = AX25_PID_NO_LAYER_3;
- }
- *p++ = pid;
- this_p->frame_len++;
- }
- if (i) {
- if (pinfo != NULL && info_len > 0) {
- if (info_len > AX25_MAX_INFO_LEN) {
- printf ("Internal error in %s: U frame, Invalid information field length %d.\n", __func__, info_len);
- info_len = AX25_MAX_INFO_LEN;
- }
- memcpy (p, pinfo, info_len);
- p += info_len;
- this_p->frame_len += info_len;
- }
- }
- else {
- if (pinfo != NULL && info_len > 0) {
- printf ("Internal error in %s: Info part not allowed for U frame type.\n", __func__);
- }
- }
- *p = '\0';
- assert (p == this_p->frame_data + this_p->frame_len);
- assert (this_p->magic1 == MAGIC);
- assert (this_p->magic2 == MAGIC);
- #if PAD2TEST
- ax25_frame_type_t check_ftype;
- cmdres_t check_cr;
- char check_desc[80];
- int check_pf;
- int check_nr;
- int check_ns;
- check_ftype = ax25_frame_type (this_p, &check_cr, check_desc, &check_pf, &check_nr, &check_ns);
- printf ("check: ftype=%d, desc=\"%s\", pf=%d\n", check_ftype, check_desc, check_pf);
- assert (check_cr == cr);
- assert (check_ftype == ftype);
- assert (check_pf == pf);
- assert (check_nr == -1);
- assert (check_ns == -1);
- #endif
- return (this_p);
- }
-
- #if AX25MEMDEBUG
- packet_t ax25_s_frame_debug (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, ax25_frame_type_t ftype, int modulo, int nr, int pf, unsigned char *pinfo, int info_len, char *src_file, int src_line)
- #else
- packet_t ax25_s_frame (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, ax25_frame_type_t ftype, int modulo, int nr, int pf, unsigned char *pinfo, int info_len)
- #endif
- {
- packet_t this_p;
- unsigned char *p;
- int ctrl = 0;
- this_p = ax25_new ();
- #if AX25MEMDEBUG
- if (ax25memdebug) {
- printf ("ax25_s_frame, seq=%d, called from %s %d\n", this_p->seq, src_file, src_line);
- }
- #endif
-
- if (this_p == NULL) return (NULL);
- if ( ! set_addrs (this_p, addrs, num_addr, cr)) {
- printf ("Internal error in %s: Could not set addresses for S frame.\n", __func__);
- ax25_delete (this_p);
- return (NULL);
- }
- if (modulo != 8 && modulo != 128) {
- printf ("Internal error in %s: Invalid modulo %d for S frame.\n", __func__, modulo);
- modulo = 8;
- }
- this_p->modulo = modulo;
- if (nr < 0 || nr >= modulo) {
- printf ("Internal error in %s: Invalid N(R) %d for S frame.\n", __func__, nr);
- nr &= (modulo - 1);
- }
-
-
- if (ftype == frame_type_S_SREJ && cr != cr_res) {
- printf ("Internal error in %s: SREJ must be response.\n", __func__);
- }
- switch (ftype) {
- case frame_type_S_RR: ctrl = 0x01; break;
- case frame_type_S_RNR: ctrl = 0x05; break;
- case frame_type_S_REJ: ctrl = 0x09; break;
- case frame_type_S_SREJ: ctrl = 0x0d; break;
- default:
- printf ("Internal error in %s: Invalid ftype %d for S frame.\n", __func__, ftype);
- ax25_delete (this_p);
- return (NULL);
- break;
- }
- p = this_p->frame_data + this_p->frame_len;
- if (modulo == 8) {
- if (pf) ctrl |= 0x10;
- ctrl |= nr << 5;
- *p++ = ctrl;
- this_p->frame_len++;
- }
- else {
- *p++ = ctrl;
- this_p->frame_len++;
-
- ctrl = pf & 1;
- ctrl |= nr << 1;
- *p++ = ctrl;
- this_p->frame_len++;
- }
- if (ftype == frame_type_S_SREJ) {
- if (pinfo != NULL && info_len > 0) {
- if (info_len > AX25_MAX_INFO_LEN) {
- printf ("Internal error in %s: SREJ frame, Invalid information field length %d.\n", __func__, info_len);
- info_len = AX25_MAX_INFO_LEN;
- }
- memcpy (p, pinfo, info_len);
- p += info_len;
- this_p->frame_len += info_len;
- }
- }
- else {
- if (pinfo != NULL || info_len != 0) {
- printf ("Internal error in %s: Info part not allowed for RR, RNR, REJ frame.\n", __func__);
- }
- }
- *p = '\0';
- assert (p == this_p->frame_data + this_p->frame_len);
- assert (this_p->magic1 == MAGIC);
- assert (this_p->magic2 == MAGIC);
- #if PAD2TEST
- ax25_frame_type_t check_ftype;
- cmdres_t check_cr;
- char check_desc[80];
- int check_pf;
- int check_nr;
- int check_ns;
-
-
- check_ftype = ax25_frame_type (this_p, &check_cr, check_desc, &check_pf, &check_nr, &check_ns);
- printf ("check: ftype=%d, desc=\"%s\", pf=%d, nr=%d\n", check_ftype, check_desc, check_pf, check_nr);
- assert (check_cr == cr);
- assert (check_ftype == ftype);
- assert (check_pf == pf);
- assert (check_nr == nr);
- assert (check_ns == -1);
- #endif
- return (this_p);
- }
-
- #if AX25MEMDEBUG
- packet_t ax25_i_frame_debug (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, int modulo, int nr, int ns, int pf, int pid, unsigned char *pinfo, int info_len, char *src_file, int src_line)
- #else
- packet_t ax25_i_frame (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr, int modulo, int nr, int ns, int pf, int pid, unsigned char *pinfo, int info_len)
- #endif
- {
- packet_t this_p;
- unsigned char *p;
- int ctrl = 0;
- this_p = ax25_new ();
- #if AX25MEMDEBUG
- if (ax25memdebug) {
- printf ("ax25_i_frame, seq=%d, called from %s %d\n", this_p->seq, src_file, src_line);
- }
- #endif
-
- if (this_p == NULL) return (NULL);
- if ( ! set_addrs (this_p, addrs, num_addr, cr)) {
- printf ("Internal error in %s: Could not set addresses for I frame.\n", __func__);
- ax25_delete (this_p);
- return (NULL);
- }
- if (modulo != 8 && modulo != 128) {
- printf ("Internal error in %s: Invalid modulo %d for I frame.\n", __func__, modulo);
- modulo = 8;
- }
- this_p->modulo = modulo;
- if (nr < 0 || nr >= modulo) {
- printf ("Internal error in %s: Invalid N(R) %d for I frame.\n", __func__, nr);
- nr &= (modulo - 1);
- }
- if (ns < 0 || ns >= modulo) {
- printf ("Internal error in %s: Invalid N(S) %d for I frame.\n", __func__, ns);
- ns &= (modulo - 1);
- }
- p = this_p->frame_data + this_p->frame_len;
- if (modulo == 8) {
- ctrl = (nr << 5) | (ns << 1);
- if (pf) ctrl |= 0x10;
- *p++ = ctrl;
- this_p->frame_len++;
- }
- else {
- ctrl = ns << 1;
- *p++ = ctrl;
- this_p->frame_len++;
- ctrl = nr << 1;
- if (pf) ctrl |= 0x01;
- *p++ = ctrl;
- this_p->frame_len++;
- }
-
-
- if (pid < 0 || pid == 0 || pid == 0xff) {
- printf ("Warning: Client application provided invalid PID value, 0x%02x, for I frame.\n", pid);
- pid = AX25_PID_NO_LAYER_3;
- }
- *p++ = pid;
- this_p->frame_len++;
- if (pinfo != NULL && info_len > 0) {
- if (info_len > AX25_MAX_INFO_LEN) {
- printf ("Internal error in %s: I frame, Invalid information field length %d.\n", __func__, info_len);
- info_len = AX25_MAX_INFO_LEN;
- }
- memcpy (p, pinfo, info_len);
- p += info_len;
- this_p->frame_len += info_len;
- }
- *p = '\0';
- assert (p == this_p->frame_data + this_p->frame_len);
- assert (this_p->magic1 == MAGIC);
- assert (this_p->magic2 == MAGIC);
- #if PAD2TEST
- ax25_frame_type_t check_ftype;
- cmdres_t check_cr;
- char check_desc[80];
- int check_pf;
- int check_nr;
- int check_ns;
- unsigned char *check_pinfo;
- int check_info_len;
- check_ftype = ax25_frame_type (this_p, &check_cr, check_desc, &check_pf, &check_nr, &check_ns);
- printf ("check: ftype=%d, desc=\"%s\", pf=%d, nr=%d, ns=%d\n", check_ftype, check_desc, check_pf, check_nr, check_ns);
- check_info_len = ax25_get_info (this_p, &check_pinfo);
- assert (check_cr == cr);
- assert (check_ftype == frame_type_I);
- assert (check_pf == pf);
- assert (check_nr == nr);
- assert (check_ns == ns);
- assert (check_info_len == info_len);
- assert (strcmp((char*)check_pinfo,(char*)pinfo) == 0);
- #endif
- return (this_p);
- }
- static int set_addrs (packet_t pp, char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, cmdres_t cr)
- {
- int n;
- assert (pp->frame_len == 0);
- assert (cr == cr_cmd || cr == cr_res);
- if (num_addr < AX25_MIN_ADDRS || num_addr > AX25_MAX_ADDRS) {
- printf ("INTERNAL ERROR: %s %s %d, num_addr = %d\n", __FILE__, __func__, __LINE__, num_addr);
- return (0);
- }
- for (n = 0; n < num_addr; n++) {
- unsigned char *pa = pp->frame_data + n * 7;
- int ok;
- int strict = 1;
- char oaddr[AX25_MAX_ADDR_LEN];
- int ssid;
- int heard;
- int j;
- ok = ax25_parse_addr (n, addrs[n], strict, oaddr, &ssid, &heard);
- if (! ok) return (0);
-
- memset (pa, ' ' << 1, 6);
- for (j = 0; oaddr[j]; j++) {
- pa[j] = oaddr[j] << 1;
- }
- pa += 6;
-
- *pa = 0x60 | ((ssid & 0xf) << 1);
-
- switch (n) {
- case AX25_DESTINATION:
- if (cr == cr_cmd) *pa |= 0x80;
- break;
- case AX25_SOURCE:
- if (cr == cr_res) *pa |= 0x80;
- break;
- default:
- break;
- }
-
- if (n == num_addr - 1) {
- *pa |= 1;
- }
- pp->frame_len += 7;
- }
- pp->num_addr = num_addr;
- return (1);
- }
- #define PAD2TEST 1
- #if PAD2TEST
- void test_ax25_pad2 (void)
- {
- char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN];
- int num_addr = 2;
- cmdres_t cr;
- ax25_frame_type_t ftype;
- int pf = 0;
- int pid = 0xf0;
- int modulo;
- int nr, ns;
- unsigned char *pinfo = NULL;
- int info_len = 0;
- packet_t pp;
- strcpy (addrs[0], "W2UB");
- strcpy (addrs[1], "WB2OSZ-15");
- num_addr = 2;
- for (ftype = frame_type_U_SABME; ftype <= frame_type_U_TEST; ftype++) {
- for (pf = 0; pf <= 1; pf++) {
- int cmin=0, cmax=0;
- switch (ftype) {
-
- case frame_type_U_SABME: cmin = 1; cmax = 1; break;
- case frame_type_U_SABM: cmin = 1; cmax = 1; break;
- case frame_type_U_DISC: cmin = 1; cmax = 1; break;
- case frame_type_U_DM: cmin = 0; cmax = 0; break;
- case frame_type_U_UA: cmin = 0; cmax = 0; break;
- case frame_type_U_FRMR: cmin = 0; cmax = 0; break;
- case frame_type_U_UI: cmin = 0; cmax = 1; break;
- case frame_type_U_XID: cmin = 0; cmax = 1; break;
- case frame_type_U_TEST: cmin = 0; cmax = 1; break;
- default: break;
- }
-
- for (cr = cmin; cr <= cmax; cr++) {
- printf ("\nConstruct U frame, cr=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_u_frame (addrs, num_addr, cr, ftype, pf, pid, pinfo, info_len);
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- }
- }
- printf ("\n----------\n\n");
- strcpy (addrs[2], "DIGI1-1");
- num_addr = 3;
- for (ftype = frame_type_S_RR; ftype <= frame_type_S_SREJ; ftype++) {
- for (pf = 0; pf <= 1; pf++) {
- modulo = 8;
- nr = modulo / 2 + 1;
- for (cr = 0; cr <= 1; cr++) {
- printf ("\nConstruct S frame, cmd=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_s_frame (addrs, num_addr, cr, ftype, modulo, nr, pf, NULL, 0);
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- modulo = 128;
- nr = modulo / 2 + 1;
- for (cr = 0; cr <= 1; cr++) {
- printf ("\nConstruct S frame, cmd=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_s_frame (addrs, num_addr, cr, ftype, modulo, nr, pf, NULL, 0);
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- }
- }
- static unsigned char srej_info[] = { 1<<1, 2<<1, 3<<1, 4<<1 };
- ftype = frame_type_S_SREJ;
- for (pf = 0; pf <= 1; pf++) {
- modulo = 128;
- nr = 127;
- cr = cr_res;
- printf ("\nConstruct Multi-SREJ S frame, cmd=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_s_frame (addrs, num_addr, cr, ftype, modulo, nr, pf, srej_info, (int)(sizeof(srej_info)));
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- printf ("\n----------\n\n");
- pinfo = (unsigned char*)"The rain in Spain stays mainly on the plain.";
- info_len = strlen((char*)pinfo);
- for (pf = 0; pf <= 1; pf++) {
- modulo = 8;
- nr = 0x55 & (modulo - 1);
- ns = 0xaa & (modulo - 1);
- for (cr = 0; cr <= 1; cr++) {
- printf ("\nConstruct I frame, cmd=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_i_frame (addrs, num_addr, cr, modulo, nr, ns, pf, pid, pinfo, info_len);
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- modulo = 128;
- nr = 0x55 & (modulo - 1);
- ns = 0xaa & (modulo - 1);
- for (cr = 0; cr <= 1; cr++) {
- printf ("\nConstruct I frame, cmd=%d, ftype=%d, pid=0x%02x\n", cr, ftype, pid);
- pp = ax25_i_frame (addrs, num_addr, cr, modulo, nr, ns, pf, pid, pinfo, info_len);
- ax25_hex_dump (pp);
- ax25_delete (pp);
- }
- }
- printf ("\n----------\n\n");
- printf ("\nSUCCESS!\n");
-
- }
- #endif
|