Changeset 02a09ed in mainline for uspace/srv/net/loopip/loopip.c
- Timestamp:
- 2013-06-28T20:20:03Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1d24ad3
- Parents:
- edf0d27
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/loopip/loopip.c
redf0d27 r02a09ed 39 39 #include <errno.h> 40 40 #include <inet/iplink_srv.h> 41 #include <inet/addr.h> 41 42 #include <io/log.h> 42 43 #include <loc.h> … … 48 49 static int loopip_open(iplink_srv_t *srv); 49 50 static int loopip_close(iplink_srv_t *srv); 50 static int loopip_send(iplink_srv_t *srv, iplink_s rv_sdu_t *sdu);51 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu); 51 52 static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu); 52 static int loopip_addr_add(iplink_srv_t *srv, uint32_taddr);53 static int loopip_addr_remove(iplink_srv_t *srv, uint32_taddr);53 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr); 54 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr); 54 55 55 56 static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 69 70 typedef struct { 70 71 link_t link; 71 iplink_srv_sdu_t sdu; 72 73 uint16_t af; 74 iplink_recv_sdu_t sdu; 72 75 } rqueue_entry_t; 73 76 … … 77 80 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item"); 78 81 link_t *link = prodcons_consume(&loopip_rcv_queue); 79 rqueue_entry_t *rqe = list_get_instance(link, rqueue_entry_t, link); 80 81 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu); 82 rqueue_entry_t *rqe = 83 list_get_instance(link, rqueue_entry_t, link); 84 85 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->af); 86 87 free(rqe->sdu.data); 88 free(rqe); 82 89 } 83 90 … … 87 94 static int loopip_init(void) 88 95 { 89 int rc;90 service_id_t sid;91 category_id_t iplink_cat;92 const char *svc_name = "net/loopback";93 94 96 async_set_client_connection(loopip_client_conn); 95 97 96 rc = loc_server_register(NAME);98 int rc = loc_server_register(NAME); 97 99 if (rc != EOK) { 98 100 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server."); … … 105 107 106 108 prodcons_initialize(&loopip_rcv_queue); 107 109 110 const char *svc_name = "net/loopback"; 111 service_id_t sid; 108 112 rc = loc_service_register(svc_name, &sid); 109 113 if (rc != EOK) { 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name); 111 return rc; 112 } 113 114 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", 115 svc_name); 116 return rc; 117 } 118 119 category_id_t iplink_cat; 114 120 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING); 115 121 if (rc != EOK) { … … 120 126 rc = loc_service_add_to_cat(sid, iplink_cat); 121 127 if (rc != EOK) { 122 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name); 128 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", 129 svc_name); 123 130 return rc; 124 131 } … … 151 158 } 152 159 153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 154 { 155 rqueue_entry_t *rqe; 156 160 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 161 { 157 162 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()"); 158 159 rqe = calloc(1, sizeof(rqueue_entry_t)); 163 164 addr32_t src_v4; 165 addr128_t src_v6; 166 uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6); 167 168 addr32_t dest_v4; 169 addr128_t dest_v6; 170 uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6); 171 172 if (src_af != dest_af) 173 return EINVAL; 174 175 rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t)); 160 176 if (rqe == NULL) 161 177 return ENOMEM; … … 164 180 * Clone SDU 165 181 */ 166 rqe->sdu.lsrc = sdu->ldest; 167 rqe->sdu.ldest = sdu->lsrc; 182 rqe->af = src_af; 168 183 rqe->sdu.data = malloc(sdu->size); 169 184 if (rqe->sdu.data == NULL) { … … 190 205 } 191 206 192 static int loopip_addr_add(iplink_srv_t *srv, uint32_t addr) 193 { 194 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_add(0x%" PRIx32 ")", addr); 195 return EOK; 196 } 197 198 static int loopip_addr_remove(iplink_srv_t *srv, uint32_t addr) 199 { 200 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_remove(0x%" PRIx32 ")", addr); 207 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr) 208 { 209 return EOK; 210 } 211 212 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr) 213 { 201 214 return EOK; 202 215 } … … 204 217 int main(int argc, char *argv[]) 205 218 { 206 int rc; 207 208 printf(NAME ": HelenOS loopback IP link provider\n"); 209 210 if (log_init(NAME) != EOK) { 211 printf(NAME ": Failed to initialize logging.\n"); 212 return 1; 219 printf("%s: HelenOS loopback IP link provider\n", NAME); 220 221 int rc = log_init(NAME); 222 if (rc != EOK) { 223 printf("%s: Failed to initialize logging.\n", NAME); 224 return rc; 213 225 } 214 226 215 227 rc = loopip_init(); 216 228 if (rc != EOK) 217 return 1;218 219 printf( NAME ": Accepting connections.\n");229 return rc; 230 231 printf("%s: Accepting connections.\n", NAME); 220 232 task_retval(0); 221 233 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.