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