Lines Matching refs:so

50 static u_int8_t udp_tos(struct socket *so);
51 static void udp_emu(struct socket *so, struct mbuf *m);
82 struct socket *so;
168 so = udp_last_so;
169 if (so->so_lport != uh->uh_sport ||
170 so->so_laddr.s_addr != ip->ip_src.s_addr) {
178 so = tmp;
183 so = NULL;
186 udp_last_so = so;
190 if (so == NULL) {
195 if ((so = socreate()) == NULL) goto bad;
196 if(udp_attach(so) == -1) {
199 sofree(so);
206 /* udp_last_so = so; */
207 so->so_laddr = ip->ip_src;
208 so->so_lport = uh->uh_sport;
210 if ((so->so_iptos = udp_tos(so)) == 0)
211 so->so_iptos = ip->ip_tos;
219 so->so_faddr = ip->ip_dst; /* XXX */
220 so->so_fport = uh->uh_dport; /* XXX */
229 if (so->so_emu)
230 udp_emu(so, m);
232 if(sosendto(so,m) == -1) {
240 m_free(so->so_m); /* used for ICMP if error on sorecvfrom */
246 so->so_m=m; /* ICMP backup */
255 int udp_output2(struct socket *so, struct mbuf *m,
263 DEBUG_ARG("so = %lx", (long)so);
305 error = ip_output(so, m);
310 int udp_output(struct socket *so, struct mbuf *m,
317 if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) {
318 if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff))
321 (ntohl(so->so_faddr.s_addr) & 0xff) != CTL_ALIAS)
322 saddr.sin_addr.s_addr = so->so_faddr.s_addr;
324 daddr.sin_addr = so->so_laddr;
325 daddr.sin_port = so->so_lport;
327 return udp_output2(so, m, &saddr, &daddr, so->so_iptos);
331 udp_attach(struct socket *so)
335 if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) {
339 * here so that emulation of ytalk etc. don't have to do it
344 if(bind(so->s, (struct sockaddr *)&addr, sizeof(addr))<0) {
346 closesocket(so->s);
347 so->s=-1;
355 so->so_expire = curtime + SO_EXPIRE;
356 insque(so,&udb);
359 return(so->s);
363 udp_detach(struct socket *so)
365 closesocket(so->s);
366 /* if (so->so_m) m_free(so->so_m); done by sofree */
368 sofree(so);
380 udp_tos(struct socket *so)
385 if ((udptos[i].fport && ntohs(so->so_fport) == udptos[i].fport) ||
386 (udptos[i].lport && ntohs(so->so_lport) == udptos[i].lport)) {
387 so->so_emu = udptos[i].emu;
404 udp_emu(struct socket *so, struct mbuf *m)
437 switch(so->so_emu) {
448 if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0)
451 #define IS_OLD (so->so_emu == EMU_TALK)
510 if (so == req->udp_so)
513 if (!req) { /* no entry for so, create new */
516 req->udp_so = so;
587 if (so == req_tbl->udp_so) {
595 if (so == req->udp_so) {
618 if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0)
633 struct socket *so;
636 if ((so = socreate()) == NULL) {
637 free(so);
640 so->s = socket(AF_INET,SOCK_DGRAM,0);
641 so->so_expire = curtime + SO_EXPIRE;
642 insque(so,&udb);
648 if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0) {
649 udp_detach(so);
652 setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
653 /* setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int)); */
655 getsockname(so->s,(struct sockaddr *)&addr,&addrlen);
656 so->so_fport = addr.sin_port;
658 so->so_faddr = alias_addr;
660 so->so_faddr = addr.sin_addr;
662 so->so_lport = lport;
663 so->so_laddr.s_addr = laddr;
665 so->so_expire = 0;
667 so->so_state = SS_ISFCONNECTED;
669 return so;