Changes in uspace/srv/net/loopip/loopip.c [a1a101d:1c635d6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/loopip/loopip.c
ra1a101d r1c635d6 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> 43 44 #include <stdio.h> 44 45 #include <stdlib.h> 45 46 #define NAME "loopip" 46 #include <task.h> 47 48 #define NAME "loopip" 47 49 48 50 static int loopip_open(iplink_srv_t *srv); 49 51 static int loopip_close(iplink_srv_t *srv); 50 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu); 52 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu); 53 static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu); 51 54 static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu); 52 static int loopip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr); 53 static int loopip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr); 55 static int loopip_get_mac48(iplink_srv_t *srv, addr48_t *mac); 56 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr); 57 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr); 54 58 55 59 static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 59 63 .close = loopip_close, 60 64 .send = loopip_send, 65 .send6 = loopip_send6, 61 66 .get_mtu = loopip_get_mtu, 67 .get_mac48 = loopip_get_mac48, 62 68 .addr_add = loopip_addr_add, 63 69 .addr_remove = loopip_addr_remove … … 69 75 typedef struct { 70 76 link_t link; 71 iplink_srv_sdu_t sdu; 77 78 /* XXX Version should be part of SDU */ 79 ip_ver_t ver; 80 iplink_recv_sdu_t sdu; 72 81 } rqueue_entry_t; 73 82 … … 77 86 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item"); 78 87 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 } 83 88 rqueue_entry_t *rqe = 89 list_get_instance(link, rqueue_entry_t, link); 90 91 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->ver); 92 93 free(rqe->sdu.data); 94 free(rqe); 95 } 96 84 97 return 0; 85 98 } … … 87 100 static int loopip_init(void) 88 101 { 89 int rc;90 service_id_t sid;91 category_id_t iplink_cat;92 const char *svc_name = "net/loopback";93 94 102 async_set_client_connection(loopip_client_conn); 95 103 96 rc = loc_server_register(NAME);104 int rc = loc_server_register(NAME); 97 105 if (rc != EOK) { 98 106 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server."); 99 107 return rc; 100 108 } 101 109 102 110 iplink_srv_init(&loopip_iplink); 103 111 loopip_iplink.ops = &loopip_iplink_ops; 104 112 loopip_iplink.arg = NULL; 105 113 106 114 prodcons_initialize(&loopip_rcv_queue); 107 115 116 const char *svc_name = "net/loopback"; 117 service_id_t sid; 108 118 rc = loc_service_register(svc_name, &sid); 109 119 if (rc != EOK) { 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name); 111 return rc; 112 } 113 120 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", 121 svc_name); 122 return rc; 123 } 124 125 category_id_t iplink_cat; 114 126 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING); 115 127 if (rc != EOK) { … … 117 129 return rc; 118 130 } 119 131 120 132 rc = loc_service_add_to_cat(sid, iplink_cat); 121 133 if (rc != EOK) { 122 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name); 123 return rc; 124 } 125 134 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", 135 svc_name); 136 return rc; 137 } 138 126 139 fid_t fid = fibril_create(loopip_recv_fibril, NULL); 127 140 if (fid == 0) 128 141 return ENOMEM; 129 142 130 143 fibril_add_ready(fid); 131 144 132 145 return EOK; 133 146 } … … 151 164 } 152 165 153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 154 { 155 rqueue_entry_t *rqe; 156 166 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 167 { 157 168 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()"); 158 159 rq e = calloc(1, sizeof(rqueue_entry_t));169 170 rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t)); 160 171 if (rqe == NULL) 161 172 return ENOMEM; 173 162 174 /* 163 175 * Clone SDU 164 176 */ 165 rqe->sdu.lsrc = sdu->ldest; 166 rqe->sdu.ldest = sdu->lsrc; 177 rqe->ver = ip_v4; 167 178 rqe->sdu.data = malloc(sdu->size); 168 179 if (rqe->sdu.data == NULL) { … … 170 181 return ENOMEM; 171 182 } 172 183 173 184 memcpy(rqe->sdu.data, sdu->data, sdu->size); 174 185 rqe->sdu.size = sdu->size; 175 186 176 187 /* 177 188 * Insert to receive queue 178 189 */ 179 190 prodcons_produce(&loopip_rcv_queue, &rqe->link); 180 191 192 return EOK; 193 } 194 195 static int loopip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu) 196 { 197 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip6_send()"); 198 199 rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t)); 200 if (rqe == NULL) 201 return ENOMEM; 202 203 /* 204 * Clone SDU 205 */ 206 rqe->ver = ip_v6; 207 rqe->sdu.data = malloc(sdu->size); 208 if (rqe->sdu.data == NULL) { 209 free(rqe); 210 return ENOMEM; 211 } 212 213 memcpy(rqe->sdu.data, sdu->data, sdu->size); 214 rqe->sdu.size = sdu->size; 215 216 /* 217 * Insert to receive queue 218 */ 219 prodcons_produce(&loopip_rcv_queue, &rqe->link); 220 181 221 return EOK; 182 222 } … … 189 229 } 190 230 191 static int loopip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr) 192 { 193 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_add(0x%" PRIx32 ")", addr->ipv4); 194 return EOK; 195 } 196 197 static int loopip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr) 198 { 199 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_remove(0x%" PRIx32 ")", addr->ipv4); 231 static int loopip_get_mac48(iplink_srv_t *src, addr48_t *mac) 232 { 233 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_get_mac48()"); 234 return ENOTSUP; 235 } 236 237 static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr) 238 { 239 return EOK; 240 } 241 242 static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr) 243 { 200 244 return EOK; 201 245 } … … 203 247 int main(int argc, char *argv[]) 204 248 { 205 int rc; 206 207 printf(NAME ": HelenOS loopback IP link provider\n"); 208 209 if (log_init(NAME) != EOK) { 210 printf(NAME ": Failed to initialize logging.\n"); 211 return 1; 212 } 213 249 printf("%s: HelenOS loopback IP link provider\n", NAME); 250 251 int rc = log_init(NAME); 252 if (rc != EOK) { 253 printf("%s: Failed to initialize logging.\n", NAME); 254 return rc; 255 } 256 214 257 rc = loopip_init(); 215 258 if (rc != EOK) 216 return 1;217 218 printf( NAME ": Accepting connections.\n");259 return rc; 260 261 printf("%s: Accepting connections.\n", NAME); 219 262 task_retval(0); 220 263 async_manager(); 221 264 222 265 /* Not reached */ 223 266 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.