> But you have something which needs to be fixed (you see a crash). Question is
> what is causing the crash and what can be done against it.
First off, this is 2016.0. There has been some changes in this area
after that release.
The crash itself is happening in batadv_if_ogm_queue_add(). I don't
have an exact matching .lst file for the binary, but:
00000a70 <batadv_iv_ogm_queue_add>:
unsigned char *packet_buff,
int packet_len,
struct batadv_hard_iface *if_incoming,
struct batadv_hard_iface *if_outgoing,
int own_packet, unsigned long send_time)
{
a70: 55 push %ebp
a71: 89 e5 mov %esp,%ebp
a73: 57 push %edi
a74: 56 push %esi
a75: 89 c6 mov %eax,%esi
a77: 53 push %ebx
a78: 83 ec 34 sub $0x34,%esp
a7b: 89 55 e8 mov %edx,-0x18(%ebp)
a7e: 89 4d e4 mov %ecx,-0x1c(%ebp)
struct batadv_ogm_packet *batadv_ogm_packet;
bool direct_link;
unsigned long max_aggregation_jiffies;
batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
direct_link = batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0;
I think it is this deference of batadv_ogm_packet->flags which is
going wrong. I also don't have a good opps dump. I'm on an intel,
without a serial port, just a VGA, and it is a recursive fault, and
the first Opps has scrolled off the top...
> I am currently
> wondering how the if_incoming interface is being protected.
I do think it is the if_incoming. The call stack is
batadv_send_outstanding_bat_ogm_packet()
batadv_schedule_bat_ogm()
batadv_tvlv_container_ogm_append()
batadv_iv_ogm_queue_add()
so we have
void batadv_send_outstanding_bat_ogm_packet(struct work_struct *work)
{
...
/* we have to have at least one packet in the queue to determine the
* queues wake up time unless we are shutting down.
*
* only re-schedule if this is the "original" copy, e.g. the OGM of the
* primary interface should only be rescheduled once per period, but
* this function will be called for the forw_packet instances of the
* other secondary interfaces as well.
*/
if (forw_packet->own &&
forw_packet->if_incoming == forw_packet->if_outgoing)
batadv_schedule_bat_ogm(forw_packet->if_incoming);
I will try to reproduce this with the latest code.
Andrew