Hi,

At BSDCan, someone reported that a sparc64 machine would panic if it was
receiving any traffic on a member interface of a switch(4) during reboot. We
got as far as getting this trace:

panic: trap type 0x34 (mem address not aligned): pc=15864ec
npc=15864f0 pstate=99820006<PRIV,IE>
Stopped at      db_enter+0x8:   nop
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
  22221  86809      0    0x100002          0    1  ld
  22929    608     49    0x100012          0    8  switchd
*136438  67954      0     0x14000      0x200    3K softnet
trap(404f9b994f0, 34, 15864ec, 99820006, 14, 0) at trap+0x2e0
Lslowtrap_reenter(4000d9c9b88, 4c, 1, 0, 4000d9c9b70, 0) at 
Lslowtrap_reenter+0xf8
swofp_action_output_controller(4000d135000, 4000d13d100, 4000c2db5e0, ffff, 0, 
3b9ac800) at swofp_action_output_controller+0x1f4
swofp_action_output(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a8, 
4000c2db5e0, 6) at swofp_action_output+0x228
swofp_execute_action(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a8, 0, 
1c289c0) at swofp_execute_action+0x34
swofp_apply_actions(4000d135000, 4000d425400, 4000c2db5e0, 4000cd300a0, 
404f9b99ae8, 40079ac8000) at swofp_apply_actions+0x78
swofp_forward_ofs(4000c2db5e0, 4000d0a0d40, 4000d425400, 0, 404f9b99ae8, 
40079ac8000) at swofp_forward_ofs+0xd8
switch_process(4000d128000, 4000d425400, 0, 2, 4000d128590, 16c8710) at 
switch_process+0x118
switchintr(1cb5560, 3c4, 20, 0, 0, 6) at switchintr+0x94
if_netisr(1c00, 404f9b99de0, 1c2ad38, 8000000, 40000000, 20000000) at 
if_netisr+0x1f0
taskq_thread(4000cd3c040, 4000cd04000, 17de528, 165f968, 0, 3b9ac800) at 
taskq_thread+0x6c
proc_trampoline(0, 0, 0, 0, 0, 0) at proc_trampoline+0x14


o...@eigenstate.org and I put together the following diff. I haven't been able
to check with the original reporter, and I don't have a machine to test it on,
so comments and/or tests would be appreciated!


Thanks,
Ayaka


Index: switchofp.c
===================================================================
RCS file: /cvs/src/sys/net/switchofp.c,v
retrieving revision 1.70
diff -u -p -u -r1.70 switchofp.c
--- switchofp.c 19 Feb 2018 08:59:52 -0000      1.70
+++ switchofp.c 19 Jun 2018 04:14:04 -0000
@@ -2455,12 +2455,12 @@ swofp_ox_match_put_uint32(struct ofp_mat
        int      off = ntohs(om->om_length);
        struct ofp_ox_match *oxm;
 
+       val = htonl(val);
        oxm = (struct ofp_ox_match *)((caddr_t)om + off);
        oxm->oxm_class = htons(OFP_OXM_C_OPENFLOW_BASIC);
        OFP_OXM_SET_FIELD(oxm, type);
        oxm->oxm_length = sizeof(uint32_t);
-       *(uint32_t *)oxm->oxm_value = htonl(val);
-
+       memcpy(oxm->oxm_value, &val, sizeof(val));
        om->om_length = htons(ntohs(om->om_length) +
            sizeof(*oxm) + sizeof(uint32_t));
 
@@ -2473,12 +2473,12 @@ swofp_ox_match_put_uint64(struct ofp_mat
        struct ofp_ox_match     *oxm;
        int                      off = ntohs(om->om_length);
 
+       val = htobe64(val);
        oxm = (struct ofp_ox_match *)((caddr_t)om + off);
        oxm->oxm_class = htons(OFP_OXM_C_OPENFLOW_BASIC);
        OFP_OXM_SET_FIELD(oxm, type);
        oxm->oxm_length = sizeof(uint64_t);
-       *(uint64_t *)oxm->oxm_value = htobe64(val);
-
+       memcpy(oxm->oxm_value, &val, sizeof(val));
        om->om_length = htons(ntohs(om->om_length) +
            sizeof(*oxm) + sizeof(uint64_t));
 

Reply via email to