The biggest problem here is the fact that you are calling lwIP from a context other than the Ethernet interrupt handler. lwIP is not re-entrant so you must only call it from one context. When using an RTOS, this means only calling the lwIP APIs from a single thread. When not using an RTOS (like most of our examples), you must make calls in the context of the Ethernet interrupt handler. This can be tricky to do but there's a timer callback implemented that makes it a bit easier. Make sure you set HOST_TMR_INTERVAL to some non-zero value (I think it's a number of milliseconds) and implement lwIPHostTimerHandler in your application then make all your lwIP calls from the lwIPHostTimerHandler function.
This may sound awkward but it's vital. Calling udp_send from the main loop will likely work for a while but I guarantee you that it will crash after some period of time as some internal data structure in lwIP gets corrupted. This kind of problem is VERY difficult to debug so it's far better to fix this now rather than trying to pretend everything is OK and have it fail catastrophically later.