#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* :-/ */ #include int ofld_connect(struct socket *so, struct sockaddr *nam) { struct inpcb *inp = sotoinpcb(so); struct ifnet *ifp; struct toedev *tdev; int err; if (inp->inp_route.ro_rt == NULL) { inp->inp_route.ro_rt = rtalloc2(nam, 1, 0); if (inp->inp_route.ro_rt) memcpy(&inp->inp_route.ro_dst, nam, sizeof(struct sockaddr)); } if (inp->inp_route.ro_rt == NULL) { printf("no route found for offload\n"); return (EHOSTUNREACH); } ifp = inp->inp_route.ro_rt->rt_ifp; tdev = TOEDEV(ifp); if (tdev == NULL) return (EINVAL); if (tdev->can_offload(tdev, so) == 0) { printf("can't offload\n"); return (EINVAL); } if ((err = tdev->connect(tdev, so, ifp))) return (err); printf("connected!!!\n"); return (0); } int ofld_send(struct tcpcb *tp) { return tp->t_tu->tu_send(tp); } int ofld_rcvd(struct tcpcb *tp) { return tp->t_tu->tu_rcvd(tp); } int ofld_disconnect(struct tcpcb *tp) { return tp->t_tu->tu_disconnect(tp); } int ofld_abort(struct tcpcb *tp) { return tp->t_tu->tu_abort(tp); } void ofld_listen_open(struct tcpcb *tp) { EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_OPEN, tp); } void ofld_listen_close(struct tcpcb *tp) { EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_CLOSE, tp); }