Changeset dd0c8a0 in mainline for uspace/srv/net/inetsrv/inetping.c
- Timestamp:
- 2013-09-29T06:56:33Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a9bd960d
- Parents:
- 3deb0155 (diff), 13be2583 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/inetping.c
r3deb0155 rdd0c8a0 43 43 #include <stdlib.h> 44 44 #include <sys/types.h> 45 45 #include <types/inetping.h> 46 #include <net/socket_codes.h> 46 47 #include "icmp.h" 47 48 #include "icmp_std.h" … … 55 56 static uint16_t inetping_ident = 0; 56 57 57 static inetping_client_t *inetping_client_find(uint16_t);58 59 58 static int inetping_send(inetping_client_t *client, inetping_sdu_t *sdu) 60 59 { … … 62 61 } 63 62 64 static int inetping_get_srcaddr(inetping_client_t *client, inet_addr_t *remote, 65 inet_addr_t *local) 66 { 67 return inet_get_srcaddr(remote, ICMP_TOS, local); 63 static int inetping_get_srcaddr(inetping_client_t *client, addr32_t remote, 64 addr32_t *local) 65 { 66 inet_addr_t remote_addr; 67 inet_addr_set(remote, &remote_addr); 68 69 inet_addr_t local_addr; 70 int rc = inet_get_srcaddr(&remote_addr, ICMP_TOS, &local_addr); 71 if (rc != EOK) 72 return rc; 73 74 uint16_t family = inet_addr_get(&local_addr, local, NULL); 75 if (family != AF_INET) 76 return EINVAL; 77 78 return EOK; 79 } 80 81 static inetping_client_t *inetping_client_find(uint16_t ident) 82 { 83 fibril_mutex_lock(&client_list_lock); 84 85 list_foreach(client_list, client_list, inetping_client_t, client) { 86 if (client->ident == ident) { 87 fibril_mutex_unlock(&client_list_lock); 88 return client; 89 } 90 } 91 92 fibril_mutex_unlock(&client_list_lock); 93 return NULL; 68 94 } 69 95 70 96 int inetping_recv(uint16_t ident, inetping_sdu_t *sdu) 71 97 { 72 inetping_client_t *client; 73 async_exch_t *exch; 74 ipc_call_t answer; 75 76 client = inetping_client_find(ident); 98 inetping_client_t *client = inetping_client_find(ident); 77 99 if (client == NULL) { 78 100 log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ICMP ident. Dropping."); 79 101 return ENOENT; 80 102 } 81 82 exch = async_exchange_begin(client->sess); 83 84 aid_t req = async_send_3(exch, INETPING_EV_RECV, sdu->src.ipv4, 85 sdu->dest.ipv4, sdu->seq_no, &answer); 103 104 async_exch_t *exch = async_exchange_begin(client->sess); 105 106 ipc_call_t answer; 107 aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src, 108 (sysarg_t) sdu->dest, sdu->seq_no, &answer); 86 109 int rc = async_data_write_start(exch, sdu->data, sdu->size); 110 87 111 async_exchange_end(exch); 88 112 89 113 if (rc != EOK) { 90 114 async_forget(req); 91 115 return rc; 92 116 } 93 117 94 118 sysarg_t retval; 95 119 async_wait_for(req, &retval); 96 if (retval != EOK) { 97 return retval; 98 } 99 100 return EOK; 120 121 return (int) retval; 101 122 } 102 123 … … 116 137 } 117 138 118 sdu.src .ipv4= IPC_GET_ARG1(*call);119 sdu.dest .ipv4= IPC_GET_ARG2(*call);139 sdu.src = IPC_GET_ARG1(*call); 140 sdu.dest = IPC_GET_ARG2(*call); 120 141 sdu.seq_no = IPC_GET_ARG3(*call); 121 142 … … 129 150 ipc_callid_t callid, ipc_call_t *call) 130 151 { 131 inet_addr_t remote;132 inet_addr_t local;133 int rc;134 135 152 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_get_srcaddr_srv()"); 136 137 remote.ipv4= IPC_GET_ARG1(*call);138 local.ipv4= 0;139 140 rc = inetping_get_srcaddr(client, &remote, &local);141 async_answer_1(callid, rc, local.ipv4);153 154 uint32_t remote = IPC_GET_ARG1(*call); 155 uint32_t local = 0; 156 157 int rc = inetping_get_srcaddr(client, remote, &local); 158 async_answer_1(callid, rc, (sysarg_t) local); 142 159 } 143 160 … … 147 164 if (sess == NULL) 148 165 return ENOMEM; 149 166 150 167 client->sess = sess; 151 168 link_initialize(&client->client_list); 152 169 153 170 fibril_mutex_lock(&client_list_lock); 154 171 client->ident = ++inetping_ident; 155 172 list_append(&client->client_list, &client_list); 156 173 fibril_mutex_unlock(&client_list_lock); 157 174 158 175 return EOK; 159 176 } … … 163 180 async_hangup(client->sess); 164 181 client->sess = NULL; 165 182 166 183 fibril_mutex_lock(&client_list_lock); 167 184 list_remove(&client->client_list); … … 169 186 } 170 187 171 static inetping_client_t *inetping_client_find(uint16_t ident)172 {173 fibril_mutex_lock(&client_list_lock);174 175 list_foreach(client_list, link) {176 inetping_client_t *client = list_get_instance(link,177 inetping_client_t, client_list);178 179 if (client->ident == ident) {180 fibril_mutex_unlock(&client_list_lock);181 return client;182 }183 }184 185 fibril_mutex_unlock(&client_list_lock);186 return NULL;187 }188 189 188 void inetping_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 190 189 { 191 inetping_client_t client;192 int rc;193 194 190 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_conn()"); 195 191 196 192 /* Accept the connection */ 197 193 async_answer_0(iid, EOK); 198 199 rc = inetping_client_init(&client); 194 195 inetping_client_t client; 196 int rc = inetping_client_init(&client); 200 197 if (rc != EOK) 201 198 return; 202 199 203 200 while (true) { 204 201 ipc_call_t call; 205 202 ipc_callid_t callid = async_get_call(&call); 206 203 sysarg_t method = IPC_GET_IMETHOD(call); 207 204 208 205 if (!method) { 209 206 /* The other side has hung up */ … … 211 208 break; 212 209 } 213 210 214 211 switch (method) { 215 212 case INETPING_SEND: … … 223 220 } 224 221 } 225 222 226 223 inetping_client_fini(&client); 227 224 }
Note:
See TracChangeset
for help on using the changeset viewer.