Re: Fatal trap 12 booting FreeBSD-CURRENT via isboot kernel module.

From: John Nielsen <lists_at_jnielsen.net>
Date: Tue, 6 Feb 2018 10:54:58 -0700
> On Feb 4, 2018, at 2:50 AM, Maurizio Vairani <maurizio1018_at_gmail.com> wrote:
> 
> 2018-01-29 18:38 GMT+01:00 John Nielsen <lists_at_jnielsen.net>:
> [ resending from correct email address ]
> 
>> On Jan 29, 2018, at 6:05 AM, Maurizio Vairani <maurizio1018_at_gmail.com> wrote:
>> 
>> I am running
>> # uname
>> -a
>> 
>> FreeBSD  12.0-CURRENT FreeBSD 12.0-CURRENT #0 r328383: Thu Jan 25 04:48:52
>> UTC 2018     root_at_releng3.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC
>> amd64
>> 
>> After compiling the kernel module as discussed in this thread :
>> https://lists.freebsd.org/pipermail/freebsd-current/2018-January/068272.html
>> 
>> I can boot FreeBSD via iSCSI using iPXE. But when the isboot, the iSCSI
>> boot driver version 0.2.13, starts I receive a panic:
>> https://mega.nz/#!tkVwBBKA!PUj14-Za6KCNaoo9hxuXORRLQoWkb4LMvTdUA1BorD4
>> 
>> Any idea?
> 
> Bummer! 
> 
> Aoyama-san-
> 
> Are you still maintaining isboot? Can you help debug this issue on FreeBSD 12-CURRENT?
> 
> Once we get it working I will update the port with whatever is needed and send you the patches in case you'd like to cut a new release.
> 
> Thank you!
> 
> I have solved the issue changing the function isboot_ifup() in the source file isboot.c.

Here is a patch with some changes to minimize the diff. Except for the printed error messages does that look functionally equivalent?

Now the question is why is this change needed and for what values of __FreeBSD_version is it appropriate?

# diff -u isboot.c.patched1 isboot.c
--- isboot.c.patched1	2018-02-06 10:35:20.808692000 -0700
+++ isboot.c	2018-02-06 10:50:05.347663000 -0700
_at__at_ -417,28 +417,36 _at__at_
 isboot_ifup(struct ifnet *ifp)
 {
 	struct ifreq ifr;
+	struct socket *so;
 	struct thread *td;
 	int error;
 
 	memset(&ifr, 0, sizeof(ifr));
 	td = curthread;
 
+	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, td->td_ucred, td);
+	if (error) {
+		printf("%s: socreate, error=%d\n", __func__, error);
+		return (error);
+	}
+
 	/* boot NIC */
 	strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name));
 
 	/* set IFF_UP */
-	error = ifioctl(NULL, SIOCGIFFLAGS, (caddr_t)&ifr, td);
+	error = ifioctl(so, SIOCGIFFLAGS, (caddr_t)&ifr, td);
 	if (error) {
 		printf("ifioctl SIOCGIFFLAGS\n");
 		return (error);
 	}
 	ifr.ifr_flags |= IFF_UP;
-	error = ifioctl(NULL, SIOCSIFFLAGS, (caddr_t)&ifr, td);
+	error = ifioctl(so, SIOCSIFFLAGS, (caddr_t)&ifr, td);
 	if (error) {
 		printf("ifioctl SIOCSIFFLAGS\n");
 		return (error);
 	}
 
+	soclose(so);
 	return (0);
 }


> static int
> isboot_ifup(struct ifnet *ifp)
> {
>     struct socket *so;
>     struct ifreq ifr;
>     struct thread *td;
>     int error;
> 
>     td = curthread;
>     error = socreate(AF_INET, &so, SOCK_DGRAM, 0, td->td_ucred, td);
>     if (error) {
>         printf("%s: socreate, error=%d\n", __func__, error);
>         return (error);
>     }
> 
>     /* boot NIC */
>     memset(&ifr, 0, sizeof(ifr));
>     strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name));
> 
>     /* set IFF_UP */
>     error = ifioctl(so, SIOCGIFFLAGS, (caddr_t)&ifr, td);
>     if (error) {
>         printf("%s: ifioctl SIOCGIFFLAGS, error=%d\n", __func__, error);
>         return (error);
>     }
> 
>     ifr.ifr_flags |= IFF_UP;
>     error = ifioctl(so, SIOCSIFFLAGS, (caddr_t)&ifr, td);
>     if (error) {
>         printf("%s, ifioctl SIOCSIFFLAGS, error=%d\n", __func__, error);
>         return (error);
>     }
>     soclose(so);
>     return (0);
> }
> 
> I have added a socket in the ifioctl() call as in the /usr/src/sys/nfs/bootp_subr.c source.
> Please let me know if you prefer a patch.
> --
> Regards,
> Maurizio
> 
Received on Tue Feb 06 2018 - 17:25:29 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:14 UTC