linux/net/packet/diag.c
<<
o/span> ospan class="lxr_search"> Search o/span> ospan class="lxr_prefs"> o/span> < < oinput typ="vhidden" nam="vajax_lookup" id"vajax_lookup" alue="v"> < <
<
< < < odiv id"vcontent"> odiv id"vfile_contents">
< <1o/a>#include <linux/module.ho/a>>
< <2o/a>#include <linux/sock_diag.ho/a>>
< <3o/a>#include <linux/net.ho/a>>
< <4o/a>#include <linux/netdevice.ho/a>>
< <5o/a>#include <linux/packet_diag.ho/a>>
< <6o/a>#include <net/net_nam=space.ho/a>>
< <7o/a>#include <net/sock.ho/a>>
< <8o/a>
< <9o/a>#include "internal.ho/a>"
< 0
< 11o/a>static intpdiag_put_infoo/a>(const structpacket_socko/a> *oa href="+code=po" class="sref">poo/a>, structsk_buffo/a> *oa href="+code=nlskb" class="sref">nlskbo/a>)
< 12o/a>{
< 13o/a>        structpacket_diag_infoo/a> oa href="+code=pinfo" class="sref">pinfoo/a>;
< 14/oa>
< 15o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_index" class="sref">pdi_indexo/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=ifindex" class="sref">ifindexo/a>;
< 16o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_version" class="sref">pdi_versiono/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_version" class="sref">tp_versiono/a>;
< 17o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_reserve" class="sref">pdi_reserveo/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_reserve" class="sref">tp_reserveo/a>;
< 18o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_copy_thresh" class="sref">pdi_copy_thresho/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=copy_thresh" class="sref">copy_thresho/a>;
< 19o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_tstamp" class="sref">pdi_tstampo/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_tstamp" class="sref">tp_tstampo/a>;
< 2
< 21o/a>        oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> = 0;
< 22o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=running" class="sref">runningo/a>)
< 23o/a>                oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> |= oa href="+code=PDI_RUNNING" class="sref">PDI_RUNNINGo/a>;
< 24o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=auxdata" class="sref">auxdatao/a>)
< 25o/a>                oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> |= oa href="+code=PDI_AUXDATA" class="sref">PDI_AUXDATAo/a>;
< 26o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=origdev" class="sref">origdevo/a>)
< 27o/a>                oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> |= oa href="+code=PDI_ORIGDEV" class="sref">PDI_ORIGDEVo/a>;
< 28o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=has_vnet_hdr" class="sref">has_vnet_hdro/a>)
< 29o/a>                oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> |= oa href="+code=PDI_VNETHDR" class="sref">PDI_VNETHDRo/a>;
< 30o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_loss" class="sref">tp_losso/a>)
< 31o/a>                oa href="+code=pinfo" class="sref">pinfoo/a>.oa href="+code=pdi_flags" class="sref">pdi_flagso/a> |= oa href="+code=PDI_LOSS" class="sref">PDI_LOSSo/a>;
< 32/oa>
< 33o/a>        return oa href="+code=nla_put" class="sref">nla_puto/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=PACKET_DIAG_INFO" class="sref">PACKET_DIAG_INFOo/a>, sizeof(oa href="+code=pinfo" class="sref">pinfoo/a>), &oa href="+code=pinfo" class="sref">pinfoo/a>);
< 34o/a>}
< 35/oa>
< 36o/a>static intpdiag_put_mclisto/a>(const structpacket_socko/a> *oa href="+code=po" class="sref">poo/a>, structsk_buffo/a> *oa href="+code=nlskb" class="sref">nlskbo/a>)
< 37o/a>{
< 38o/a>        structnlattro/a> *oa href="+code=mca" class="sref">mcao/a>;
< 39o/a>        structpacket_mclisto/a> *oa href="+code=ml" class="sref">mlo/a>;
< 4
< 41o/a>        oa href="+code=mca" class="sref">mcao/a> = oa href="+code=nla_nest_start" class="sref">nla_nest_starto/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=PACKET_DIAG_MCLIST" class="sref">PACKET_DIAG_MCLISTo/a>);
< 42o/a>        if (!oa href="+code=mca" class="sref">mcao/a>)
< 43o/a>                return -oa href="+code=EMSGSIZE" class="sref">EMSGSIZEo/a>;
< 44/oa>
< 45o/a>        oa href="+code=rtnl_lock" class="sref">rtnl_locko/a>();
< 46o/a>        for (oa href="+code=ml" class="sref">mlo/a> = oa href="+code=po" class="sref">poo/a>->oa href="+code=mclist" class="sref">mclisto/a>; oa href="+code=ml" class="sref">mlo/a>; oa href="+code=ml" class="sref">mlo/a> = oa href="+code=ml" class="sref">mlo/a>->oa href="+code=next" class="sref">nexto/a>) {
< 47o/a>                structpacket_diag_mclisto/a> *oa href="+code=dml" class="sref">dmlo/a>;
< 48o/a>
< 49o/a>                oa href="+code=dml" class="sref">dmlo/a> = oa href="+code=nla_reserve_nohdr" class="sref">nla_reserve_nohdro/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, sizeof(*oa href="+code=dml" class="sref">dmlo/a>));
< 50o/a>                if (!oa href="+code=dml" class="sref">dmlo/a>) {
< 51o/a>                        oa href="+code=rtnl_unlock" class="sref">rtnl_unlocko/a>();
< 52o/a>                        oa href="+code=nla_nest_cancel" class="sref">nla_nest_cancelo/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=mca" class="sref">mcao/a>);
< 53o/a>                        return -oa href="+code=EMSGSIZE" class="sref">EMSGSIZEo/a>;
< 54o/a>                }
< 55/oa>
< 56o/a>                oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_index" class="sref">pdmc_indexo/a> = oa href="+code=ml" class="sref">mlo/a>->oa href="+code=ifindex" class="sref">ifindexo/a>;
< 57o/a>                oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_typ=" class="sref">pdmc_typ=o/a> = oa href="+code=ml" class="sref">mlo/a>->oa href="+code=typ=" class="sref">typ=o/a>;
< 58o/a>                oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_alen" class="sref">pdmc_aleno/a> = oa href="+code=ml" class="sref">mlo/a>->oa href="+code=alen" class="sref">aleno/a>;
< 59o/a>                oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_count" class="sref">pdmc_counto/a> = oa href="+code=ml" class="sref">mlo/a>->oa href="+code=count" class="sref">counto/a>;
< 60o/a>                oa href="+code=BUILD_BUG_ON" class="sref">BUILD_BUG_ONo/a>(sizeof(oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_addr" class="sref">pdmc_addro/a>) != sizeof(oa href="+code=ml" class="sref">mlo/a>->oa href="+code=addr" class="sref">addro/a>));
< 61o/a>                oa href="+code=memcpy" class="sref">memcpyo/a>(oa href="+code=dml" class="sref">dmlo/a>->oa href="+code=pdmc_addr" class="sref">pdmc_addro/a>, oa href="+code=ml" class="sref">mlo/a>->oa href="+code=addr" class="sref">addro/a>, sizeof(oa href="+code=ml" class="sref">mlo/a>->oa href="+code=addr" class="sref">addro/a>));
< 62o/a>        }
< 63/oa>
< 64o/a>        oa href="+code=rtnl_unlock" class="sref">rtnl_unlocko/a>();
< 65o/a>        oa href="+code=nla_nest_end" class="sref">nla_nest_endo/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=mca" class="sref">mcao/a>);
< 66/oa>
< 67o/a>        return 0;
< 68o/a>}
< 69/oa>
< 70o/a>static intpdiag_put_ringo/a>(structpacket_ring_buffero/a> *oa href="+code=ring" class="sref">ringo/a>, intvero/a>, intnl_typ=o/a>,
< 71o/a>                structsk_buffo/a> *oa href="+code=nlskb" class="sref">nlskbo/a>)
< 72o/a>{
< 73o/a>        structpacket_diag_ringo/a> oa href="+code=pdr" class="sref">pdro/a>;
< 74/oa>
< 75o/a>        if (!oa href="+code=ring" class="sref">ringo/a>->oa href="+code=pg_vec" class="sref">pg_veco/a> || ((oa href="+code=ver" class="sref">vero/a> > oa href="+code=TPACKET_V2" class="sref">TPACKET_V2o/a>) &&
< 76o/a>                                (oa href="+code=nl_typ=" class="sref">nl_typ=o/a> == oa href="+code=PACKET_DIAG_TX_RING" class="sref">PACKET_DIAG_TX_RINGo/a>)))
< 77o/a>                return 0;
< 78o/a>
< 79o/a>        oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_block_size" class="sref">pdr_block_sizeo/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=pg_vec_pages" class="sref">pg_vec_pageso/a> << oa href="+code=PAGE_SHIFT" class="sref">PAGE_SHIFTo/a>;
< 80o/a>        oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_block_nr" class="sref">pdr_block_nro/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=pg_vec_len" class="sref">pg_vec_leno/a>;
< 81o/a>        oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_fram=_size" class="sref">pdr_fram=_sizeo/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=fram=_size" class="sref">fram=_sizeo/a>;
< 82o/a>        oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_fram=_nr" class="sref">pdr_fram=_nro/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=fram=_max" class="sref">fram=_maxo/a> + 1;
< 83/oa>
< 84o/a>        if (oa href="+code=ver" class="sref">vero/a> > oa href="+code=TPACKET_V2" class="sref">TPACKET_V2o/a>) {
< 85o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_retire_tmo" class="sref">pdr_retire_tmoo/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=prb_bdqc" class="sref">prb_bdqco/a>.oa href="+code=retire_blk_tov" class="sref">retire_blk_tovo/a>;
< 86o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_sizeof_priv" class="sref">pdr_sizeof_privo/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=prb_bdqc" class="sref">prb_bdqco/a>.oa href="+code=blk_sizeof_priv" class="sref">blk_sizeof_privo/a>;
< 87o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_features" class="sref">pdr_featureso/a> = oa href="+code=ring" class="sref">ringo/a>->oa href="+code=prb_bdqc" class="sref">prb_bdqco/a>.oa href="+code=feature_req_word" class="sref">feature_req_wordo/a>;
< 88o/a>        } else {
< 89o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_retire_tmo" class="sref">pdr_retire_tmoo/a> = 0;
< 90o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_sizeof_priv" class="sref">pdr_sizeof_privo/a> = 0;
< 91o/a>                oa href="+code=pdr" class="sref">pdro/a>.oa href="+code=pdr_features" class="sref">pdr_featureso/a> = 0;
< 92o/a>        }
< 93/oa>
< 94o/a>        return oa href="+code=nla_put" class="sref">nla_puto/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=nl_typ=" class="sref">nl_typ=o/a>, sizeof(oa href="+code=pdr" class="sref">pdro/a>), &oa href="+code=pdr" class="sref">pdro/a>);
< 95o/a>}
< 96/oa>
< 97o/a>static intpdiag_put_rings_cfgo/a>(structpacket_socko/a> *oa href="+code=po" class="sref">poo/a>, structsk_buffo/a> *oa href="+code=skb" class="sref">skbo/a>)
< 98o/a>{
< 99o/a>        intreto/a>;
<100/oa>
<101o/a>        oa href="+code=mutex_lock" class="sref">mutex_locko/a>(&oa href="+code=po" class="sref">poo/a>->oa href="+code=pg_vec_lock" class="sref">pg_vec_locko/a>);
<102o/a>        oa href="+code=ret" class="sref">reto/a> = oa href="+code=pdiag_put_ring" class="sref">pdiag_put_ringo/a>(&oa href="+code=po" class="sref">poo/a>->oa href="+code=rx_ring" class="sref">rx_ringo/a>, oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_version" class="sref">tp_versiono/a>,
<103o/a>                        oa href="+code=PACKET_DIAG_RX_RING" class="sref">PACKET_DIAG_RX_RINGo/a>, oa href="+code=skb" class="sref">skbo/a>);
<104o/a>        if (!oa href="+code=ret" class="sref">reto/a>)
<105o/a>                oa href="+code=ret" class="sref">reto/a> = oa href="+code=pdiag_put_ring" class="sref">pdiag_put_ringo/a>(&oa href="+code=po" class="sref">poo/a>->oa href="+code=tx_ring" class="sref">tx_ringo/a>, oa href="+code=po" class="sref">poo/a>->oa href="+code=tp_version" class="sref">tp_versiono/a>,
<106o/a>                                oa href="+code=PACKET_DIAG_TX_RING" class="sref">PACKET_DIAG_TX_RINGo/a>, oa href="+code=skb" class="sref">skbo/a>);
<107o/a>        oa href="+code=mutex_unlock" class="sref">mutex_unlocko/a>(&oa href="+code=po" class="sref">poo/a>->oa href="+code=pg_vec_lock" class="sref">pg_vec_locko/a>);
<108o/a>
<109o/a>        return oa href="+code=ret" class="sref">reto/a>;
<10}
<111o/a>
<112o/a>static intpdiag_put_fanouto/a>(structpacket_socko/a> *oa href="+code=po" class="sref">poo/a>, structsk_buffo/a> *oa href="+code=nlskb" class="sref">nlskbo/a>)
<113o/a>{
<114o/a>        intreto/a> = 0;
<115/oa>
<116o/a>        oa href="+code=mutex_lock" class="sref">mutex_locko/a>(&oa href="+code=fanout_mutex" class="sref">fanout_mutexo/a>);
<117o/a>        if (oa href="+code=po" class="sref">poo/a>->oa href="+code=fanout" class="sref">fanouto/a>) {
<118o/a>                oa href="+code=u32" class="sref">u32/oa>valo/a>;
<119/oa>
<120o/a>                oa href="+code=val" class="sref">valo/a> = (oa href="+code=u32" class="sref">u32/oa>)oa href="+code=po" class="sref">poo/a>->oa href="+code=fanout" class="sref">fanouto/a>->oa href="+code=id" class="sref">ido/a> | ((oa href="+code=u32" class="sref">u32/oa>)oa href="+code=po" class="sref">poo/a>->oa href="+code=fanout" class="sref">fanouto/a>->oa href="+code=typ=" class="sref">typ=o/a> << 16);
<121o/a>                oa href="+code=ret" class="sref">reto/a> = oa href="+code=nla_put_u32" class="sref">nla_put_u32o/a>(oa href="+code=nlskb" class="sref">nlskbo/a>, oa href="+code=PACKET_DIAG_FANOUT" class="sref">PACKET_DIAG_FANOUTo/a>, oa href="+code=val" class="sref">valo/a>);
<122o/a>        }
<123o/a>        oa href="+code=mutex_unlock" class="sref">mutex_unlocko/a>(&oa href="+code=fanout_mutex" class="sref">fanout_mutexo/a>);
<124/oa>
<125o/a>        return oa href="+code=ret" class="sref">reto/a>;
<126o/a>}
<127o/a>
<128o/a>static intsk_diag_fillo/a>(structsocko/a> *oa href="+code=sk" class="sref">sko/a>, structsk_buffo/a> *oa href="+code=skb" class="sref">skbo/a>, structpacket_diag_reqo/a> *oa href="+code=req" class="sref">reqo/a>,
<129o/a>                oa href="+code=u32" class="sref">u32/oa>portido/a>, oa href="+code=u32" class="sref">u32/oa>seqo/a>, oa href="+code=u32" class="sref">u32/oa>flagso/a>, intsk_inoo/a>)
<130o/a>{
<131o/a>        structnlmsghdro/a> *oa href="+code=nlh" class="sref">nlho/a>;
<132o/a>        structpacket_diag_msgo/a> *oa href="+code=rp" class="sref">rpo/a>;
<133o/a>        structpacket_socko/a> *oa href="+code=po" class="sref">poo/a> = oa href="+code=pkt_sk" class="sref">pkt_sko/a>(oa href="+code=sk" class="sref">sko/a>);
<134/oa>
<135o/a>        oa href="+code=nlh" class="sref">nlho/a> = oa href="+code=nlmsg_put" class="sref">nlmsg_puto/a>(oa href="+code=skb" class="sref">skbo/a>, oa href="+code=portid" class="sref">portido/a>, oa href="+code=seq" class="sref">seqo/a>, oa href="+code=SOCK_DIAG_BY_FAMILY" class="sref">SOCK_DIAG_BY_FAMILYo/a>, sizeof(*oa href="+code=rp" class="sref">rpo/a>), oa href="+code=flags" class="sref">flagso/a>);
<136o/a>        if (!oa href="+code=nlh" class="sref">nlho/a>)
<137o/a>                return -oa href="+code=EMSGSIZE" class="sref">EMSGSIZEo/a>;
<138o/a>
<139o/a>        oa href="+code=rp" class="sref">rpo/a> = oa href="+code=nlmsg_data" class="sref">nlmsg_datao/a>(oa href="+code=nlh" class="sref">nlho/a>);
<140o/a>        oa href="+code=rp" class="sref">rpo/a>->oa href="+code=pdiag_family" class="sref">pdiag_familyo/a> = oa href="+code=AF_PACKET" class="sref">AF_PACKETo/a>;
<141o/a>        oa href="+code=rp" class="sref">rpo/a>->oa href="+code=pdiag_typ=" class="sref">pdiag_typ=o/a> = oa href="+code=sk" class="sref">sko/a>->oa href="+code=sk_typ=" class="sref">sk_typ=o/a>;
<142o/a>        oa href="+code=rp" class="sref">rpo/a>->oa href="+code=pdiag_num" class="sref">pdiag_numo/a> = oa href="+code=ntohs" class="sref">ntohso/a>(oa href="+code=po" class="sref">poo/a>->oa href="+code=num" class="sref">numo/a>);
<143o/a>        oa href="+code=rp" class="sref">rpo/a>->oa href="+code=pdiag_ino" class="sref">pdiag_inoo/a> = oa href="+code=sk_ino" class="sref">sk_inoo/a>;
<144o/a>        oa href="+code=sock_diag_save_cooki=" class="sref">sock_diag_save_cooki=o/a>(oa href="+code=sk" class="sref">sko/a>, oa href="+code=rp" class="sref">rpo/a>->oa href="+code=pdiag_cooki=" class="sref">pdiag_cooki=o/a>);
<145/oa>
<146o/a>        if ((oa href="+code=req" class="sref">reqo/a>->oa href="+code=pdiag_show" class="sref">pdiag_showo/a> & oa href="+code=PACKET_SHOW_INFO" class="sref">PACKET_SHOW_INFOo/a>) &&
<147o/a>                        oa href="+code=pdiag_put_info" class="sref">pdiag_put_infoo/a>(oa href="+code=po" class="sref">poo/a>, oa href="+code=skb" class="sref">skbo/a>))
<148o/a>                goto oa href="+code=out_nlmsg_trim" class="sref">out_nlmsg_trimo/a>;
<149/oa>
<150o/a>        if ((oa href="+code=req" class="sref">reqo/a>->oa href="+code=pdiag_show" class="sref">pdiag_showo/a> & oa href="+code=PACKET_SHOW_MCLIST" class="sref">PACKET_SHOW_MCLISTo/a>) &&
<151o/a>                        oa href="+code=pdiag_put_mclist" class="sref">pdiag_put_mclisto/a>(oa href="+code=po" class="sref">poo/a>, oa href="+code=skb" class="sref">skbo/a>))
<152o/a>                goto oa href="+code=out_nlmsg_trim" class="sref">out_nlmsg_trimo/a>;
<153/oa>
<154o/a>        if ((oa href="+code=req" class="sref">reqo/a>->oa href="+code=pdiag_show" class="sref">pdiag_showo/a> & oa href="+code=PACKET_SHOW_RING_CFG" class="sref">PACKET_SHOW_RING_CFGo/a>) &&
<155o/a>                        oa href="+code=pdiag_put_rings_cfg" class="sref">pdiag_put_rings_cfgo/a>(oa href="+code=po" class="sref">poo/a>, oa href="+code=skb" class="sref">skbo/a>))
<156o/a>                goto oa href="+code=out_nlmsg_trim" class="sref">out_nlmsg_trimo/a>;
<157o/a>
<158o/a>        if ((oa href="+code=req" class="sref">reqo/a>->oa href="+code=pdiag_show" class="sref">pdiag_showo/a> & oa href="+code=PACKET_SHOW_FANOUT" class="sref">PACKET_SHOW_FANOUTo/a>) &&
<159o/a>                        oa href="+code=pdiag_put_fanout" class="sref">pdiag_put_fanouto/a>(oa href="+code=po" class="sref">poo/a>, oa href="+code=skb" class="sref">skbo/a>))
<160o/a>                goto oa href="+code=out_nlmsg_trim" class="sref">out_nlmsg_trimo/a>;
<161o/a>
<162o/a>        return oa href="+code=nlmsg_end" class="sref">nlmsg_endo/a>(oa href="+code=skb" class="sref">skbo/a>, oa href="+code=nlh" class="sref">nlho/a>);
<163/oa>
<164o/a>oa href="+code=out_nlmsg_trim" class="sref">out_nlmsg_trimo/a>:
<165o/a>        oa href="+code=nlmsg_cancel" class="sref">nlmsg_cancelo/a>(oa href="+code=skb" class="sref">skbo/a>, oa href="+code=nlh" class="sref">nlho/a>);
<166o/a>        return -oa href="+code=EMSGSIZE" class="sref">EMSGSIZEo/a>;
<167o/a>}
<168o/a>
<169/oa>static intpacket_diag_dumpo/a>(structsk_buffo/a> *oa href="+code=skb" class="sref">skbo/a>, structnetlink_callbacko/a> *oa href="+code=cb" class="sref">cbo/a>)
<170o/a>{
<171o/a>        intnumo/a> = 0, oa href="+code=s_num" class="sref">s_numo/a> = oa href="+code=cb" class="sref">cbo/a>->oa href="+code=args" class="sref">argso/a>[0];
<172o/a>        structpacket_diag_reqo/a> *oa href="+code=req" class="sref">reqo/a>;
<173o/a>        structneto/a> *oa href="+code=net" class="sref">neto/a>;
<174o/a>        structsocko/a> *oa href="+code=sk" class="sref">sko/a>;
<175o/a>        structhlist_nodeo/a> *oa href="+code=node" class="sref">nodeo/a>;
<176/oa>
<177o/a>        oa href="+code=net" class="sref">neto/a> = oa href="+code=sock_net" class="sref">sock_neto/a>(oa href="+code=skb" class="sref">skbo/a>->oa href="+code=sk" class="sref">sko/a>);
<178o/a>        oa href="+code=req" class="sref">reqo/a> = oa href="+code=nlmsg_data" class="sref">nlmsg_datao/a>(oa href="+code=cb" class="sref">cbo/a>->oa href="+code=nlh" class="sref">nlho/a>);
<179/oa>
<180o/a>        oa href="+code=mutex_lock" class="sref">mutex_locko/a>(&oa href="+code=net" class="sref">neto/a>->oa href="+code=packet" class="sref">packeto/a>.oa href="+code=sklist_lock" class="sref">sklist_locko/a>);
<181o/a>        oa href="+code=sk_for_each" class="sref">sk_for_eacho/a>(oa href="+code=sk" class="sref">sko/a>, oa href="+code=node" class="sref">nodeo/a>, &oa href="+code=net" class="sref">neto/a>->oa href="+code=packet" class="sref">packeto/a>.oa href="+code=sklist" class="sref">sklisto/a>) {
<182o/a>                if (!oa href="+code=net_eq" class="sref">net_eqo/a>(oa href="+code=sock_net" class="sref">sock_neto/a>(oa href="+code=sk" class="sref">sko/a>), oa href="+code=net" class="sref">neto/a>))
<183o/a>                        continue;
<184o/a>                if (oa href="+code=num" class="sref">numo/a> < oa href="+code=s_num" class="sref">s_numo/a>)
<185o/a>                        goto oa href="+code=next" class="sref">nexto/a>;
<186/oa>
<187o/a>                if (oa href="+code=sk_diag_fill" class="sref">sk_diag_fillo/a>(oa href="+code=sk" class="sref">sko/a>, oa href="+code=skb" class="sref">skbo/a>, oa href="+code=req" class="sref">reqo/a>, oa href="+code=NETLINK_CB" class="sref">NETLINK_CBo/a>(oa href="+code=cb" class="sref">cbo/a>->oa href="+code=skb" class="sref">skbo/a>).oa href="+code=portid" class="sref">portido/a>,
<188o/a>                                        oa href="+code=cb" class="sref">cbo/a>->oa href="+code=nlh" class="sref">nlho/a>->oa href="+code=nlmsg_seq" class="sref">nlmsg_seqo/a>, oa href="+code=NLM_F_MULTI" class="sref">NLM_F_MULTIo/a>,
<189o/a>                                        oa href="+code=sock_i_ino" class="sref">sock_i_inoo/a>(oa href="+code=sk" class="sref">sko/a>)) < 0)
<190o/a>                        goto oa href="+code=done" class="sref">doneo/a>;
<191o/a>oa href="+code=next" class="sref">nexto/a>:
<192o/a>                oa href="+code=num" class="sref">numo/a>++;
<193o/a>        }
<194o/a>oa href="+code=done" class="sref">doneo/a>:
<195o/a>        oa href="+code=mutex_unlock" class="sref">mutex_unlocko/a>(&oa href="+code=net" class="sref">neto/a>->oa href="+code=packet" class="sref">packeto/a>.oa href="+code=sklist_lock" class="sref">sklist_locko/a>);
<196o/a>        oa href="+code=cb" class="sref">cbo/a>->oa href="+code=args" class="sref">argso/a>[0] = oa href="+code=num" class="sref">numo/a>;
<197o/a>
<198o/a>        return oa href="+code=skb" class="sref">skbo/a>->oa href="+code=len" class="sref">leno/a>;
<199o/a>}
<200/oa>
<201o/a>static intpacket_diag_handler_dumpo/a>(structsk_buffo/a> *oa href="+code=skb" class="sref">skbo/a>, structnlmsghdro/a> *oa href="+code=h" class="sref">ho/a>)
<202o/a>{
<203o/a>        inthdrleno/a> = sizeof(structpacket_diag_reqo/a>);
<204o/a>        structneto/a> *oa href="+code=net" class="sref">neto/a> = oa href="+code=sock_net" class="sref">sock_neto/a>(oa href="+code=skb" class="sref">skbo/a>->oa href="+code=sk" class="sref">sko/a>);
<205o/a>        structpacket_diag_reqo/a> *oa href="+code=req" class="sref">reqo/a>;
<206/oa>
<207o/a>        if (oa href="+code=nlmsg_len" class="sref">nlmsg_leno/a>(oa href="+code=h" class="sref">ho/a>) < oa href="+code=hdrlen" class="sref">hdrleno/a>)
<208o/a>                return -oa href="+code=EINVAL" class="sref">EINVALo/a>;
<209/oa>
<210o/a>        oa href="+code=req" class="sref">reqo/a> = oa href="+code=nlmsg_data" class="sref">nlmsg_datao/a>(oa href="+code=h" class="sref">ho/a>);
<211o/a>        ospan class="comment">/* Make it possible to support protocol filtering later */
<212o/a>        if (oa href="+code=req" class="sref">reqo/a>->oa href="+code=sdiag_protocol" class="sref">sdiag_protocolo/a>)
<213o/a>                return -oa href="+code=EINVAL" class="sref">EINVALo/a>;
<214/oa>
<215o/a>        if (oa href="+code=h" class="sref">ho/a>->oa href="+code=nlmsg_flags" class="sref">nlmsg_flagso/a> & oa href="+code=NLM_F_DUMP" class="sref">NLM_F_DUMPo/a>) {
<216o/a>                structnetlink_dump_controlo/a> oa href="+code=c" class="sref">co/a> = {
<217o/a>                        .oa href="+code=dump" class="sref">dumpo/a> = oa href="+code=packet_diag_dump" class="sref">packet_diag_dumpo/a>,
<218o/a>                };
<219o/a>                return oa href="+code=netlink_dump_start" class="sref">netlink_dump_starto/a>(oa href="+code=net" class="sref">neto/a>->oa href="+code=diag_nlsk" class="sref">diag_nlsko/a>, oa href="+code=skb" class="sref">skbo/a>, oa href="+code=h" class="sref">ho/a>, &oa href="+code=c" class="sref">co/a>);
<220o/a>        } else
<221o/a>                return -oa href="+code=EOPNOTSUPP" class="sref">EOPNOTSUPPo/a>;
<222o/a>}
<223/oa>
<224/oa>static const structsock_diag_handlero/a> oa href="+code=packet_diag_handler" class="sref">packet_diag_handlero/a> = {
<225o/a>        .oa href="+code=family" class="sref">familyo/a> = oa href="+code=AF_PACKET" class="sref">AF_PACKETo/a>,
<226o/a>        .oa href="+code=dump" class="sref">dumpo/a> = oa href="+code=packet_diag_handler_dump" class="sref">packet_diag_handler_dumpo/a>,
<227o/a>};
<228o/a>
<229/oa>static int__inito/a> oa href="+code=packet_diag_init" class="sref">packet_diag_inito/a>(void)
<230o/a>{
<231o/a>        return oa href="+code=sock_diag_register" class="sref">sock_diag_registero/a>(&oa href="+code=packet_diag_handler" class="sref">packet_diag_handlero/a>);
<232o/a>}
<233/oa>
<234/oa>static void__exito/a> oa href="+code=packet_diag_exit" class="sref">packet_diag_exito/a>(void)
<235o/a>{
<236o/a>        oa href="+code=sock_diag_unregister" class="sref">sock_diag_unregistero/a>(&oa href="+code=packet_diag_handler" class="sref">packet_diag_handlero/a>);
<237o/a>}
<238o/a>
<239o/a>oa href="+code=module_init" class="sref">module_inito/a>(oa href="+code=packet_diag_init" class="sref">packet_diag_inito/a>);
<240o/a>oa href="+code=module_exit" class="sref">module_exito/a>(oa href="+code=packet_diag_exit" class="sref">packet_diag_exito/a>);
<241o/a>oa href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEo/a>(ospan class="string">"GPL");
<242o/a>oa href="+code=MODULE_ALIAS_NET_PF_PROTO_TYPE" class="sref">MODULE_ALIAS_NET_PF_PROTO_TYPEo/a>(oa href="+code=PF_NETLINK" class="sref">PF_NETLINKo/a>, oa href="+code=NETLINK_SOCK_DIAG" class="sref">NETLINK_SOCK_DIAGo/a>, 17 ospan class="comment">/* AF_PACKET */);
<243o/a>