Changes in uspace/srv/net/inetsrv/inetping.c [02a09ed:a1a101d] in mainline
- File:
-
- 1 edited
-
uspace/srv/net/inetsrv/inetping.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/inetping.c
r02a09ed ra1a101d 43 43 #include <stdlib.h> 44 44 #include <sys/types.h> 45 #include <net/socket_codes.h> 45 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 57 59 static int inetping_send(inetping_client_t *client, inetping_sdu_t *sdu) 58 60 { … … 60 62 } 61 63 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; 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); 96 68 } 97 69 98 70 int inetping_recv(uint16_t ident, inetping_sdu_t *sdu) 99 71 { 100 inetping_client_t *client = inetping_client_find(ident); 72 inetping_client_t *client; 73 async_exch_t *exch; 74 ipc_call_t answer; 75 76 client = inetping_client_find(ident); 101 77 if (client == NULL) { 102 78 log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ICMP ident. Dropping."); 103 79 return ENOENT; 104 80 } 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); 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); 111 86 int rc = async_data_write_start(exch, sdu->data, sdu->size); 112 113 87 async_exchange_end(exch); 114 88 115 89 if (rc != EOK) { 116 90 async_forget(req); 117 91 return rc; 118 92 } 119 93 120 94 sysarg_t retval; 121 95 async_wait_for(req, &retval); 122 123 return (int) retval; 96 if (retval != EOK) { 97 return retval; 98 } 99 100 return EOK; 124 101 } 125 102 … … 139 116 } 140 117 141 sdu.src = IPC_GET_ARG1(*call);142 sdu.dest = IPC_GET_ARG2(*call);118 sdu.src.ipv4 = IPC_GET_ARG1(*call); 119 sdu.dest.ipv4 = IPC_GET_ARG2(*call); 143 120 sdu.seq_no = IPC_GET_ARG3(*call); 144 121 … … 152 129 ipc_callid_t callid, ipc_call_t *call) 153 130 { 131 inet_addr_t remote; 132 inet_addr_t local; 133 int rc; 134 154 135 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_get_srcaddr_srv()"); 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);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); 161 142 } 162 143 … … 166 147 if (sess == NULL) 167 148 return ENOMEM; 168 149 169 150 client->sess = sess; 170 151 link_initialize(&client->client_list); 171 152 172 153 fibril_mutex_lock(&client_list_lock); 173 154 client->ident = ++inetping_ident; 174 155 list_append(&client->client_list, &client_list); 175 156 fibril_mutex_unlock(&client_list_lock); 176 157 177 158 return EOK; 178 159 } … … 182 163 async_hangup(client->sess); 183 164 client->sess = NULL; 184 165 185 166 fibril_mutex_lock(&client_list_lock); 186 167 list_remove(&client->client_list); … … 188 169 } 189 170 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 190 189 void inetping_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 191 190 { 191 inetping_client_t client; 192 int rc; 193 192 194 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_conn()"); 193 195 194 196 /* Accept the connection */ 195 197 async_answer_0(iid, EOK); 196 197 inetping_client_t client; 198 int rc = inetping_client_init(&client); 198 199 rc = inetping_client_init(&client); 199 200 if (rc != EOK) 200 201 return; 201 202 202 203 while (true) { 203 204 ipc_call_t call; 204 205 ipc_callid_t callid = async_get_call(&call); 205 206 sysarg_t method = IPC_GET_IMETHOD(call); 206 207 207 208 if (!method) { 208 209 /* The other side has hung up */ … … 210 211 break; 211 212 } 212 213 213 214 switch (method) { 214 215 case INETPING_SEND: … … 222 223 } 223 224 } 224 225 225 226 inetping_client_fini(&client); 226 227 }
Note:
See TracChangeset
for help on using the changeset viewer.
