Add toolchain and mbtk source
Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_lib/inc/mbtk_coap_pdu.h b/mbtk/mbtk_lib/inc/mbtk_coap_pdu.h
new file mode 100644
index 0000000..334301a
--- /dev/null
+++ b/mbtk/mbtk_lib/inc/mbtk_coap_pdu.h
@@ -0,0 +1,288 @@
+
+#ifndef __MBTK_COAP_H__
+#define __MBTK_COAP_H__
+#include <stdint.h>
+//#include "ps_in.h"
+#include "ds_ASBuffer.h"
+#include "mbtk_type.h"
+
+#define COAP_HDR_SIZE 4
+#define COAP_OPTION_HDR_BYTE 1
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+//typedef unsigned long uint32_t;
+typedef unsigned long long uint64_t;
+
+/*
+enum ds_appsrv_mem_e_type { APPSRV_MEM };
+
+void* operator new(unsigned int size, void* alloc, ds_appsrv_mem_e_type mem_type) throw();
+void operator delete(void* obj, void* alloc, ds_appsrv_mem_e_type mem_type) throw();
+*/
+
+#define ps_ntohs(x) \
+ (((((uint16)(x) & 0x00FF) << 8) | (((uint16)(x) & 0xFF00) >> 8)))
+
+
+#define endian_be16(x) ps_ntohs(x)
+
+#define endian_load16(cast, from) ((cast)( \
+ (((uint16_t)((uint8_t*)(from))[0]) << 8) | \
+ (((uint16_t)((uint8_t*)(from))[1]) ) ))
+
+#define endian_load32(cast, from) ((cast)( \
+ (((uint32_t)((uint8_t*)(from))[0]) << 24) | \
+ (((uint32_t)((uint8_t*)(from))[1]) << 16) | \
+ (((uint32_t)((uint8_t*)(from))[2]) << 8) | \
+ (((uint32_t)((uint8_t*)(from))[3]) ) ))
+
+#define endian_load64(cast, from) ((cast)( \
+ (((uint64_t)((uint8_t*)(from))[0]) << 56) | \
+ (((uint64_t)((uint8_t*)(from))[1]) << 48) | \
+ (((uint64_t)((uint8_t*)(from))[2]) << 40) | \
+ (((uint64_t)((uint8_t*)(from))[3]) << 32) | \
+ (((uint64_t)((uint8_t*)(from))[4]) << 24) | \
+ (((uint64_t)((uint8_t*)(from))[5]) << 16) | \
+ (((uint64_t)((uint8_t*)(from))[6]) << 8) | \
+ (((uint64_t)((uint8_t*)(from))[7]) ) ))
+
+#define endian_store16(to, num) \
+ do { uint16_t val = endian_be16(num); memcpy(to, &val, 2); } while(0)
+
+// CoAP PDU format
+
+// 0 1 2 3
+// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// |Ver| T | TKL | Code | Message ID |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Token (if any, TKL bytes) ...
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Options (if any) ...
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// |1 1 1 1 1 1 1 1| Payload (if any) ...
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+class CoapPDU
+{
+
+
+public:
+ /// CoAP message types. Note, values only work as enum.
+ enum Type
+ {
+ COAP_CONFIRMABLE=0x00,
+ COAP_NON_CONFIRMABLE=0x10,
+ COAP_ACKNOWLEDGEMENT=0x20,
+ COAP_RESET=0x30
+ };
+
+ // CoAP response codes.
+ enum Code
+ {
+ COAP_EMPTY=0x00,
+ COAP_GET,
+ COAP_POST,
+ COAP_PUT,
+ COAP_DELETE,
+ COAP_LASTMETHOD=0x1F,
+ COAP_CREATED=0x41,
+ COAP_DELETED,
+ COAP_VALID,
+ COAP_CHANGED,
+ COAP_CONTENT,
+ COAP_CONTINUE=0x5F,
+ COAP_BAD_REQUEST=0x80,
+ COAP_UNAUTHORIZED,
+ COAP_BAD_OPTION,
+ COAP_FORBIDDEN,
+ COAP_NOT_FOUND,
+ COAP_METHOD_NOT_ALLOWED,
+ COAP_NOT_ACCEPTABLE,
+ COAP_PRECONDITION_FAILED=0x8C,
+ COAP_REQUEST_ENTITY_TOO_LARGE=0x8D,
+ COAP_UNSUPPORTED_CONTENT_FORMAT=0x8F,
+ COAP_INTERNAL_SERVER_ERROR=0xA0,
+ COAP_NOT_IMPLEMENTED,
+ COAP_BAD_GATEWAY,
+ COAP_SERVICE_UNAVAILABLE,
+ COAP_GATEWAY_TIMEOUT,
+ COAP_PROXYING_NOT_SUPPORTED,
+ COAP_UNDEFINED_CODE=0xFF
+ };
+
+ /// CoAP option numbers.
+ enum Option
+ {
+ COAP_OPTION_IF_MATCH=1,
+ COAP_OPTION_URI_HOST=3,
+ COAP_OPTION_ETAG,
+ COAP_OPTION_IF_NONE_MATCH,
+ COAP_OPTION_OBSERVE,
+ COAP_OPTION_URI_PORT,
+ COAP_OPTION_LOCATION_PATH,
+ COAP_OPTION_URI_PATH=11,
+ COAP_OPTION_CONTENT_FORMAT,
+ COAP_OPTION_MAX_AGE=14,
+ COAP_OPTION_URI_QUERY,
+ COAP_OPTION_ACCEPT=17,
+ COAP_OPTION_LOCATION_QUERY=20,
+ COAP_OPTION_BLOCK2=23,
+ COAP_OPTION_BLOCK1=27,
+ COAP_OPTION_SIZE2,
+ COAP_OPTION_PROXY_URI=35,
+ COAP_OPTION_PROXY_SCHEME=39,
+ COAP_OPTION_SIZE1=60
+ };
+
+ /// CoAP content-formats.
+ enum ContentFormat
+ {
+ COAP_CONTENT_FORMAT_TEXT_PLAIN = 0,
+ COAP_CONTENT_FORMAT_APP_LINK = 40,
+ COAP_CONTENT_FORMAT_APP_XML,
+ COAP_CONTENT_FORMAT_APP_OCTET,
+ COAP_CONTENT_FORMAT_APP_EXI = 47,
+ COAP_CONTENT_FORMAT_APP_JSON = 50
+ };
+
+ /// Sequence of these is returned by CoapPDU::getOptions()
+ struct CoapOption
+ {
+ uint16_t optionDelta;
+ uint16_t optionNumber;
+ uint16_t optionValueLength;
+ int totalLength;
+ uint8_t *optionPointer;
+ uint8_t *optionValuePointer;
+ };
+
+ // construction and destruction
+ CoapPDU();
+ CoapPDU(uint8_t *buffer, int bufferLength, int pduLength);
+ ~CoapPDU();
+ int reset();
+ int validate();
+
+ // version
+ int setVersion(uint8_t version);
+ uint8_t getVersion();
+
+ // message type
+ void setType(int type);
+ int getType();
+
+ // tokens
+ int setTokenLength(uint8_t tokenLength);
+ int getTokenLength();
+ uint8_t* getTokenPointer();
+ int setToken(uint8_t *token, uint8_t tokenLength);
+
+ // message code
+ void setCode(int code);
+ int getCode();
+ int httpStatusToCode(int httpStatus);
+
+ // message ID
+ int setMessageID(uint16_t messageID);
+ uint16_t getMessageID();
+
+ // options
+ int addOption(uint16_t optionNumber, uint16_t optionLength, uint8_t *optionValue);
+ // gets a list of all options
+ CoapOption* getOptions();
+ int getNumOptions();
+ // shorthand helpers
+ int setURI(char *uri);
+ int setURI(char *uri, int urilen);
+ int getURI(char *dst, int dstlen, int *outLen);
+ int addURIQuery(char *query);
+
+ // content format helper
+ int setContentFormat(int format);
+
+ // payload
+ uint8_t* mallocPayload(int bytes);
+ int setPayload(uint8_t *value, int len);
+ uint8_t* getPayloadPointer();
+ int getPayloadLength();
+ uint8_t* getPayloadCopy();
+
+ // pdu
+ int getPDULength();
+ uint8_t* getPDUPointer();
+ void setPDULength(int len);
+ void getOptionValueById(uint16_t optionNumber, uint16_t *optionValueLength,uint8_t *optionValuePointer);
+ const char *printHuman();
+ const char * printHex();
+ int hasOption(uint16_t optionNumber);
+private:
+ // variables
+ uint8_t *_pdu;
+ int _pduLength;
+
+ int _constructedFromBuffer;
+ int _bufferLength;
+
+ uint8_t *_payloadPointer;
+ int _payloadLength;
+
+ int _numOptions;
+ uint16_t _maxAddedOptionNumber;
+ ASBuffer content;
+
+ // functions
+ void shiftPDUUp(int shiftOffset, int shiftAmount);
+ void shiftPDUDown(int startLocation, int shiftOffset, int shiftAmount);
+ uint8_t codeToValue(int c);
+
+ // option stuff
+ int findInsertionPosition(uint16_t optionNumber, uint16_t *prevOptionNumber);
+ int computeExtraBytes(uint16_t n);
+ int insertOption(int insertionPosition, uint16_t optionDelta, uint16_t optionValueLength, uint8_t *optionValue);
+ uint16_t getOptionDelta(uint8_t *option);
+ void setOptionDelta(int optionPosition, uint16_t optionDelta);
+ uint16_t getOptionValueLength(uint8_t *option);
+
+};
+
+/*
+#define COAP_CODE_EMPTY 0x00
+
+// method codes 0.01-0.31
+#define COAP_CODE_GET 0x01
+#define COAP_CODE_POST 0x02
+#define COAP_CODE_PUT 0x03
+#define COAP_CODE_DELETE 0x04
+
+// Response codes 2.00 - 5.31
+// 2.00 - 2.05
+#define COAP_CODE_CREATED 0x41
+#define COAP_CODE_DELETED 0x42
+#define COAP_CODE_VALID 0x43
+#define COAP_CODE_CHANGED 0x44
+#define COAP_CODE_CONTENT 0x45
+
+// 4.00 - 4.15
+#define COAP_CODE_BAD_REQUEST 0x80
+#define COAP_CODE_UNAUTHORIZED 0x81
+#define COAP_CODE_BAD_OPTION 0x82
+#define COAP_CODE_FORBIDDEN 0x83
+#define COAP_CODE_NOT_FOUND 0x84
+#define COAP_CODE_METHOD_NOT_ALLOWED 0x85
+#define COAP_CODE_NOT_ACCEPTABLE 0x86
+#define COAP_CODE_PRECONDITION_FAILED 0x8C
+#define COAP_CODE_REQUEST_ENTITY_TOO_LARGE 0x8D
+#define COAP_CODE_UNSUPPORTED_CONTENT_FORMAT 0x8F
+
+// 5.00 - 5.05
+#define COAP_CODE_INTERNAL_SERVER_ERROR 0xA0
+#define COAP_CODE_NOT_IMPLEMENTED 0xA1
+#define COAP_CODE_BAD_GATEWAY 0xA2
+#define COAP_CODE_SERVICE_UNAVAILABLE 0xA3
+#define COAP_CODE_GATEWAY_TIMEOUT 0xA4
+#define COAP_CODE_PROXYING_NOT_SUPPORTED 0xA5
+*/
+
+#endif