forked from Imagelibrary/rtems
2009-04-28 Chris Johns <chrisj@rtems.org>
* libnetworking/nfs/bootp_subr.c: Fixed PR1384. The route set in
the initialise pass is not deleted so an exists error is
returned. Ignore the error. Print the server address as an IP
address not hex digits.
* libnetworking/rtems/rtems_dhcp.c: Fixed
PR1338. Close the socket, handle the returned event flags.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
2009-04-28 Chris Johns <chrisj@rtems.org>
|
||||
|
||||
* libnetworking/nfs/bootp_subr.c: Fixed PR1384. The route set in
|
||||
the initialise pass is not deleted so an exists error is
|
||||
returned. Ignore the error. Print the server address as an IP
|
||||
address not hex digits.
|
||||
|
||||
* libnetworking/rtems/rtems_dhcp.c: Fixed
|
||||
PR1338. Close the socket, handle the returned event flags.
|
||||
|
||||
2009-04-28 Chris Johns <chrisj@rtems.org>
|
||||
|
||||
* sapi/include/confdefs.h: Add a prototype for Init with C linkage
|
||||
|
||||
@@ -464,10 +464,12 @@ bootpc_call(
|
||||
|
||||
} /* while secs */
|
||||
} /* forever send/receive */
|
||||
|
||||
printf("BOOTP timeout for server 0x%x\n",
|
||||
(int)ntohl(sin->sin_addr.s_addr));
|
||||
|
||||
{
|
||||
uint32_t addr = ntohl(sin->sin_addr.s_addr);
|
||||
printf("BOOTP timeout for server %lu.%lu.%lu.%lu\n",
|
||||
(addr >> 24) & 0xff, (addr >> 16) & 0xff,
|
||||
(addr >> 8) & 0xff, addr & 0xff);
|
||||
}
|
||||
error = ETIMEDOUT;
|
||||
goto out;
|
||||
|
||||
@@ -518,7 +520,12 @@ bootpc_fakeup_interface(struct ifreq *ireq,struct socket *so,
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_addr.s_addr = INADDR_ANY;
|
||||
error = ifioctl(so, SIOCSIFADDR, (caddr_t)ireq, procp);
|
||||
if (error) {
|
||||
/*
|
||||
* Ignore a File already exists (EEXIST) error code. This means a
|
||||
* route for the address is already present and is returned on
|
||||
* a second pass to here.
|
||||
*/
|
||||
if (error && (error != EEXIST)) {
|
||||
printf("bootpc_fakeup_interface: set if addr, error=%s\n", strerror(error));
|
||||
return error;
|
||||
}
|
||||
@@ -549,7 +556,6 @@ bootpc_fakeup_interface(struct ifreq *ireq,struct socket *so,
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/* Add default route to 0.0.0.0 so we can send data */
|
||||
|
||||
bzero((caddr_t) &dst, sizeof(dst));
|
||||
@@ -573,8 +579,10 @@ bootpc_fakeup_interface(struct ifreq *ireq,struct socket *so,
|
||||
(struct sockaddr *) &mask,
|
||||
RTF_UP | RTF_STATIC
|
||||
, NULL);
|
||||
if (error)
|
||||
printf("bootpc_fakeup_interface: add default route, error=%d\n", error);
|
||||
if (error && error != EEXIST)
|
||||
printf("bootpc_fakeup_interface: add default route, error=%s\n",
|
||||
strerror(error));
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@@ -689,24 +689,31 @@ dhcp_task (rtems_task_argument _sdl)
|
||||
int error;
|
||||
struct proc *procp = NULL;
|
||||
int disconnected;
|
||||
rtems_status_code ev_st;
|
||||
|
||||
sdl = (struct sockaddr_dl *) _sdl;
|
||||
|
||||
count = dhcp_elapsed_time;
|
||||
disconnected = 0;
|
||||
|
||||
|
||||
while (TRUE)
|
||||
while (true)
|
||||
{
|
||||
/*
|
||||
* Sleep until the next poll
|
||||
*/
|
||||
timeout = TOD_MILLISECONDS_TO_TICKS (1000);
|
||||
rtems_event_receive (RTEMS_EVENT_0,
|
||||
RTEMS_WAIT | RTEMS_EVENT_ANY,
|
||||
timeout, &event_out);
|
||||
ev_st = rtems_event_receive (RTEMS_EVENT_0,
|
||||
RTEMS_WAIT | RTEMS_EVENT_ANY,
|
||||
timeout, &event_out);
|
||||
|
||||
if(event_out & RTEMS_EVENT_0) break;
|
||||
/*
|
||||
* Check if not a poll timeout. So when ANY event received, exit task.
|
||||
* Actually, only event RTEMS_EVENT_0 sent from rtem_dhcp_failsafe.c
|
||||
* if "failsafe" dhcp enabled when interface down. Otherwise, no
|
||||
* event should occur, just timeout.
|
||||
*/
|
||||
if(ev_st != RTEMS_TIMEOUT)
|
||||
break;
|
||||
|
||||
count++;
|
||||
|
||||
@@ -714,7 +721,7 @@ dhcp_task (rtems_task_argument _sdl)
|
||||
{
|
||||
rtems_bsdnet_semaphore_obtain ();
|
||||
|
||||
dhcp_request_req (&call, &dhcp_req, sdl, TRUE);
|
||||
dhcp_request_req (&call, &dhcp_req, sdl, true);
|
||||
|
||||
/*
|
||||
* Send the Request.
|
||||
@@ -878,7 +885,7 @@ dhcp_init (int update_files)
|
||||
sprintf (ireq.ifr_name, "%s%d", ifp->if_name, ifp->if_unit);
|
||||
|
||||
if ((error = socreate (AF_INET, &so, SOCK_DGRAM, 0, procp)) != 0) {
|
||||
printf ("dhcpc_init: socreate, error=%d\n", error);
|
||||
printf ("dhcpc_init: socreate, error: %s\n", strerror(error));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -896,11 +903,13 @@ dhcp_init (int update_files)
|
||||
|
||||
if (!sdl){
|
||||
printf ("dhcpc_init: Unable to find HW address\n");
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
if (sdl->sdl_alen != EALEN) {
|
||||
printf ("dhcpc_init: HW address len is %d, expected value is %d\n",
|
||||
sdl->sdl_alen, EALEN);
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -914,7 +923,8 @@ dhcp_init (int update_files)
|
||||
*/
|
||||
error = bootpc_call (&call, &reply, procp);
|
||||
if (error) {
|
||||
printf ("BOOTP call failed -- error %d\n", error);
|
||||
printf ("BOOTP call failed -- %s\n", strerror(error));
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -923,6 +933,7 @@ dhcp_init (int update_files)
|
||||
*/
|
||||
if (memcmp (&reply.vend[0], dhcp_magic_cookie, sizeof (dhcp_magic_cookie)) != 0) {
|
||||
printf ("DHCP server did not send Magic Cookie.\n");
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -930,17 +941,19 @@ dhcp_init (int update_files)
|
||||
|
||||
if (dhcp_message_type != DHCP_OFFER) {
|
||||
printf ("DHCP server did not send a DHCP Offer.\n");
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a DHCP REQUEST
|
||||
*/
|
||||
dhcp_request_req (&call, &reply, sdl, TRUE);
|
||||
dhcp_request_req (&call, &reply, sdl, true);
|
||||
|
||||
error = bootpc_call (&call, &reply, procp);
|
||||
if (error) {
|
||||
printf ("BOOTP call failed -- error %d\n", error);
|
||||
printf ("BOOTP call failed -- %s\n", strerror(error));
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -949,6 +962,7 @@ dhcp_init (int update_files)
|
||||
*/
|
||||
if (memcmp (&reply.vend[0], dhcp_magic_cookie, sizeof (dhcp_magic_cookie)) != 0) {
|
||||
printf ("DHCP server did not send Magic Cookie.\n");
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -956,6 +970,7 @@ dhcp_init (int update_files)
|
||||
|
||||
if (dhcp_message_type != DHCP_ACK) {
|
||||
printf ("DHCP server did not accept the DHCP request\n");
|
||||
soclose (so);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1106,8 +1121,10 @@ dhcp_init (int update_files)
|
||||
*/
|
||||
void rtems_bsdnet_do_dhcp (void)
|
||||
{
|
||||
bool update = true;
|
||||
rtems_bsdnet_semaphore_obtain ();
|
||||
while( dhcp_init (TRUE) < 0 ) {
|
||||
while( dhcp_init (update) < 0 ) {
|
||||
update = false;
|
||||
rtems_bsdnet_semaphore_release();
|
||||
rtems_task_wake_after(TOD_MILLISECONDS_TO_TICKS(1000));
|
||||
rtems_bsdnet_semaphore_obtain ();
|
||||
@@ -1120,7 +1137,7 @@ int rtems_bsdnet_do_dhcp_timeout( void )
|
||||
int return_value;
|
||||
|
||||
rtems_bsdnet_semaphore_obtain ();
|
||||
return_value = dhcp_init (FALSE);
|
||||
return_value = dhcp_init (false);
|
||||
rtems_bsdnet_semaphore_release ();
|
||||
|
||||
return return_value;
|
||||
|
||||
Reference in New Issue
Block a user