4747#include "ff_api.h"
4848#include "ff_config.h"
4949
50+ #include <sys/socketvar.h>
51+ #include <sys/sockio.h>
52+ #include <net/if.h>
53+ #include <net/if_var.h>
54+ #include <netinet/in_var.h>
55+
56+ int lo_set_defaultaddr (void );
57+
5058int ff_freebsd_init (void );
5159
5260extern void mutex_init (void );
@@ -64,6 +72,52 @@ extern cpuset_t all_cpus;
6472
6573long physmem ;
6674
75+ int lo_set_defaultaddr (void )
76+ {
77+ struct in_aliasreq req ;
78+ char * addr = "127.0.0.1" ;
79+ char * netmask = "255.0.0.0" ;
80+ struct ifnet * ifp = NULL ;
81+ int ret ;
82+
83+ IFNET_WLOCK ();
84+ TAILQ_FOREACH (ifp , & V_ifnet , if_link )
85+ if ( (ifp -> if_flags & IFF_LOOPBACK ) != 0 )
86+ break ;
87+ IFNET_WUNLOCK ();
88+
89+ if (ifp == NULL )
90+ return -1 ;
91+
92+ bzero (& req , sizeof req );
93+ strcpy (req .ifra_name , ifp -> if_xname );
94+
95+ struct sockaddr_in sa ;
96+ bzero (& sa , sizeof (sa ));
97+
98+ sa .sin_len = sizeof (sa );
99+ sa .sin_family = AF_INET ;
100+
101+ inet_pton (AF_INET , addr , & sa .sin_addr .s_addr );
102+ bcopy (& sa , & req .ifra_addr , sizeof (sa ));
103+
104+ inet_pton (AF_INET , netmask , & sa .sin_addr .s_addr );
105+ bcopy (& sa , & req .ifra_mask , sizeof (sa ));
106+
107+ //sa.sin_addr.s_addr = sc->broadcast;
108+ //bcopy(&sa, &req.ifra_broadaddr, sizeof(sa));
109+
110+ struct socket * so = NULL ;
111+ ret = socreate (AF_INET , & so , SOCK_DGRAM , 0 , curthread -> td_ucred , curthread );
112+ if (ret != 0 )
113+ return ret ;
114+
115+ ret = ifioctl (so , SIOCAIFADDR , (caddr_t )& req , curthread );
116+ sofree (so );
117+
118+ return ret ;
119+ }
120+
67121int
68122ff_freebsd_init (void )
69123{
@@ -125,5 +179,9 @@ ff_freebsd_init(void)
125179 cur = cur -> next ;
126180 }
127181
182+ error = lo_set_defaultaddr ();
183+ if (error != 0 )
184+ printf ("set loopback port default addr failed!" );
185+
128186 return (0 );
129187}
0 commit comments