Changes in uspace/srv/net/loopip/loopip.c [a17356fd:a1a101d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/loopip/loopip.c
ra17356fd ra1a101d 39 39 #include <errno.h> 40 40 #include <inet/iplink_srv.h> 41 #include <inet/addr.h>42 #include <net/socket_codes.h>43 41 #include <io/log.h> 44 42 #include <loc.h> … … 46 44 #include <stdlib.h> 47 45 48 #define NAME 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 uint16_t af; 79 iplink_recv_sdu_t sdu; 71 iplink_srv_sdu_t sdu; 80 72 } rqueue_entry_t; 81 73 … … 85 77 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item"); 86 78 link_t *link = prodcons_consume(&loopip_rcv_queue); 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->af); 91 92 free(rqe->sdu.data); 93 free(rqe); 94 } 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"; 95 93 96 return 0;97 }98 99 static int loopip_init(void)100 {101 94 async_set_client_connection(loopip_client_conn); 102 95 103 intrc = loc_server_register(NAME);96 rc = loc_server_register(NAME); 104 97 if (rc != EOK) { 105 98 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server."); 106 99 return rc; 107 100 } 108 101 109 102 iplink_srv_init(&loopip_iplink); 110 103 loopip_iplink.ops = &loopip_iplink_ops; 111 104 loopip_iplink.arg = NULL; 112 105 113 106 prodcons_initialize(&loopip_rcv_queue); 114 115 const char *svc_name = "net/loopback"; 116 service_id_t sid; 107 117 108 rc = loc_service_register(svc_name, &sid); 118 109 if (rc != EOK) { 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; 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name); 111 return rc; 112 } 113 125 114 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING); 126 115 if (rc != EOK) { … … 128 117 return rc; 129 118 } 130 119 131 120 rc = loc_service_add_to_cat(sid, iplink_cat); 132 121 if (rc != EOK) { 133 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", 134 svc_name); 135 return rc; 136 } 137 122 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name); 123 return rc; 124 } 125 138 126 fid_t fid = fibril_create(loopip_recv_fibril, NULL); 139 127 if (fid == 0) 140 128 return ENOMEM; 141 129 142 130 fibril_add_ready(fid); 143 131 144 132 return EOK; 145 133 } … … 163 151 } 164 152 165 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 166 { 153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 154 { 155 rqueue_entry_t *rqe; 156 167 157 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()"); 168 169 rq ueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));158 159 rqe = calloc(1, sizeof(rqueue_entry_t)); 170 160 if (rqe == NULL) 171 161 return ENOMEM; 172 173 162 /* 174 163 * Clone SDU 175 164 */ 176 rqe->af = AF_INET; 165 rqe->sdu.lsrc = sdu->ldest; 166 rqe->sdu.ldest = sdu->lsrc; 177 167 rqe->sdu.data = malloc(sdu->size); 178 168 if (rqe->sdu.data == NULL) { … … 180 170 return ENOMEM; 181 171 } 182 172 183 173 memcpy(rqe->sdu.data, sdu->data, sdu->size); 184 174 rqe->sdu.size = sdu->size; 185 175 186 176 /* 187 177 * Insert to receive queue 188 178 */ 189 179 prodcons_produce(&loopip_rcv_queue, &rqe->link); 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->af = AF_INET6; 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 180 220 181 return EOK; 221 182 } … … 228 189 } 229 190 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 { 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); 243 200 return EOK; 244 201 } … … 246 203 int main(int argc, char *argv[]) 247 204 { 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 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 256 214 rc = loopip_init(); 257 215 if (rc != EOK) 258 return rc;259 260 printf( "%s: Accepting connections.\n", NAME);216 return 1; 217 218 printf(NAME ": Accepting connections.\n"); 261 219 task_retval(0); 262 220 async_manager(); 263 221 264 222 /* Not reached */ 265 223 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.