/* Functions for level 3 net/rom support
 * Copyright 1989 Dan Frank, W9NK
 */
#include "global.h"
#ifdef NETROM
#include "mbuf.h"
#include "timer.h"
#include "proc.h"
#include "ax25.h"
#include "netrom.h"
#include "lapb.h"
#include <ctype.h>
  
/* Convert a net/rom network header to host format structure
 * Return -1 if error, 0 if OK
 */
  
int
ntohnr3(hdr,bpp)
register struct nr3hdr *hdr;    /* output structure */
struct mbuf **bpp;
{
    int ttl;
  
    if(pullup(bpp,hdr->source,AXALEN) < AXALEN)
        return -1;
  
    if(pullup(bpp,hdr->dest,AXALEN) < AXALEN)
        return -1;
  
    if((ttl = PULLCHAR(bpp)) == -1)
        return -1;
  
    hdr->ttl = ttl;
  
    return 0;
}
  
/* Convert a host-format net/rom level 3 header into an mbuf ready
 * for transmission.
 */
  
struct mbuf *
htonnr3(hdr)
register struct nr3hdr *hdr;
{
    struct mbuf *rbuf;
    register char *cp;
  
    if(hdr == (struct nr3hdr *) NULL)
        return NULLBUF;
  
    /* Allocate space for return buffer */
    if((rbuf = alloc_mbuf(NR3HLEN)) == NULLBUF)
        return NULLBUF;
  
    rbuf->cnt = NR3HLEN;
  
    /* Now convert */
    cp = rbuf->data;
  
    memcpy(cp,hdr->source,AXALEN);
    cp[ALEN] &= ~E;     /* source E-bit is always off */
    cp += AXALEN;
    memcpy(cp,hdr->dest,AXALEN);
    cp[ALEN] |= E;      /* destination E-bit always set */
    cp += AXALEN;
    *cp = hdr->ttl;
  
    return rbuf;
}
  
/* Convert a net/rom routing broadcast destination subpacket from
 * network format to a host format structure.  Return -1 if error,
 * 0 if OK.
 */
int
ntohnrdest(ds,bpp)
register struct nr3dest *ds;
struct mbuf **bpp;
{
    int quality;
  
    /* get destination callsign */
    if(pullup(bpp,ds->dest,AXALEN) < AXALEN)
        return -1;
  
    /* get destination alias */
    if(pullup(bpp,ds->alias,ALEN) < ALEN)
        return -1;
    ds->alias[ALEN] = '\0';
  
    /* get best neighbor callsign */
    if(pullup(bpp,ds->neighbor,AXALEN) < AXALEN)
        return -1;
  
    /* get route quality */
    if((quality = PULLCHAR(bpp)) == -1)
        return -1;
    ds->quality = uchar(quality);
  
    return 0;
}
  
/* Convert a host-format net/rom destination subpacket into an
 * mbuf ready for transmission as part of a route broadcast
 * packet.
 */
struct mbuf *
htonnrdest(ds)
register struct nr3dest *ds;
{
    struct mbuf *rbuf;
    register char *cp;
  
    if(ds == (struct nr3dest *) NULL)
        return NULLBUF;
  
    /* Allocate space for return buffer */
    if((rbuf = alloc_mbuf(NRRTDESTLEN)) == NULLBUF)
        return NULLBUF;
  
    rbuf->cnt = NRRTDESTLEN;
  
    cp = rbuf->data;
  
    memcpy(cp,ds->dest,AXALEN);
    cp += AXALEN;
  
    memcpy(cp,ds->alias,ALEN);
    cp += ALEN;
  
    memcpy(cp,ds->neighbor,AXALEN);
    cp += AXALEN;
  
    *cp = uchar(ds->quality);
  
    return rbuf;
}
  
#endif /* NETROM */
  
