Changes in uspace/srv/net/inetsrv/icmp.c [a2e3ee6:a1a101d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/icmp.c
ra2e3ee6 ra1a101d 120 120 static int icmp_recv_echo_reply(inet_dgram_t *dgram) 121 121 { 122 icmp_echo_t *reply; 123 inetping_sdu_t sdu; 124 uint16_t ident; 125 122 126 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmp_recv_echo_reply()"); 123 127 124 128 if (dgram->size < sizeof(icmp_echo_t)) 125 129 return EINVAL; 126 127 icmp_echo_t *reply = (icmp_echo_t *) dgram->data; 128 129 inetping_sdu_t sdu; 130 131 int rc = inet_addr_pack(&dgram->src, &sdu.src); 132 if (rc != EOK) 133 return rc; 134 135 rc = inet_addr_pack(&dgram->dest, &sdu.dest); 136 if (rc != EOK) 137 return rc; 138 130 131 reply = (icmp_echo_t *)dgram->data; 132 133 sdu.src = dgram->src; 134 sdu.dest = dgram->dest; 139 135 sdu.seq_no = uint16_t_be2host(reply->seq_no); 140 136 sdu.data = reply + sizeof(icmp_echo_t); 141 137 sdu.size = dgram->size - sizeof(icmp_echo_t); 142 143 uint16_t ident = uint16_t_be2host(reply->ident); 138 ident = uint16_t_be2host(reply->ident); 144 139 145 140 return inetping_recv(ident, &sdu); … … 148 143 int icmp_ping_send(uint16_t ident, inetping_sdu_t *sdu) 149 144 { 150 size_t rsize = sizeof(icmp_echo_t) + sdu->size; 151 void *rdata = calloc(rsize, 1); 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 154 if (rdata == NULL) 153 155 return ENOMEM; 154 155 icmp_echo_t *request = (icmp_echo_t *)rdata;156 156 157 request = (icmp_echo_t *)rdata; 158 157 159 request->type = ICMP_ECHO_REQUEST; 158 160 request->code = 0; … … 160 162 request->ident = host2uint16_t_be(ident); 161 163 request->seq_no = host2uint16_t_be(sdu->seq_no); 162 164 163 165 memcpy(rdata + sizeof(icmp_echo_t), sdu->data, sdu->size); 164 165 uint16_tchecksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize);166 167 checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize); 166 168 request->checksum = host2uint16_t_be(checksum); 167 168 inet_dgram_t dgram; 169 170 inet_addr_unpack(sdu->src, &dgram.src); 171 inet_addr_unpack(sdu->dest, &dgram.dest); 172 169 170 dgram.src = sdu->src; 171 dgram.dest = sdu->dest; 173 172 dgram.tos = ICMP_TOS; 174 173 dgram.data = rdata; 175 174 dgram.size = rsize; 176 177 intrc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0);178 175 176 rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0); 177 179 178 free(rdata); 180 179 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.