|
From: Mattias A. <mat...@us...> - 2001-03-26 15:30:37
|
The following file was modified in apps/bluetooth/experimental:
Name Old version New version Comment
---- ----------- ----------- -------
btd.c 1.5 1.6=20=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
btd now retries if IPA server is not responding
forgot to set peer state to PPP_CONFDONE after successfully received ipa pa=
rs
added state checks when parsing ipa responses
added ipa error return values
fixed typos
The diff of the modified file(s):
--- btd.c 2001/03/21 20:48:04 1.5
+++ btd.c 2001/03/26 15:30:36 1.6
@@ -360,25 +360,26 @@
default:
{
/* Got data on some fd */
- int i;=20=20=20=20=20=20=20=20
+ int i, retval;
=20=20
+#ifdef USE_IPASSIGN=20
for (i=3D0; i < result; i++)=20
{
-#ifdef USE_IPASSIGN
/* IPA response */
if (FD_ISSET(ipa_fd, &rfd))
{
msg =3D (struct ipa_msg*) ipa_buf;
/* Got response from IPA, if ok then start pppd or modem emul =
*/
ipa_read(ipa_fd, msg);
- parse_ipa_response(msg);
+ if ((retval =3D parse_ipa_response(msg)) < 0)
+ {
+ /* FIXME -- we got an error. Reset peer ? */
+ syslog(LOG_INFO, "Got IPA error %d", retval);
}
-#else
- /* Got data on a line */
- printf("Other data (?)\n");
-#endif=09=20=20
}=20
}
+#endif
+ }
break;
}=20=20=20=20
} /* while */
@@ -749,12 +750,27 @@
=20=20=20
#ifdef USE_IPASSIGN
/* Look for IPA server */
+ ipa_fd =3D -1;
+ i =3D 1;
+ while (ipa_fd < 0)=20
+ {=20=20
ipa_fd =3D open_socket(IPASERVER, CLIENT);
if (ipa_fd < 0)
{
- printf("Found no IPA server\n");
+ syslog(LOG_INFO, "Found no IPA server");
+
+ if (i > 8)
+ {=20=20
exit(1);=20
}
+ else
+ {
+ syslog(LOG_INFO, "Retrying in %d sec", i);
+ sleep(i);
+ i*=3D2;
+ }=20=20=20=20=20=20
+ }=20
+ }=20
#endif
=20=20=20
if (modem_emul =3D=3D 1)
@@ -854,13 +870,23 @@
case IPARSP_STATUS:
{
ipa_status *rsp =3D (struct ipa_status*)(msg->msg);
- D(syslog(LOG_INFO, "ipa_parse_msg : got status %d on line\n",=20
+ D(syslog(LOG_INFO, "parse_ipa_response : got status %d on line\n",=
=20
rsp->status, rsp->id));
=20=20=20=20=20=20=20=20=20
+ /* Check state */
+ if (STATE(rsp->id) !=3D WAITING_RETURN_PPPCONF)
+ {
+ syslog(LOG_INFO, "parse_ipa_response : wrong state");
+ return -ERR_WRONGSTATE;
+ }
+
/* Check status */
if (rsp->status =3D=3D IPA_STATUSFAILED)
+ {
syslog(LOG_INFO, "parse_ipa_response : request failed [line:%d]\n"=
,=20
rsp->id);
+ return -IPA_STATUSFAILED;
+ }=20=20=20=20=20=20
else
D(syslog(LOG_INFO, "parse_ipa_response : request succeeded [line:%d]\n", =
rsp->id));
=20
@@ -869,32 +895,33 @@
=20
STATE(rsp->id) =3D NOCONNECTION;
=20
- return rsp->status;
+ return 0;
}
=20=20=20=20=20
case IPARSP_PEERSETTINGS:
{
ipa_response* rsp =3D (struct ipa_response*)(msg->msg);
- D(syslog(LOG_INFO, "ipa_parse_msg : got client settings\n"));
+ D(syslog(LOG_INFO, "parse_ipa_response : got client settings\n"));
=20=20=20=20=20=20=20
+ /* Check state */
+ if (STATE(rsp->id) !=3D WAITING_PPPCONF)
+ {
+ syslog(LOG_INFO, "parse_ipa_response : wrong state");
+ return -ERR_WRONGSTATE;
+ }
+
/* Check status */
if (rsp->status =3D=3D IPA_STATUSFAILED)
{
/* error */
printf("parse_ipa_response : failed to get client settings\n");
- return rsp->status;
+ return -ERR_REQUESTFAILED;
}
=20
/* Store ipa settings in peer struct */
memcpy(PEER(rsp->id).ipset, &rsp->set, msg->len);
=20
- /* Now proceed to next state */
- if (PEER(rsp->id).state =3D=3D WAITING_PPPCONF)
- {
PEER(rsp->id).state =3D PPPCONF_DONE;
- }=20=20=20=20=20=20
- else
- syslog(LOG_INFO, "Warning : Wrong state on line %d, should have been WAIT=
ING_PPPCONF", rsp->id);
=20
/* Build options and start ppp */
build_pppdopts(rsp->id, (char**)pppd_options);
@@ -903,6 +930,7 @@
}=20
=20=20=20=20=20
default :
+ syslog(LOG_INFO, "Error : Unknown message type");
break;
}
return 0;
|