Changes in uspace/srv/net/ethip/ethip.c [289cb7dd:1d24ad3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/ethip.c
r289cb7dd r1d24ad3 44 44 #include <stdio.h> 45 45 #include <stdlib.h> 46 46 #include <net/socket_codes.h> 47 47 #include "arp.h" 48 48 #include "ethip.h" … … 55 55 static int ethip_open(iplink_srv_t *srv); 56 56 static int ethip_close(iplink_srv_t *srv); 57 static int ethip_send(iplink_srv_t *srv, iplink_s rv_sdu_t *sdu);57 static int ethip_send(iplink_srv_t *srv, iplink_sdu_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, i plink_srv_addr_t *addr);60 static int ethip_addr_remove(iplink_srv_t *srv, i plink_srv_addr_t *addr);59 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr); 60 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr); 61 61 62 62 static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg); … … 164 164 } 165 165 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; 166 static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu) 167 { 168 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()"); 169 170 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 171 172 addr32_t src_v4; 173 addr128_t src_v6; 174 uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6); 175 176 addr32_t dest_v4; 177 addr128_t dest_v6; 178 uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6); 179 180 if (src_af != dest_af) 181 return EINVAL; 182 183 int rc; 169 184 eth_frame_t frame; 185 186 switch (src_af) { 187 case AF_INET: 188 rc = arp_translate(nic, src_v4, dest_v4, frame.dest); 189 if (rc != EOK) { 190 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%" 191 PRIx32, dest_v4); 192 return rc; 193 } 194 195 addr48(nic->mac_addr, frame.src); 196 frame.etype_len = ETYPE_IP; 197 frame.data = sdu->data; 198 frame.size = sdu->size; 199 200 break; 201 case AF_INET6: 202 // FIXME TODO 203 return ENOTSUP; 204 default: 205 return EINVAL; 206 } 207 170 208 void *data; 171 209 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;186 frame.etype_len = ETYPE_IP;187 frame.data = sdu->data;188 frame.size = sdu->size;189 190 210 rc = eth_pdu_encode(&frame, &data, &size); 191 211 if (rc != EOK) 192 212 return rc; 193 213 194 214 rc = ethip_nic_send(nic, data, size); 195 215 free(data); 196 216 197 217 return rc; 198 218 } … … 201 221 { 202 222 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv); 203 ethip_nic_t *nic = (ethip_nic_t *)srv->arg; 223 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 224 225 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode"); 226 204 227 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); 228 int rc = eth_pdu_decode(data, size, &frame); 212 229 if (rc != EOK) { 213 230 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed"); 214 231 return rc; 215 232 } 216 233 234 iplink_recv_sdu_t sdu; 235 217 236 switch (frame.etype_len) { 218 237 case ETYPE_ARP: … … 221 240 case ETYPE_IP: 222 241 log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU"); 223 sdu.lsrc.ipv4 = 0;224 sdu.ldest.ipv4 = 0;225 242 sdu.data = frame.data; 226 243 sdu.size = frame.size; 227 244 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 228 rc = iplink_ev_recv(&nic->iplink, &sdu); 245 rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET); 246 break; 247 case ETYPE_IPV6: 248 log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU IPv6"); 249 sdu.data = frame.data; 250 sdu.size = frame.size; 251 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 252 rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET6); 229 253 break; 230 254 default: … … 232 256 frame.etype_len); 233 257 } 234 258 235 259 free(frame.data); 236 260 return rc; … … 244 268 } 245 269 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); 270 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr) 271 { 272 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 273 251 274 return ethip_nic_addr_add(nic, addr); 252 275 } 253 276 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); 277 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr) 278 { 279 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 280 281 return ethip_nic_addr_remove(nic, addr); 260 282 } 261 283
Note:
See TracChangeset
for help on using the changeset viewer.