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