re/src/stun/hdr.c
Alfred E. Heggestad 6648fd2393 update splash
2010-11-03 11:34:14 +00:00

82 lines
1.8 KiB
C

/**
* @file stun/hdr.c STUN Header encoding
*
* Copyright (C) 2010 Creytiv.com
*/
#include <re_types.h>
#include <re_mbuf.h>
#include <re_sa.h>
#include <re_list.h>
#include <re_stun.h>
#include "stun.h"
int stun_hdr_encode(struct mbuf *mb, const struct stun_hdr *hdr)
{
int err = 0;
if (!mb || !hdr)
return EINVAL;
err |= mbuf_write_u16(mb, htons(hdr->type & 0x3fff));
err |= mbuf_write_u16(mb, htons(hdr->len));
err |= mbuf_write_u32(mb, htonl(hdr->cookie));
err |= mbuf_write_mem(mb, hdr->tid, sizeof(hdr->tid));
return err;
}
int stun_hdr_decode(struct mbuf *mb, struct stun_hdr *hdr)
{
if (!mb || !hdr)
return EINVAL;
if (mbuf_get_left(mb) < STUN_HEADER_SIZE)
return EBADMSG;
hdr->type = ntohs(mbuf_read_u16(mb));
if (hdr->type & 0xc000)
return EBADMSG;
hdr->len = ntohs(mbuf_read_u16(mb));
if (hdr->len & 0x3)
return EBADMSG;
hdr->cookie = ntohl(mbuf_read_u32(mb));
(void)mbuf_read_mem(mb, hdr->tid, sizeof(hdr->tid));
if (mbuf_get_left(mb) < hdr->len)
return EBADMSG;
return 0;
}
const char *stun_class_name(uint16_t class)
{
switch (class) {
case STUN_CLASS_REQUEST: return "Request";
case STUN_CLASS_INDICATION: return "Indication";
case STUN_CLASS_SUCCESS_RESP: return "Success Response";
case STUN_CLASS_ERROR_RESP: return "Error Response";
default: return "???";
}
}
const char *stun_method_name(uint16_t method)
{
switch (method) {
case STUN_METHOD_BINDING: return "Binding";
case STUN_METHOD_ALLOCATE: return "Allocate";
case STUN_METHOD_REFRESH: return "Refresh";
case STUN_METHOD_SEND: return "Send";
case STUN_METHOD_DATA: return "Data";
case STUN_METHOD_CREATEPERM: return "CreatePermission";
case STUN_METHOD_CHANBIND: return "ChannelBind";
default: return "???";
}
}