Changes in uspace/srv/net/ethip/ethip.c [289cb7dd:417a2ba1] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/ethip.c
r289cb7dd r417a2ba1 44 44 #include <stdio.h> 45 45 #include <stdlib.h> 46 47 46 #include "arp.h" 48 47 #include "ethip.h" … … 55 54 static int ethip_open(iplink_srv_t *srv); 56 55 static int ethip_close(iplink_srv_t *srv); 57 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu); 56 static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu); 57 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu); 58 58 static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu); 59 static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr); 60 static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr); 59 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac); 60 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr); 61 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr); 61 62 62 63 static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 66 67 .close = ethip_close, 67 68 .send = ethip_send, 69 .send6 = ethip_send6, 68 70 .get_mtu = ethip_get_mtu, 71 .get_mac48 = ethip_get_mac48, 69 72 .addr_add = ethip_addr_add, 70 73 .addr_remove = ethip_addr_remove … … 164 167 } 165 168 166 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu) 167 { 168 ethip_nic_t *nic = (ethip_nic_t *)srv->arg; 169 static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 170 { 171 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()"); 172 173 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 169 174 eth_frame_t frame; 170 void *data; 171 size_t size; 172 mac48_addr_t dest_mac_addr; 173 int rc; 174 175 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()"); 176 177 rc = arp_translate(nic, &sdu->lsrc, &sdu->ldest, &dest_mac_addr); 178 if (rc != EOK) { 179 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IP address 0x%" PRIx32, 180 sdu->ldest.ipv4); 181 return rc; 182 } 183 184 frame.dest = dest_mac_addr; 185 frame.src = nic->mac_addr; 175 176 int rc = arp_translate(nic, sdu->src, sdu->dest, frame.dest); 177 if (rc != EOK) { 178 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%" 179 PRIx32, sdu->dest); 180 return rc; 181 } 182 183 addr48(nic->mac_addr, frame.src); 186 184 frame.etype_len = ETYPE_IP; 187 185 frame.data = sdu->data; 188 186 frame.size = sdu->size; 189 187 188 void *data; 189 size_t size; 190 190 rc = eth_pdu_encode(&frame, &data, &size); 191 191 if (rc != EOK) 192 192 return rc; 193 193 194 194 rc = ethip_nic_send(nic, data, size); 195 195 free(data); 196 196 197 197 return rc; 198 198 } 199 199 200 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu) 201 { 202 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send6()"); 203 204 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 205 eth_frame_t frame; 206 207 addr48(sdu->dest, frame.dest); 208 addr48(nic->mac_addr, frame.src); 209 frame.etype_len = ETYPE_IPV6; 210 frame.data = sdu->data; 211 frame.size = sdu->size; 212 213 void *data; 214 size_t size; 215 int rc = eth_pdu_encode(&frame, &data, &size); 216 if (rc != EOK) 217 return rc; 218 219 rc = ethip_nic_send(nic, data, size); 220 free(data); 221 222 return rc; 223 } 224 200 225 int ethip_received(iplink_srv_t *srv, void *data, size_t size) 201 226 { 202 227 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv); 203 ethip_nic_t *nic = (ethip_nic_t *)srv->arg; 228 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 229 230 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode"); 231 204 232 eth_frame_t frame; 205 iplink_srv_sdu_t sdu; 206 int rc; 207 208 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received()"); 209 210 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode"); 211 rc = eth_pdu_decode(data, size, &frame); 233 int rc = eth_pdu_decode(data, size, &frame); 212 234 if (rc != EOK) { 213 235 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed"); 214 236 return rc; 215 237 } 216 238 239 iplink_recv_sdu_t sdu; 240 217 241 switch (frame.etype_len) { 218 242 case ETYPE_ARP: … … 221 245 case ETYPE_IP: 222 246 log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU"); 223 sdu.lsrc.ipv4 = 0;224 sdu.ldest.ipv4 = 0;225 247 sdu.data = frame.data; 226 248 sdu.size = frame.size; 227 249 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 228 rc = iplink_ev_recv(&nic->iplink, &sdu); 250 rc = iplink_ev_recv(&nic->iplink, &sdu, ip_v4); 251 break; 252 case ETYPE_IPV6: 253 log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU IPv6"); 254 sdu.data = frame.data; 255 sdu.size = frame.size; 256 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 257 rc = iplink_ev_recv(&nic->iplink, &sdu, ip_v6); 229 258 break; 230 259 default: … … 232 261 frame.etype_len); 233 262 } 234 263 235 264 free(frame.data); 236 265 return rc; … … 244 273 } 245 274 246 static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr) 247 { 248 ethip_nic_t *nic = (ethip_nic_t *)srv->arg; 249 250 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_addr_add(0x%" PRIx32 ")", addr->ipv4); 275 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac) 276 { 277 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mac48()"); 278 279 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 280 addr48(nic->mac_addr, *mac); 281 282 return EOK; 283 } 284 285 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr) 286 { 287 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 288 251 289 return ethip_nic_addr_add(nic, addr); 252 290 } 253 291 254 static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr) 255 { 256 ethip_nic_t *nic = (ethip_nic_t *)srv->arg; 257 258 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr->ipv4); 259 return ethip_nic_addr_add(nic, addr); 292 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr) 293 { 294 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 295 296 return ethip_nic_addr_remove(nic, addr); 260 297 } 261 298
Note:
See TracChangeset
for help on using the changeset viewer.