Contiki-NG
coap-block1.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, Lars Schmertmann <SmallLars@t-online.de>.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the Institute nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * This file is part of the Contiki operating system.
30  */
31 
32 /**
33  * \file
34  * CoAP module for block 1 handling
35  * \author
36  * Lars Schmertmann <SmallLars@t-online.de>
37  */
38 
39 /**
40  * \addtogroup coap
41  * @{
42  */
43 
44 #include <string.h>
45 #include <inttypes.h>
46 
47 #include "coap.h"
48 #include "coap-block1.h"
49 
50 /* Log configuration */
51 #include "coap-log.h"
52 #define LOG_MODULE "coap"
53 #define LOG_LEVEL LOG_LEVEL_COAP
54 
55 /*---------------------------------------------------------------------------*/
56 
57 /**
58  * \brief Block 1 support within a coap-ressource
59  *
60  * This function will help you to use block 1. If target is null
61  * error handling and response configuration is active. On return
62  * value 0, the last block was recived, while on return value 1
63  * more blocks will follow. With target, len and maxlen this
64  * function will assemble the blocks.
65  *
66  * You can find an example in:
67  * examples/er-rest-example/resources/res-b1-sep-b2.c
68  *
69  * \param request Request pointer from the handler
70  * \param response Response pointer from the handler
71  * \param target Pointer to the buffer where the request payload can be assembled
72  * \param len Pointer to the variable, where the function stores the actual length
73  * \param max_len Length of the "target"-Buffer
74  *
75  * \return 0 if initialisation was successful
76  * -1 if initialisation failed
77  */
78 int
79 coap_block1_handler(coap_message_t *request, coap_message_t *response,
80  uint8_t *target, size_t *len, size_t max_len)
81 {
82  const uint8_t *payload = 0;
83  int pay_len = coap_get_payload(request, &payload);
84 
85  if(!pay_len || !payload) {
86  coap_status_code = BAD_REQUEST_4_00;
87  coap_error_message = "NoPayload";
88  return -1;
89  }
90 
91  if(request->block1_offset + pay_len > max_len) {
92  coap_status_code = REQUEST_ENTITY_TOO_LARGE_4_13;
93  coap_error_message = "Message to big";
94  return -1;
95  }
96 
97  if(target && len) {
98  memcpy(target + request->block1_offset, payload, pay_len);
99  *len = request->block1_offset + pay_len;
100  }
101 
102  if(coap_is_option(request, COAP_OPTION_BLOCK1)) {
103  LOG_DBG("Blockwise: block 1 request: Num: %"PRIu32
104  ", More: %u, Size: %u, Offset: %"PRIu32"\n",
105  request->block1_num,
106  request->block1_more,
107  request->block1_size,
108  request->block1_offset);
109 
110  coap_set_header_block1(response, request->block1_num, request->block1_more, request->block1_size);
111  if(request->block1_more) {
112  coap_set_status_code(response, CONTINUE_2_31);
113  return 1;
114  }
115  }
116 
117  return 0;
118 }
119 /*---------------------------------------------------------------------------*/
120 /** @} */
Log support for CoAP
CoAP module for block 1 handling
An implementation of the Constrained Application Protocol (RFC 7252).
int coap_block1_handler(coap_message_t *request, coap_message_t *response, uint8_t *target, size_t *len, size_t max_len)
Block 1 support within a coap-ressource.
Definition: coap-block1.c:79