@@ -1832,6 +1832,66 @@ static int method_learn_endpoint(sd_bus_message *call, void *data, sd_bus_error
1832
1832
return rc ;
1833
1833
}
1834
1834
1835
+ static int method_notify_discovery (sd_bus_message * call , void * data ,
1836
+ sd_bus_error * berr )
1837
+ {
1838
+ int rc ;
1839
+ const char * ifname = NULL ;
1840
+ dest_phys desti = { 0 }, * dest = & desti ;
1841
+ ctx * ctx = data ;
1842
+ struct mctp_ctrl_cmd_discovery_notify req = { 0 };
1843
+ struct mctp_ctrl_resp_discovery_notify * resp ;
1844
+ uint8_t * buf ;
1845
+ size_t buf_size ;
1846
+ struct sockaddr_mctp_ext resp_addr ;
1847
+
1848
+ rc = sd_bus_message_read (call , "s" , & ifname );
1849
+ if (rc < 0 )
1850
+ goto err ;
1851
+
1852
+ dest -> hwaddr_len = 2 ;
1853
+ dest -> ifindex = mctp_nl_ifindex_byname (ctx -> nl , ifname );
1854
+ if (dest -> ifindex <= 0 )
1855
+ return sd_bus_error_setf (berr , SD_BUS_ERROR_INVALID_ARGS ,
1856
+ "Unknown MCTP ifname '%s'" , ifname );
1857
+
1858
+ rc = validate_dest_phys (ctx , dest );
1859
+ if (rc < 0 )
1860
+ return sd_bus_error_setf (berr , SD_BUS_ERROR_INVALID_ARGS ,
1861
+ "Bad physaddr" );
1862
+
1863
+ req .ctrl_hdr .command_code = MCTP_CTRL_CMD_DISCOVERY_NOTIFY ;
1864
+ req .ctrl_hdr .rq_dgram_inst = RQDI_REQ ;
1865
+
1866
+ rc = endpoint_query_phys (ctx , dest , MCTP_CTRL_HDR_MSG_TYPE , & req ,
1867
+ sizeof (req ), & buf , & buf_size , & resp_addr );
1868
+ if (rc < 0 )
1869
+ goto free_buf ;
1870
+
1871
+ if (buf_size != sizeof (* resp )) {
1872
+ warnx ("%s: wrong reply length %zu bytes. dest %s" , __func__ ,
1873
+ buf_size , dest_phys_tostr (dest ));
1874
+ rc = - ENOMSG ;
1875
+ goto free_buf ;
1876
+ }
1877
+ resp = (void * )buf ;
1878
+
1879
+ if (resp -> completion_code != 0 ) {
1880
+ // TODO: make this a debug message?
1881
+ warnx ("Failure completion code 0x%02x from %s" ,
1882
+ resp -> completion_code , dest_phys_tostr (dest ));
1883
+ rc = - ECONNREFUSED ;
1884
+ goto free_buf ;
1885
+ }
1886
+ free (buf );
1887
+ return sd_bus_reply_method_return (call , "" );
1888
+ free_buf :
1889
+ free (buf );
1890
+ err :
1891
+ set_berr (ctx , rc , berr );
1892
+ return rc ;
1893
+ }
1894
+
1835
1895
// Query various properties of a peer.
1836
1896
// To be called when a new peer is discovered/assigned, once an EID is known
1837
1897
// and routable.
@@ -2274,6 +2334,14 @@ static const sd_bus_vtable bus_mctpd_vtable[] = {
2274
2334
SD_BUS_PARAM (found ),
2275
2335
method_learn_endpoint ,
2276
2336
0 ),
2337
+
2338
+ SD_BUS_METHOD_WITH_NAMES ("NotifyDiscovery" ,
2339
+ "s" ,
2340
+ SD_BUS_PARAM (ifname ),
2341
+ "" ,,
2342
+ method_notify_discovery ,
2343
+ 0 ),
2344
+
2277
2345
SD_BUS_VTABLE_END ,
2278
2346
2279
2347
};
0 commit comments