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