Changes in uspace/srv/net/loopip/loopip.c [02a09ed:a1a101d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/loopip/loopip.c
r02a09ed 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> … … 45 44 #include <stdlib.h> 46 45 47 #define NAME 46 #define NAME "loopip" 48 47 49 48 static int loopip_open(iplink_srv_t *srv); 50 49 static int loopip_close(iplink_srv_t *srv); 51 static int loopip_send(iplink_srv_t *srv, iplink_s du_t *sdu);50 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu); 52 51 static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu); 53 static int loopip_addr_add(iplink_srv_t *srv, i net_addr_t *addr);54 static int loopip_addr_remove(iplink_srv_t *srv, i net_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); 55 54 56 55 static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 70 69 typedef struct { 71 70 link_t link; 72 73 uint16_t af; 74 iplink_recv_sdu_t sdu; 71 iplink_srv_sdu_t sdu; 75 72 } rqueue_entry_t; 76 73 … … 80 77 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item"); 81 78 link_t *link = prodcons_consume(&loopip_rcv_queue); 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); 89 } 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"; 90 93 91 return 0;92 }93 94 static int loopip_init(void)95 {96 94 async_set_client_connection(loopip_client_conn); 97 95 98 intrc = loc_server_register(NAME);96 rc = loc_server_register(NAME); 99 97 if (rc != EOK) { 100 98 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server."); 101 99 return rc; 102 100 } 103 101 104 102 iplink_srv_init(&loopip_iplink); 105 103 loopip_iplink.ops = &loopip_iplink_ops; 106 104 loopip_iplink.arg = NULL; 107 105 108 106 prodcons_initialize(&loopip_rcv_queue); 109 110 const char *svc_name = "net/loopback"; 111 service_id_t sid; 107 112 108 rc = loc_service_register(svc_name, &sid); 113 109 if (rc != EOK) { 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; 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name); 111 return rc; 112 } 113 120 114 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING); 121 115 if (rc != EOK) { … … 123 117 return rc; 124 118 } 125 119 126 120 rc = loc_service_add_to_cat(sid, iplink_cat); 127 121 if (rc != EOK) { 128 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", 129 svc_name); 130 return rc; 131 } 132 122 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name); 123 return rc; 124 } 125 133 126 fid_t fid = fibril_create(loopip_recv_fibril, NULL); 134 127 if (fid == 0) 135 128 return ENOMEM; 136 129 137 130 fibril_add_ready(fid); 138 131 139 132 return EOK; 140 133 } … … 158 151 } 159 152 160 static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 161 { 153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 154 { 155 rqueue_entry_t *rqe; 156 162 157 log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()"); 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)); 158 159 rqe = calloc(1, sizeof(rqueue_entry_t)); 176 160 if (rqe == NULL) 177 161 return ENOMEM; 178 179 162 /* 180 163 * Clone SDU 181 164 */ 182 rqe->af = src_af; 165 rqe->sdu.lsrc = sdu->ldest; 166 rqe->sdu.ldest = sdu->lsrc; 183 167 rqe->sdu.data = malloc(sdu->size); 184 168 if (rqe->sdu.data == NULL) { … … 186 170 return ENOMEM; 187 171 } 188 172 189 173 memcpy(rqe->sdu.data, sdu->data, sdu->size); 190 174 rqe->sdu.size = sdu->size; 191 175 192 176 /* 193 177 * Insert to receive queue 194 178 */ 195 179 prodcons_produce(&loopip_rcv_queue, &rqe->link); 196 180 197 181 return EOK; 198 182 } … … 205 189 } 206 190 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 { 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); 214 200 return EOK; 215 201 } … … 217 203 int main(int argc, char *argv[]) 218 204 { 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; 225 } 226 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 227 214 rc = loopip_init(); 228 215 if (rc != EOK) 229 return rc;230 231 printf( "%s: Accepting connections.\n", NAME);216 return 1; 217 218 printf(NAME ": Accepting connections.\n"); 232 219 task_retval(0); 233 220 async_manager(); 234 221 235 222 /* Not reached */ 236 223 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.