program() and program_mut() are now generic and can return the inner
program type, which is what you want 99.999% of the time, eg:
let prog = bpf.program_mut::<&mut Xdp>("foo")?.unwrap();
prog.load()?;
prog.attach("eth0")?;
The methods will fail if the requested program is not of the expected
type (eg if you try to retrieve a kprobe as an xdp program).
map() and map_mut() used to return Ref<Map>, then to convert to a concrete
type you had to:
let mut perf_map: PerfMap<_> = bpf.map_mut("PERF_MAP").unwrap().try_into()?;;
But the base Map type is pretty much only useful internally. This change
makes map() and map_mut() use TryInto internally, so that now
conversions can can be done with:
let mut perf_map: PerfMap<_> = bpf.map_mut("PERF_MAP")?.unwrap();