equal
deleted
inserted
replaced
241 |
241 |
242 To keep a usable file descriptor for that socket, even when calling |
242 To keep a usable file descriptor for that socket, even when calling |
243 from cobalt thread (i.e. if (cobalt_ppd_get(0) != &cobalt_kernel_ppd)) |
243 from cobalt thread (i.e. if (cobalt_ppd_get(0) != &cobalt_kernel_ppd)) |
244 we resolve it here in advance */ |
244 we resolve it here in advance */ |
245 dev->rtdm_fd = rtdm_fd_get(dev->socket,0); |
245 dev->rtdm_fd = rtdm_fd_get(dev->socket,0); |
246 if (IS_ERR(dev->rtdm_fd)){ |
246 if (IS_ERR(dev->rtdm_fd)){ |
247 printk(" rtdm_fd_get() = %d!\n", ret); |
247 printk(" rtdm_fd_get() = %d!\n", ret); |
248 ret = PTR_ERR(dev->rtdm_fd); |
248 ret = PTR_ERR(dev->rtdm_fd); |
249 goto out_err; |
249 goto out_err_rtdm_fd; |
250 } |
250 } |
251 |
251 |
252 printk(KERN_ERR PFX "Binding socket to interface %i (%s).\n", |
252 printk(KERN_ERR PFX "Binding socket to interface %i (%s).\n", |
253 desc->ifindex, desc->name); |
253 desc->ifindex, desc->name); |
254 |
254 |
258 sa.sll_ifindex = desc->ifindex; |
258 sa.sll_ifindex = desc->ifindex; |
259 ret = rtdm_bind(dev->socket, (struct sockaddr *)&sa, |
259 ret = rtdm_bind(dev->socket, (struct sockaddr *)&sa, |
260 sizeof(struct sockaddr_ll)); |
260 sizeof(struct sockaddr_ll)); |
261 if (ret < 0) { |
261 if (ret < 0) { |
262 printk(" rtdm_bind() = %d!\n", ret); |
262 printk(" rtdm_bind() = %d!\n", ret); |
263 goto out_err; |
263 goto out_err_bind; |
264 } |
264 } |
265 |
265 |
266 return 0; |
266 return 0; |
267 |
267 |
268 out_err: |
268 out_err_bind: |
269 rtdm_fd_put(dev->rtdm_fd); |
269 rtdm_fd_put(dev->rtdm_fd); |
|
270 out_err_rtdm_fd: |
270 rtdm_close(dev->socket); |
271 rtdm_close(dev->socket); |
271 dev->socket = -1; |
272 dev->socket = -1; |
272 return ret; |
273 return ret; |
273 |
274 |
274 } |
275 } |
373 // msg.msg_name = &dev->dest_addr; |
374 // msg.msg_name = &dev->dest_addr; |
374 // msg.msg_namelen = sizeof(dev->dest_addr); |
375 // msg.msg_namelen = sizeof(dev->dest_addr); |
375 msg.msg_iov = &iov; |
376 msg.msg_iov = &iov; |
376 msg.msg_iovlen = 1; |
377 msg.msg_iovlen = 1; |
377 |
378 |
378 if (rtdm_in_rt_context()) |
379 if (rtdm_in_rt_context()) |
379 /* HACK : call fd ops directly as in rtdm's fd.c */ |
380 /* HACK : call fd ops directly as in rtdm's fd.c */ |
380 ret = dev->rtdm_fd->ops->sendmsg_rt(dev->rtdm_fd, &msg, 0); |
381 ret = dev->rtdm_fd->ops->sendmsg_rt(dev->rtdm_fd, &msg, 0); |
381 else |
382 else |
382 ret = nrt_rtdm_sendmsg(dev->socket, &msg); |
383 ret = nrt_rtdm_sendmsg(dev->socket, &msg); |
383 |
384 |
384 return ret == len ? NETDEV_TX_OK : NETDEV_TX_BUSY; |
385 return ret == len ? NETDEV_TX_OK : NETDEV_TX_BUSY; |
385 } |
386 } |
386 |
387 |