Changeset a35b458 in mainline for uspace/srv/net/inetsrv/icmpv6.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/icmpv6.c
r3061bc1 ra35b458 50 50 { 51 51 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmpv6_recv_echo_request()"); 52 52 53 53 if (dgram->size < sizeof(icmpv6_message_t)) 54 54 return EINVAL; 55 55 56 56 icmpv6_message_t *request = (icmpv6_message_t *) dgram->data; 57 57 size_t size = dgram->size; 58 58 59 59 addr128_t src_v6; 60 60 ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6); 61 61 62 62 addr128_t dest_v6; 63 63 ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6); 64 64 65 65 if ((src_ver != dest_ver) || (src_ver != ip_v6)) 66 66 return EINVAL; 67 67 68 68 icmpv6_message_t *reply = calloc(1, size); 69 69 if (reply == NULL) 70 70 return ENOMEM; 71 71 72 72 memcpy(reply, request, size); 73 73 74 74 reply->type = ICMPV6_ECHO_REPLY; 75 75 reply->code = 0; 76 76 reply->checksum = 0; 77 77 78 78 inet_dgram_t rdgram; 79 79 80 80 inet_get_srcaddr(&dgram->src, 0, &rdgram.src); 81 81 rdgram.dest = dgram->src; … … 84 84 rdgram.data = reply; 85 85 rdgram.size = size; 86 86 87 87 icmpv6_phdr_t phdr; 88 88 89 89 host2addr128_t_be(dest_v6, phdr.src_addr); 90 90 host2addr128_t_be(src_v6, phdr.dest_addr); … … 92 92 memset(phdr.zeroes, 0, 3); 93 93 phdr.next = IP_PROTO_ICMPV6; 94 94 95 95 uint16_t cs_phdr = 96 96 inet_checksum_calc(INET_CHECKSUM_INIT, &phdr, 97 97 sizeof(icmpv6_phdr_t)); 98 98 99 99 uint16_t cs_all = inet_checksum_calc(cs_phdr, reply, size); 100 100 101 101 reply->checksum = host2uint16_t_be(cs_all); 102 102 103 103 errno_t rc = inet_route_packet(&rdgram, IP_PROTO_ICMPV6, 104 104 INET6_HOP_LIMIT_MAX, 0); 105 105 106 106 free(reply); 107 107 108 108 return rc; 109 109 } … … 112 112 { 113 113 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmpv6_recv_echo_reply()"); 114 114 115 115 if (dgram->size < sizeof(icmpv6_message_t)) 116 116 return EINVAL; 117 117 118 118 inetping_sdu_t sdu; 119 119 120 120 sdu.src = dgram->src; 121 121 sdu.dest = dgram->dest; 122 122 123 123 icmpv6_message_t *reply = (icmpv6_message_t *) dgram->data; 124 124 125 125 sdu.seq_no = uint16_t_be2host(reply->un.echo.seq_no); 126 126 sdu.data = reply + sizeof(icmpv6_message_t); 127 127 sdu.size = dgram->size - sizeof(icmpv6_message_t); 128 128 129 129 uint16_t ident = uint16_t_be2host(reply->un.echo.ident); 130 130 131 131 return inetping_recv(ident, &sdu); 132 132 } … … 135 135 { 136 136 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmpv6_recv()"); 137 137 138 138 if (dgram->size < 1) 139 139 return EINVAL; 140 140 141 141 uint8_t type = *(uint8_t *) dgram->data; 142 142 143 143 switch (type) { 144 144 case ICMPV6_ECHO_REQUEST: … … 153 153 break; 154 154 } 155 155 156 156 return EINVAL; 157 157 } … … 163 163 if (rdata == NULL) 164 164 return ENOMEM; 165 165 166 166 icmpv6_message_t *request = (icmpv6_message_t *) rdata; 167 167 168 168 request->type = ICMPV6_ECHO_REQUEST; 169 169 request->code = 0; … … 171 171 request->un.echo.ident = host2uint16_t_be(ident); 172 172 request->un.echo.seq_no = host2uint16_t_be(sdu->seq_no); 173 173 174 174 memcpy(rdata + sizeof(icmpv6_message_t), sdu->data, sdu->size); 175 175 176 176 inet_dgram_t dgram; 177 177 178 178 dgram.src = sdu->src; 179 179 dgram.dest = sdu->dest; … … 182 182 dgram.data = rdata; 183 183 dgram.size = rsize; 184 184 185 185 icmpv6_phdr_t phdr; 186 186 187 187 assert(sdu->src.version == ip_v6); 188 188 assert(sdu->dest.version == ip_v6); 189 189 190 190 host2addr128_t_be(sdu->src.addr6, phdr.src_addr); 191 191 host2addr128_t_be(sdu->dest.addr6, phdr.dest_addr); … … 193 193 memset(phdr.zeroes, 0, 3); 194 194 phdr.next = IP_PROTO_ICMPV6; 195 195 196 196 uint16_t cs_phdr = 197 197 inet_checksum_calc(INET_CHECKSUM_INIT, &phdr, 198 198 sizeof(icmpv6_phdr_t)); 199 199 200 200 uint16_t cs_all = inet_checksum_calc(cs_phdr, rdata, rsize); 201 201 202 202 request->checksum = host2uint16_t_be(cs_all); 203 203 204 204 errno_t rc = inet_route_packet(&dgram, IP_PROTO_ICMPV6, 205 205 INET6_HOP_LIMIT_MAX, 0); 206 206 207 207 free(rdata); 208 208 209 209 return rc; 210 210 }
Note:
See TracChangeset
for help on using the changeset viewer.