Changes in uspace/srv/net/inetsrv/icmp.c [a1a101d:13be2583] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/icmp.c
ra1a101d r13be2583 40 40 #include <mem.h> 41 41 #include <stdlib.h> 42 42 #include <types/inetping.h> 43 #include <net/socket_codes.h> 43 44 #include "icmp.h" 44 45 #include "icmp_std.h" … … 105 106 reply->checksum = host2uint16_t_be(checksum); 106 107 108 rdgram.iplink = 0; 107 109 rdgram.src = dgram->dest; 108 110 rdgram.dest = dgram->src; … … 120 122 static int icmp_recv_echo_reply(inet_dgram_t *dgram) 121 123 { 122 icmp_echo_t *reply;123 inetping_sdu_t sdu;124 uint16_t ident;125 126 124 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmp_recv_echo_reply()"); 127 125 128 126 if (dgram->size < sizeof(icmp_echo_t)) 129 127 return EINVAL; 130 131 reply = (icmp_echo_t *)dgram->data; 132 133 sdu.src = dgram->src; 134 sdu.dest = dgram->dest; 128 129 icmp_echo_t *reply = (icmp_echo_t *) dgram->data; 130 131 inetping_sdu_t sdu; 132 133 uint16_t family = inet_addr_get(&dgram->src, &sdu.src, NULL); 134 if (family != AF_INET) 135 return EINVAL; 136 137 family = inet_addr_get(&dgram->dest, &sdu.dest, NULL); 138 if (family != AF_INET) 139 return EINVAL; 140 135 141 sdu.seq_no = uint16_t_be2host(reply->seq_no); 136 142 sdu.data = reply + sizeof(icmp_echo_t); 137 143 sdu.size = dgram->size - sizeof(icmp_echo_t); 138 ident = uint16_t_be2host(reply->ident); 144 145 uint16_t ident = uint16_t_be2host(reply->ident); 139 146 140 147 return inetping_recv(ident, &sdu); … … 143 150 int icmp_ping_send(uint16_t ident, inetping_sdu_t *sdu) 144 151 { 145 inet_dgram_t dgram; 146 icmp_echo_t *request; 147 void *rdata; 148 size_t rsize; 149 uint16_t checksum; 150 int rc; 151 152 rsize = sizeof(icmp_echo_t) + sdu->size; 153 rdata = calloc(rsize, 1); 152 size_t rsize = sizeof(icmp_echo_t) + sdu->size; 153 void *rdata = calloc(rsize, 1); 154 154 if (rdata == NULL) 155 155 return ENOMEM; 156 157 request = (icmp_echo_t *)rdata;158 156 157 icmp_echo_t *request = (icmp_echo_t *) rdata; 158 159 159 request->type = ICMP_ECHO_REQUEST; 160 160 request->code = 0; … … 162 162 request->ident = host2uint16_t_be(ident); 163 163 request->seq_no = host2uint16_t_be(sdu->seq_no); 164 164 165 165 memcpy(rdata + sizeof(icmp_echo_t), sdu->data, sdu->size); 166 167 checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize);166 167 uint16_t checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize); 168 168 request->checksum = host2uint16_t_be(checksum); 169 170 dgram.src = sdu->src; 171 dgram.dest = sdu->dest; 169 170 inet_dgram_t dgram; 171 172 inet_addr_set(sdu->src, &dgram.src); 173 inet_addr_set(sdu->dest, &dgram.dest); 174 175 dgram.iplink = 0; 172 176 dgram.tos = ICMP_TOS; 173 177 dgram.data = rdata; 174 178 dgram.size = rsize; 175 176 rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0);177 179 180 int rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0); 181 178 182 free(rdata); 179 183 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.